Zend框架2静态适配器

时间:2014-07-11 17:21:48

标签: php zend-framework2

如何构建静态适配器以在每个控制器操作中调用

$this->dbAdapter

而不是每次都这样做

like $this->getServiceManager()->get('dbAdapter');

1 个答案:

答案 0 :(得分:0)

您可以使用控制器工厂将数据库适配器注入控制器。这将允许您将其作为类属性($this->dbAdapter)引用。

namespace Module\Factory;

use Module\Controller\FooController;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\ServiceManager\FactoryInterface;

public class FooControllerFactory implements FactoryInterface
{
    protected $dbAdapter;

    public function createService(ServiceLocatorInterface $cpm)
    {
        $serviceManager = $cpm->getServiceLocator();

        // inject 'db1' or whatever your adapter's
        // name is registered as
        return new FooController($serviceManager->get('db1'));
    }
} 

通过向模块类添加条目,将工厂注册到控制器插件管理器。如果你已经拥有了一个可以调用的'如果已注册名称,则需要将其删除。

class Module 
{    
    public function getControllerConfig()
    {
        return array(
            'factories' => array(
                'Module\Controller\Foo' => 'Module\Factory\FooControllerFactory'
            ),
        );
    }
}

最后允许适配器通过它的构造函数进入控制器。

use Zend\Db\AdapterInterface;

class FooController extends AbstractActionController
{
    protected $dbAdapter;

    public function __construct(AdapterInterface $dbAdapter)
    {
        $this->dbAdapter = $dbAdapter;
    }

    public function indexAction()
    {
        // now you can use the adapter in any action!
        $this->dbAdapter->doStuff();
    }

}

完成所有这些后,我强烈建议不要使用上述设计(我的意思是注入适配器)。这是因为您将在控制器中执行查询,这是域逻辑与控制器工作流的混合。如果您的域名要求发生变化,您的控制器也必须这样做。