【问题标题】:Access $app object from controller从控制器访问 $app 对象
【发布时间】:2016-04-01 20:08:28
【问题描述】:

当 Slim 3.3 只注入 ContainerInterface 时,如何在控制器中访问 $app?

说明问题的代码:

$app = new \Slim\App;

$app->get('/home', 'HomeController:get');

$app->run();

class HomeController {
    private $ci;

    public function _construct($ci) {
        $this->ci = $ci;
    }

    public function get($request, $response) {
        $this->ci->get(...);
        // How to access $app and dependencies like $app->jwt?
    }
}

【问题讨论】:

  • 你的 Slim 版本是什么? \Slim\Slim::getInstance(); 一个选项?
  • 只需使用global 我认为是 DI 模式 ;) 不,读这个? stackoverflow.com/questions/32365258/…
  • @ficuscr 我在帖子中添加了信息。我使用的是 3.3 版,因此不推荐使用 getInstance。
  • @MaxBündchen 您不需要获取 $app 实例。 $app 实例上没有任何内容了,所有内容都存储在容器中,这就是我们注入它的原因。
  • @MaxBündchen 这是 Slim v2 中的一种常见模式……很容易将 v2 与 v3 混淆。致命的赠品是 $app 对象是 v2 中的 Slim\Slim 和 v3 中的 Slim\App。通过注入 $app 的服务定位是 v2 的经典模式。依赖注入是 v3 的模式。

标签: php slim


【解决方案1】:

这是一个艰难的过程。

Slim 3 大量使用依赖注入,因此您可能也想使用它。

首先在您的dependencies.php 中,您需要获取$app 并将其放入容器中,以便稍后将其注入控制器。

$container['slim'] = function ($c) {
   global $app;
   return $app;
};

然后你必须注入它:

// Generic Controller
$container['App\Controllers\_Controller'] = function ($c) {
    return new _Controller($c->get('slim'));
};

现在在你的 controller.php 上:

private $slim;

/**
     * @param \Psr\Log\LoggerInterface       $logger
     * @param \App\DataAccess                $dataaccess
     * @param \App\$app                      $slim
     */
    public function __construct(LoggerInterface $logger, _DataAccess $dataaccess, $slim)
    {       
        $this->logger = $logger;
        $this->dataaccess = $dataaccess;
        $this->slim = $slim;
    }

现在你可以这样称呼它:

$this->slim->doSomething();

【讨论】:

    【解决方案2】:

    您可以制作自己的“单例”来模仿 Slim::getInstance(); ;)

    class Anorexic extends \Slim\App {
        private static $_instance;
        public static function getInstance(){
            if(empty(self::$_instance){
                self::$_instance = new self();
            }
            return self::$_instance;
        }
    }
    

    然后像这样改变你的初始化:

    // $app = new \Slim\App;
    $app = Anorexic::getInstance();
    

    现在您可以通过调用 Anorexic::getInstance(); 在代码中的任何位置获取您的 \Slim\App 实例,当然您不应该在家尝试这个:P

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-22
      • 2017-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多