2015-12-07 10 views
5

Sto sviluppando un sistema che utilizza Zend Framework 2 e girare la chiave config_cache_enabled in application.config.php chiusure ricevuto un errore:Zend Framework 2 - sostituire le chiusure di fabbrica in Module.php

Fatal error: Call to undefined method set_state Closure::__()in /home/user/www/myProject.com/data/cache/module-config-cache.app_config.php online 185.

Cercando meglio ho scoperto che non era raccomandato di utilizzare chiusure in Module.php perché questo è stato ciò che ha causato questo errore nella cache di configurazione, a pensarci ho letto alcuni post che raccomandano di sostituire le chiusure di fabbrica.

Questo è quello che ho fatto, ho creato una fabbrica e sostituito il DI in TableGateway in Module.php da una fabbrica e ha funzionato perfettamente, la mia domanda è che non so se è OK come ho fatto io.

Qualcuno potrebbe dirmi se questo è il modo corretto di risolvere il problema?

application.config.php - prima:

'Admin\Model\PedidosTable' => function($sm) { 
    $tableGateway = $sm->get('PedidosTableGateway'); 
    $table = new PedidosTable($tableGateway); 
    return $table; 
}, 
'PedidosTableGateway' => function($sm) { 
    $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
    $resultSetPrototype = new ResultSet(); 
    $resultSetPrototype->setArrayObjectPrototype(new Pedidos()); 
    return new TableGateway('pedidos', $dbAdapter, null, $resultSetPrototype); 
}, 

application.config.php - dopo:

'factories' => array(
    'PedidosTable' => 'Admin\Service\PedidosTableFactory', 
), 
'aliases' => array(
    'Admin\Model\PedidosTable' => 'PedidosTable', 
), 

TableFactory:

namespace Admin\Service; 

use Zend\ServiceManager\FactoryInterface; 
use Zend\ServiceManager\ServiceLocatorInterface; 

use Zend\Db\ResultSet\ResultSet; 
use Zend\Db\TableGateway\TableGateway; 

use Admin\Model\Pedidos; 
use Admin\Model\PedidosTable; 

class PedidosTableFactory implements FactoryInterface 
{ 
    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     $dbAdapter = $serviceLocator->get('Zend\Db\Adapter\Adapter'); 

     $resultSetPrototype = new ResultSet(); 
     $resultSetPrototype->setArrayObjectPrototype(new Pedidos()); 

     $tableGateway = new TableGateway('pedidos', $dbAdapter, null, $resultSetPrototype); 
     $table = new PedidosTable($tableGateway); 

     return $table; 
    } 
} 
+1

Questa approvazione è corretta, sì. Tuttavia, ti consiglio di passare a usung il metodo magico __invoke. In seguito posterò un esempio di codice con una spiegazione. – Stanimir

+0

Sì, va bene ... – tasmaniski

risposta

Problemi correlati