我正在使用zend2教程中的默认示例在module.php中设置我的表,但是在我的项目中我有很多表,所以我的module.php太大了。
这是我的默认配置示例1:
'UsersTableGateway' => function ($sm) {
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new Users());
return new TableGateway('users', $dbAdapter, null, $resultSetPrototype);
},
'Application\Model\UsersTable'=>function ($sm){
$tableGateway = $sm->get('UsersTableGateway');
return new UsersTable($tableGateway);
},
我的问题是,如果我将UserTableGateway配置放入Application \ Model \ UserTable,如下例所示:
'Application\Model\UsersTable'=>function ($sm){
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new Users());
$tableGateway = new TableGateway('users', $dbAdapter, null, $resultSetPrototype);
return new UsersTable($tableGateway);
},
此方法对我有用,我的项目没有任何变化,不显示任何错误,项目继续正常工作。
那么,本教程中的方法是在separete数组上设置UserTableGateway?
如果我改变默认配置(上面的例子1)在Application \ Model \ Table中设置all(如上面的例子2),是一个配置tablesGateway的好方法吗?是一个很好的实践?
感谢。
答案 0 :(得分:3)
简而言之,你做得很好,但我认为这不是最好的做法。
在module.php
中配置服务并不是最好的习惯,如你所发现的那样很快就会变得非常混乱。更好的方向是使用ZF2的更多功能来帮助您摆脱困境。
让我们远离关闭。如果您的模型需要其他依赖项,则最好创建factories
并将Application\Model\UsersTable
指向工厂类而不是闭包。例如,在module.config.php
:
'service_manager' => array(
'factories' => array(
'Application\Model\UsersTable' => 'Application\Model\Factory\UsersTableFactory'
)
)
Application\Model\Factory\UsersTableFactory
看起来大致如下:
namespace Application\Model\Factory;
class UsersTableFactory
{
public function __invoke(ServiceLocatorInterface $sl)
{
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new Users());
$tableGateway = new TableGateway('users', $dbAdapter, null, $resultSetPrototype);
return new UsersTable($tableGateway);
}
}
对于您的所有型号以及您可能拥有的任何其他服务,可以重复此操作。
需要考虑的事项
你提到你有很多桌子,我猜很多模特。这意味着许多工厂都有很多重复的代码,yuk。
这是我们可以使用abstract factories的地方。假设您的模型构造非常相似,我们可能只有一个可以创建所有模型的工厂。
我不会写一些这样的例子,因为它们会变得复杂,如果你自己调查会更好。简而言之,abstract factory
有两个作业:检查它可以创建服务,并实际创建它。