Zend framework2 ZF2 SM,我真的需要吗

Zend framework2 ZF2 SM,我真的需要吗,zend-framework2,Zend Framework2,我目前有一个ZF2模块,需要访问三个数据库表。没有其他模块需要访问这些表 因此,我的问题是(请也考虑性能),我是否真的应该像以前那样将工厂添加到Module.php中: /** * Service Configuration * * @return array */ public function getServiceConfig() { return array( 'invokables' => array( 'Login\Serv

我目前有一个ZF2模块,需要访问三个数据库表。没有其他模块需要访问这些表

因此,我的问题是(请也考虑性能),我是否真的应该像以前那样将工厂添加到Module.php中:

/**
 * Service Configuration
 *
 * @return array
 */
public function getServiceConfig()
{
    return array(
        'invokables' => array(
            'Login\Service\Authenticate' => 'Login\Service\Authenticate',
            'Login\Service\Oauth'        => 'Login\Service\Oauth'
        ),
        'factories'  => array(
            'Login\Form\Login'                   => function () {
                $form = new Form\Login();
                $form->setInputFilter(new FormFilter\Login());

                return $form;
            },
            'Login\Model\GaclEmployeePermission' => function ($sm) {
                return new Model\GaclEmployeePermission($sm->get('OTWebsoft\Db\Adapter\Master'), $sm->get('OTWebsoft\Db\Adapter\Slave'));
            },
            'Login\Model\Passport'               => function ($sm) {
                return new Model\Passport($sm->get('OTWebsoft\Db\Adapter\Master'), $sm->get('OTWebsoft\Db\Adapter\Slave'));
            },
            'Login\Model\PassportLog'            => function ($sm) {
                return new Model\PassportLog($sm->get('OTWebsoft\Db\Adapter\Master'), $sm->get('OTWebsoft\Db\Adapter\Slave'));
            }
        )
    );
}
然后我有一个抽象类,它可以:

/**
 * Table GaclEmployeePermission
 *
 * @return \Login\Model\GaclEmployeePermission
 */
protected function getTableGaclEmployeePermission()
{
    return $this->getServiceManager()->get('Login\Model\GaclEmployeePermission');
}
或者我应该从Module.php中删除配置,然后在我的抽象类中执行以下操作:

/**
 * Table GaclEmployeePermission
 *
 * @return \Login\Model\GaclEmployeePermission
 */
protected function getTableGaclEmployeePermission()
{
    return new GaclEmployeePermission($this->getMasterAdapter(), $this->getSlaveAdapter());
}

两种方法的效果似乎完全相同。但是说到性能,你会推荐哪一种?请记住,这三个表不需要从任何其他模块访问,只需要从这个模块访问。

使用服务管理器或依赖项注入容器的主要原因是而不是其他服务可以访问它。主要原因是应用依赖注入,从而应用控制反转。这简化了对象的使用,允许您轻松地交换实现,增强了测试类的能力,并使类对包含的逻辑负责,而不影响其依赖性

在这两个示例中,您实际上都使用了服务管理器,但它仍然是相同的模式:类(在
getTableGaclEmployeePermission()
中)决定要获取什么。无论是通过服务管理器还是通过直接实例化,这实际上并不重要

根据您的模块配置,我无法掌握您在应用程序中拥有的层以及它们的功能(尤其是抽象类的功能),但一般来说,您应该注入它的依赖项:

abstract class SomeAbstract
{
    protected $permission;

    public function __construct(Permission $permission)
    {
        $this->permission = $permission;
    }
}

class Permission
{
    protected $master;
    protected $slave;

    public function __construct(TableAdapter $master, TableAdapter $slave = null)
    {
        $this->master = $master;

        if (null !== $slave) {
            $this->slave = $slave;
        }
    }
}
然后,创建service manager配置,为您定义的服务注入这些依赖项:

'factories' => array(
    'Login\Model\Permission' => function ($sl) {
        $master = $sl->get('My\MasterAdapter');

        $slave  = null;
        if ($some_flag) {
            $slave = $sl->get('My\SlaveAdapter');
        }

        return new Login\Model\Permission($master, $slave);
    },

    'Login\Some\ConcreteImplementation' => function ($sl) {
        $permission = $sl->get('Login\Model\Permission');

        return new Login\Some\ConcreteImplementation($permission);
    }
),

然后您请求
Login\Some\ConcreteImplementation
,所有注入(
$master
$slave
$permission
)都为您完成,启用上述所有好处。

使用服务管理器或依赖项注入容器的主要原因是而不是其他服务可以访问它。主要原因是应用依赖注入,从而应用控制反转。这简化了对象的使用,允许您轻松地交换实现,增强了测试类的能力,并使类对包含的逻辑负责,而不影响其依赖性

在这两个示例中,您实际上都使用了服务管理器,但它仍然是相同的模式:类(在
getTableGaclEmployeePermission()
中)决定要获取什么。无论是通过服务管理器还是通过直接实例化,这实际上并不重要

根据您的模块配置,我无法掌握您在应用程序中拥有的层以及它们的功能(尤其是抽象类的功能),但一般来说,您应该注入它的依赖项:

abstract class SomeAbstract
{
    protected $permission;

    public function __construct(Permission $permission)
    {
        $this->permission = $permission;
    }
}

class Permission
{
    protected $master;
    protected $slave;

    public function __construct(TableAdapter $master, TableAdapter $slave = null)
    {
        $this->master = $master;

        if (null !== $slave) {
            $this->slave = $slave;
        }
    }
}
然后,创建service manager配置,为您定义的服务注入这些依赖项:

'factories' => array(
    'Login\Model\Permission' => function ($sl) {
        $master = $sl->get('My\MasterAdapter');

        $slave  = null;
        if ($some_flag) {
            $slave = $sl->get('My\SlaveAdapter');
        }

        return new Login\Model\Permission($master, $slave);
    },

    'Login\Some\ConcreteImplementation' => function ($sl) {
        $permission = $sl->get('Login\Model\Permission');

        return new Login\Some\ConcreteImplementation($permission);
    }
),

然后您请求
Login\Some\ConcreteImplementation
,所有注入(
$master
$slave
$permission
)都为您完成,启用上述所有优点。

我从模块->控制器->服务层开始,服务层扩展了一个抽象类,它实现了SM和其他功能。每个模块有几个服务层,可以将代码进一步拆分,并使其易于识别(即:添加/编辑/删除)。这样,每一层都可以扩展抽象类,而不必每次都向每一层添加所需的功能。我认为,由于这个特定模块是唯一调用这些表的模块,因此在合并的SM中减少配置会使事情变得更加轻量级。如果每个实体有一个服务,只需在服务类中插入数据库适配器,并在控制器中插入服务即可。您只需要做一次注入,它可以让代码非常清晰。我从模块->控制器->服务层开始,服务层扩展了一个抽象类,它实现了SM和其他功能。每个模块有几个服务层,可以将代码进一步拆分,并使其易于识别(即:添加/编辑/删除)。这样,每一层都可以扩展抽象类,而不必每次都向每一层添加所需的功能。我认为,由于这个特定模块是唯一调用这些表的模块,因此在合并的SM中减少配置会使事情变得更加轻量级。如果每个实体有一个服务,只需在服务类中插入数据库适配器,并在控制器中插入服务即可。您只需要执行一次注入,它可以使代码非常清晰。