2

在我的 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?

潜在地,可以使用单例来创建一种标准对象(配置、数据库等)的全局容器吗?

4

1 回答 1

-1

我以前遇到过这个问题,但我通过将我的database库传递给我的视图来解决它!我有一个调用来加载我的视图,并且在$data将要传递给正确视图的数组中,我将数据库和其他库放入其中。

$data = array(
  'DATABASE' => &$this->db,
  'INPUT' => &$this->input
);

我尝试传递变量的地址,这样就不会发生过载。

于 2012-12-31T22:05:09.667 回答