php - 编辑 : Class Zend\Db\Adapter\Adapter not found

标签 php mysql zend-framework2

我有一个简单的表单,在提交重定向到 AuthController 内的 processAction 之后,在这个 action 中我想要创建一个简单的 table bar

已编辑:

引用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 未创建并显示如下错误

Fatal error: Class 'Blog\Controller\Zend\Db\Adapter\Adapter' not found in /var/www/zend2/module/Blog/src/Blog/Controller/AuthController.php on line 110

如果我打印

echo $sql->getSqlStringForSqlObject($table);

查询打印成这样

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

但是没有 table 。

错误 出现在以下代码行中,因为它无法识别 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

最佳答案

我认为您正在尝试访问不存在的服务。您可以尝试创建一个服务工厂:

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 .

关于php - 编辑 : Class Zend\Db\Adapter\Adapter not found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36261056/

相关文章:

php - ZF2 : Add a Login widget in the template

php - 使用 HTML 表单和 PHP 在 MySQL 数据库中存储电子邮件

php - 如何禁用/更改 Prestashop 中的主页

php - RequestTimeout 使用 PHP 上传到 S3

mysql - 如何管理与数据库的连接?

forms - 如何在 Controller 中禁用 Zend Framework 2 中的字段过滤器?

php - 从三个表中选择 SQL 和 PHP

mysql - 寻求有关加入查询的帮助

mysql - 有时 MySQL 会停止使用正确的索引

php - Smarty 3 如何与 Zend Framework 2 一起使用?