Zajmuję się tworzeniem systemu przy użyciu Zend Framework 2 i przekręcić kluczyk config_cache_enabled
w application.config.php
zamknięcia otrzymał błąd:Zend Framework 2 - wymienić zamknięcia fabrycznie w 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.
Szukanie lepiej znalazłem nie było zalecane jest używanie zamknięć w Module.php
, ponieważ to właśnie spowodowało ten błąd w pamięci podręcznej konfiguracji, myśląc o tym, przeczytałem kilka postów, które zalecają zastąpienie zamknięć fabrycznie.
To właśnie zrobiłem, stworzyłem fabrykę i zastępuję DI w TableGateway w Module.php
przez Fabrykę i działałem doskonale, moje pytanie brzmi: nie wiem, czy to jest w porządku tak jak ja.
Czy ktoś mógłby mi powiedzieć, czy jest to właściwy sposób rozwiązania problemu?
application.config.php
- przed:
'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 - po:
'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;
}
}
Ten approuch jest poprawny, tak. Zalecam jednak, abyś przełączył się na metodę magiczną __invoke. Opublikuję próbkę kodu później z wyjaśnieniem. – Stanimir
Tak, jest OK ... – tasmaniski