2016-04-07 3 views
1

У меня есть следующий метод в моем module.phpZend Db TableGateway - мой конфиг в database.local.php Zend Framework 2

public function getServiceConfig() 
{ 
    return array(
     'factories' => array(
      'Application\Model\VehiclesTable' => function($sm) { 
       $tableGateway = $sm->get('VehiclesTableGateway'); 
       $table = new VehiclesTable($tableGateway); 
       return $table; 
      }, 
      'ApplicationTableGateway' => function ($sm) { 
       $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
       $resultSetPrototype = new ResultSet(); 
       $resultSetPrototype->setArrayObjectPrototype(new Vehicles()); 
       return new TableGateway('vehicles', $dbAdapter, null, $resultSetPrototype); 
      }, 
     ), 
    ); 
} 

Но я получаю эту ошибку:

Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for VehiclesTableGateway 

Мой config/autoload/database.local.php файл выглядит следующим образом:

$dbParams = array(
    'database' => 'zf-skeleton', 
    'username' => 'root', 
    'password' => 'root', 
    'hostname' => 'localhost', 
    // buffer_results - only for mysqli buffered queries, skip for others 
    'options' => array('buffer_results' => true) 
); 

return array(
    'service_manager' => array(
     'factories' => array(
      'Zend\Db\Adapter\Adapter' => function ($sm) use ($dbParams) { 
       $adapter = new BjyProfiler\Db\Adapter\ProfilingAdapter(array(
        'driver' => 'pdo', 
        'dsn'  => 'mysql:dbname='.$dbParams['database'].';host='.$dbParams['hostname'], 
        'database' => $dbParams['database'], 
        'username' => $dbParams['username'], 
        'password' => $dbParams['password'], 
        'hostname' => $dbParams['hostname'], 
       )); 

       if (php_sapi_name() == 'cli') { 
        $logger = new Zend\Log\Logger(); 
        // write queries profiling info to stdout in CLI mode 
        $writer = new Zend\Log\Writer\Stream('php://output'); 
        $logger->addWriter($writer, Zend\Log\Logger::DEBUG); 
        $adapter->setProfiler(new BjyProfiler\Db\Profiler\LoggingProfiler($logger)); 
       } else { 
        $adapter->setProfiler(new BjyProfiler\Db\Profiler\Profiler()); 
       } 
       if (isset($dbParams['options']) && is_array($dbParams['options'])) { 
        $options = $dbParams['options']; 
       } else { 
        $options = array(); 
       } 
       $adapter->injectProfilingStatementPrototype($options); 
       return $adapter; 
      }, 
     ), 
    ), 
); 

Я хотел бы, чтобы мой database.local.php файл, как это, но все равно в состоянии создать таблицу шлюза для моего модуля, поэтому я не думаю, что мне нужно:

 'factories' => array(
     'Application\Model\VehiclesTable' => function($sm) { 
      $tableGateway = $sm->get('VehiclesTableGateway'); 
      $table = new VehiclesTable($tableGateway); 
      return $table; 
     }, 

Может кто-нибудь мне точку в правильном направлении, чтобы, как это сделать?

ответ

2

У вас нет файла 'VehiclesTableGateway' в файле конфигурации.

2 решения.

Если вы хотите сослаться на 'ApplicationTableGateway', то смените ссылку 'VehiclesTableGateway' на 'ApplicationTableGateway'.

Если вы хотите конкретное tableGateway вы должны обновить конфигурацию, как это:

public function getServiceConfig() 
{ 
    return array(
     'factories' => array(
      'Application\Model\VehiclesTable' => function($sm) { 
       $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
       $resultSetPrototype = new ResultSet(); 
       $resultSetPrototype->setArrayObjectPrototype(new Vehicles()); 
       $tableGateway = new TableGateway('vehicles', $dbAdapter, null, $resultSetPrototype); 
       $table = new VehiclesTable($tableGateway); 
       return $table; 
      }, 
      'ApplicationTableGateway' => function ($sm) { 
       $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
       $resultSetPrototype = new ResultSet(); 
       $resultSetPrototype->setArrayObjectPrototype(new Vehicles()); 
       return new TableGateway('vehicles', $dbAdapter, null, $resultSetPrototype); 
      }, 
     ), 
    ); 
} 

Я не совсем уверен, что о вашем 'ApplicationTableGateway'. Кажется странным иметь «глобальный» tableGateway.

Кроме того, я бы посоветовал удалить эту анонимную функцию в файле конфигурации и заменить ее на класс реальных фабрик. Это более эффективно при загрузке страницы, поскольку анонимная функция предотвращает создание zend-структуры при создании кэшированного файла конфигурации (но это не обязательно, чтобы заставить работу работать).

Надеюсь, что это помогло,

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