编辑:找不到类Zend \ Db \ Adapter \ Adapter

时间:2016-03-28 11:06:51

标签: php mysql zend-framework2

我有一个简单的form,在processAction内向AuthController提交重定向后,action我想创建一个简单的table

编辑:

参考Zend framerwork DB DDL update,我在下面的代码中进行了一些修改

AuthController.php

<?php

namespace Blog\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Zend\Debug\Debug;
use Blog\Form\LoginForm;
use Zend\Authentication\AuthenticationService;
use Zend\Db\Adapter\AdapterInterface;
use Zend\Db\Sql\Sql;
use Zend\Db\Sql\Ddl;
use Zend\Db\Sql\Ddl\Column;
use Zend\Db\Sql\Insert;
use Zend\Authentication\Adapter\DbTable as DbTableAuthAdapter;

class AuthController extends AbstractActionController
{    
    protected $adapter;
    public function getAdapter()
    {
        if (!$this->adapter) {
            $sm = $this->getServiceLocator();
            $this->adapter = $sm->get('Zend\Db\Adapter\Adapter');
        }
        return $this->adapter;
    }

    public function indexAction()
    {
        return new ViewModel();
    }

    public function processAction()
    {

       $DB = new \Zend\Db\Adapter\Adapter(array(
        'driver' => 'Pdo',
        'database' => 'blog',
        'username' => 'root',
        'password' => 'mysql'
       ));


        $this->adapter = $this->getAdapter();
        $sql = new Sql($this->adapter);
        $table = new Ddl\CreateTable('bar');
        $table->addColumn(new Column\Integer('id'));
        $table->addColumn(new Column\Varchar('name', 255));
        $table->setTable('bar'); 

        $results = $this->adapter->query($sql->getSqlStringForSqlObject($table),  $this->adapter ::QUERY_MODE_EXECUTE);
        return new ViewModel();
    }
}

global.php:

return array(
'db' => array(
    'driver'         => 'Pdo',
    'dsn'            => 'mysql:dbname=blog;host=localhost',
    'driver_options' => array(
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
    ),
),
'service_manager' => array(
    'factories' => array(
        'Zend\Db\Adapter\Adapter'
        => 'Zend\Db\Adapter\AdapterServiceFactory',
     ),
  ),
);

Module.php

  <?php
  namespace Blog;

  use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
  use Zend\ModuleManager\Feature\ConfigProviderInterface;

 class Module implements  AutoloaderProviderInterface,ConfigProviderInterface
  {

  public function getAutoloaderConfig()
  {
    return array(
        'Zend\Loader\StandardAutoloader' => array(
            'namespaces' => array(
                __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
            ),
        ),
    );
}


public function getConfig()
{
    return include __DIR__ . '/config/module.config.php';
}

public function getServiceConfig()
{
    return array(
        'factories' =>array( 
            'Zend\Db\Adapter\Adapter' => function ($sm) {
                 $config = $sm->get('Config');
                 return new \Zend\Db\Adapter\Adapter($config['db']);

         }
       )
    );
  }
}

问题:(更新)

table bar 未创建,并显示错误,如

  

致命错误:找不到类'Blog \ Controller \ Zend \ Db \ Adapter \ Adapter'   在/var/www/zend2/module/Blog/src/Blog/Controller/AuthController.php中   在线110

如果我打印

echo $sql->getSqlStringForSqlObject($table);

查询打印如下

CREATE TABLE `bar` ( `id` INTEGER NOT NULL, `name` VARCHAR(255) NOT NULL )

但桌子不存在。

错误出现在下面的代码行中,因为它无法识别adapter

 $results = $this->adapter->query($sql->getSqlStringForSqlObject($table),  $this->adapter ::QUERY_MODE_EXECUTE);

但是以这种方式工作:

$results = $this->adapter->query($sql->getSqlStringForSqlObject($table),  $DB ::QUERY_MODE_EXECUTE);

我正在使用Zend 2.4

2 个答案:

答案 0 :(得分:1)

我认为您正在尝试访问非现有服务。您可以尝试创建服务工厂:

<强>的config.php

<?php
return [
    'db' => [
        'driver' => 'Pdo',
        'database' => 'blog',
        'username' => 'root',
        'password' => 'mysql'
    ]
];

<强> Module.php

<?php
class Module 
{
    public function getServiceConfig()
    {
        return [
            'factories' => [
                'Zend\Db\Adapter\Adapter' =>  => function ($sm) {
                     $config = $sm->get('Config');
                     return new \Zend\Db\Adapter\Adapter($config['db']);

                },
            ],
        ];
    }
}

然后,您可以使用服务管理器访问该服务:

<强> AuthController.php

class AuthController extends AbstractActionController 
{
    public function getAdapter()
    {
       if (!$this->adapter) {
          $sm = $this->getServiceLocator();
          $this->adapter = $sm->get('Zend\Db\Adapter\Adapter');
       }
       return $this->adapter;
    }

    public function processAction()
    {
        $this->adapter = $this->getAdapter();
        $sql = new Sql($this->adapter);

        // other stuff here
    }
}

您可以找到更多示例herehere

答案 1 :(得分:0)

对于ZF2中的初学者,如果您没有正确地实例化课程query execute,则Zend\Db\Adapter\Adapter将无效。

我更正了

 $DB = new \Zend\Db\Adapter\Adapter(array(
    'driver' => 'Pdo',
    'database' => 'blog',
    'username' => 'root',
    'password' => 'mysql'
   ));

也低于代码

$results = $this->adapter->query($sql->getSqlStringForSqlObject($table),  $DB ::QUERY_MODE_EXECUTE);

参考Fatal error : class not found in Zend framework 2

注意:我仍然无法理解为什么$this->adapter = $this->getAdapter();无法工作而不是$DB。任何提示都将受到赞赏。