[英]Easiest way to access MySQL Database in Zend Framework 2 Models
我對ZF2中的工作原理有點困惑。 我需要我的模型文件來訪問數據庫,運行查詢並將結果返回給控制器。
所以,我這樣配置:
return array(
'db' => array(
'driver' => 'Pdo',
'dsn' => 'mysql:dbname=zf2tutorial;host=localhost',
'driver_options' => array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
),
),
'service_manager' => array(
'factories' => array(
'Zend\Db\Adapter\Adapter'
=> 'Zend\Db\Adapter\AdapterServiceFactory',
),
'aliases' => array(
'db' => 'Zend\Db\Adapter\Adapter',
),
),
);
return array(
'db' => array(
'username' => 'YOUR USERNAME HERE',
'password' => 'YOUR PASSWORD HERE',
),
);
//Trying to access the DB service in controller.
$db = $this->getServiceLocator()->get('db');
我想我能夠在控制器中訪問它,但是當我嘗試在MyModel.php文件中找到它時,它會失敗。
//Trying to access the DB service in Model -> Results in FATAL error. ServiceLocator not found.
$db = $this->getServiceLocator()->get('db');
什么是模塊中所有模型和控制器訪問數據庫的最佳和最簡單的方法?
謝謝
您可以使用$this->getServiceManager()
;從控制器內的服務管理器訪問任何服務。 提供控制器類擴展Zend\\Mvc\\Controller\\AbstractActionController
例如
class FooController extends AbstractActionController {
public function barAction() {
$serviceManager = $this->getServiceLocator();
}
}
這工作的原因是AbstractActionController
實現了ServiceLocatorAwareInterface
(因此具有名為set/getServiceLocator()
)。 默認情況下,服務管理器在創建時注入控制器。
為了將服務管理器注入任何其他服務,您還需要遵循類似的過程,但需要手動注入。
首先實現接口
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class MyClass implements ServiceLocatorAwareInterface {
protected $serviceLocator;
public function setServiceLocator(ServiceLocatorInterface $serviceLocator) {
$this->serviceLocator = $serviceLocator;
}
//...
}
然后創建一個工廠來注入它(有幾種方法可以這樣做)
Module.php
public function getServiceConfig() {
return array(
'factories' = array(
'MyClass' => function($serviceManager) {
$myClass = new MyClass();
$myclass->setServiceLocator($serviceManager);
return $myClass;
}
),
);
}
有幾點需要注意:
將服務管理器注入類中通常是一個壞主意,因為很可能您只需要服務管理器應該提供的其他實例。 在工廠中獲取這些(例如數據庫適配器)然后將它們注入到類中會更有意義。 任何使用適配器的人都會知道它依賴於這些服務而不是服務管理器。
讓“模型”或“實體”知道除了自己的屬性之外的任何東西都被認為是糟糕的設計。 我建議閱讀單一責任原則和已知的設計模式,以便持久保存您的域模型(如對象關系映射器(ORM)或數據映射器模式)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.