6

我的模块中有两个控制器,它们都需要查看用户是否登录。登录控制器使用 DbTable 对用户进行身份验证并将身份写入存储。

我正在使用 >Zend\Authentication\AuthenticationService;$auth = new AuthenticationService();

在控制器函数内部,但随后我在多个 pageAction() 上实例化它的实例

为此,我在 Module.php 中编写了一个函数

如下

public function getServiceConfig()
    {
        return array(
            'factories' => array(
                'Application\Config\DbAdapter' => function ($sm) {
                    $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                    return $dbAdapter;
                },
                 'Admin\Model\PagesTable' => function($sm){
                     $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                     $pagesTable = new PagesTable(new TableGateway('pages',$dbAdapter) );
                    return $pagesTable;
                },
                'Admin\Authentication\Service' => function($sm){
                    return new AuthenticationService();

                }
            ),
        );
    }

正如你所看到的,我每次都返回新的 AuthenticationService() 我认为这是不好的。我找不到如何获取已经实例化的服务实例,或者我必须为此编写一个单例类。请告知任何具有更深入解释的示例代码片段将受到高度重视和赞赏,谢谢。

4

1 回答 1

2

试试这个:

public function getServiceConfig()
{
    return array(
        'aliases' => array(
            'Application\Config\DbAdapter' => 'Zend\Db\Adapter\Adapter',
            'Admin\Authentication\Service' => 'Zend\Authentication\AuthenticationService',
        ),
        'factories' => array(
            'Admin\Model\PagesTable' => function ($serviceManager) {
                 $dbAdapter    = $serviceManager->get('Application\Config\DbAdapter');
                 $tableGateway = new TableGateway('pages', $dbAdapter);
                 $pagesTable   = new PagesTable($tableGateway);
                 return $pagesTable;
             },
        ),
    );
}

主要注意根数组的“别名”部分,任何其他更改都只是装饰性的,您可能更喜欢按照您建议的方式进行操作(例如使用工厂检索 Zend\Db\Adapter\Adapter 实例而不是别名也)。

亲切的问候,

伊势

于 2012-12-07T18:20:42.750 回答