在Module.php中配置表的最佳方法 - Zend 2

时间:2015-06-11 18:00:52

标签: php zend-framework2

我正在使用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的好方法吗?是一个很好的实践?

感谢。

1 个答案:

答案 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有两个作业:检查它可以创建服务,并实际创建它。