Zend Framework 2 - 在Module.php中替换工厂的闭包

时间:2015-12-07 02:13:16

标签: php zend-framework2

我正在使用Zend Framework 2开发一个系统,并在config_cache_enabled闭包中转动键application.config.php收到错误:

  

致命错误:在/home/user/www/myProject.com/data/cache/module-config-cache.app_config.php online 185中调用未定义的方法set_state Closure :: __()。

搜索得更好我发现不建议在Module.php中使用闭包,因为这是导致配置缓存中出现此错误的原因,考虑到这一点我读了一些建议按工厂替换闭包的帖子。

我做了什么,我创建了一个工厂,并在Module.php由工厂取代TableGateway中的DI并且工作得很好,我的问题是我不知道它是否可以我的方式。

有人能告诉我这是否是解决问题的正确方法?

application.config.php - 之前:

'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 - after:

'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 个答案:

答案 0 :(得分:1)

是的,这是做工厂的方法。您可以在SO中查看示例,例如ZF3 MVC Zend\Authentication as a Service Factory,当然还有Zend“In-Depth”教程:https://docs.zendframework.com/tutorials/in-depth-guide/models-and-servicemanager/#writing-a-factory-class。即使本教程已经为ZF3编写,这部分也与最新的ZF2版本完全兼容。