在我的 Web 应用程序中,我的数据库连接适配器被创建为第一件事。在此之前,构建应用程序配置。两者都是通过 ZF2 中相应的 Zend 组件实例化的。我注意到我只是将 ZF2 用作库,而不是本身作为框架。
基本上,这就是我的应用程序初始化中发生的事情。
$config = new \Zend\Config\Config(array());
$database = new \Zend\Db\Adapter\Adapter($config->database->toArray);
/**
*Create the session, start the session
*Set error handling
*/
很酷,所以这就是它的大部分。现在,我们接着处理请求:
$router = new \ils\Router($_SERVER['REQUEST_URI'], $database]);
$router->dispatch();
在我的路由器内部,我基本上将 URI 拆分为其组件,检查路由是否有效,然后使用以下命令调度它:
$dispatchedController = new $this->controller($this->database);
$method = $this->method;
我基本上是在注入数据库组件,该组件是我通过路由器从初始化提供到控制器中的。这与DI足够接近吗?我该如何改进它?
所以在我的控制器类中,我有承包商
public function __construct($database){
$this->database = $database;
}
就是这样。然后我可以根据需要将其传递给相关的 DAO 等。
我的问题是,在应用程序的某些地方,特别是视图和其他一些类,我有服务——可能不是你想的那种类型!这些服务仅中继信息,通常不实例化为对象:
class UserService {
public static function getUsername(){
$container = new \Zend\Session\Container('application_session');
return $sessionContainer->userId;
}
然后我们有一个看起来像这样的方法 - 这就是问题所在:
public function getCurrentUser(){
$user = new \ils\objects\user();
$user->setUserId(self::currentUserId());
$data = new \model\dao\users($database);
$user = $data->loadUser($user);
return $user;
}
现在,我从哪里得到$database
?虽然我可以在某些地方将类服务实例化为一个对象,然后以它为食,但有些地方我不能。
我正在考虑可能使用 ZendServiceManager
将东西连接到其中 - 但我将如何获得 ServiceManager?
潜在地,可以使用单例来创建一种标准对象(配置、数据库等)的全局容器吗?