2016-03-28 3 views
1

У меня есть простой form, который после подачи переадресовывает на processAction внутри AuthController и в этом action я хочу, чтобы создать простой tableбар.EDIT: Класс Zend Db адаптер адаптер не найден

отредактированы:

Ссылаясь на 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бар не создается и показывает ошибку, как

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) 

но стол не был там.

Ошибка происходит ниже строки кода, как это не в состоянии идентифицировать 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

+0

Вы уверены, что пользователь БД имеет права на 'CREATE' объекты? – mitkosoft

+0

Да, все прелести. – Hiranya

ответ

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); 

Ref Fatal error : class not found in Zend framework 2

Примечание: я до сих пор не понимаю, почему $this->adapter = $this->getAdapter(); не работает вместо $DB. Любой намек будет быть оцененным.

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 
    } 
} 

Вы можете найти больше примеров here и here.

+0

Привет, я уже делал это на 'global.php', поэтому нам нужен отдельный менеджер сервисов для' zend \ db \ adapter \ adapter'. Pls видит мое редактирование. – Hiranya

+0

В модуле.php вам нужен диспетчер служб, чтобы получить конфигурацию и вставить зависимости в конструкторе адаптера. –

+0

Я изменил этот запрос '$ this-> adapter-> ($ sql-> getSqlStringForSqlObject ($ table), $ this-> adapter :: QUERY_MODE_EXECUTE)', все еще получая синтаксическую ошибку. 'unidetifiend adapter' – Hiranya

Смежные вопросы