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;
}
}
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
Sì, va bene ... – tasmaniski