如何构建静态适配器以在每个控制器操作中调用
$this->dbAdapter
而不是每次都这样做
like $this->getServiceManager()->get('dbAdapter');
答案 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();
}
}
完成所有这些后,我强烈建议不要使用上述设计(我的意思是注入适配器)。这是因为您将在控制器中执行查询,这是域逻辑与控制器工作流的混合。如果您的域名要求发生变化,您的控制器也必须这样做。