从控制器访问$ app对象

时间:2016-04-01 20:08:28

标签: php slim

如何在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?
    }
}

2 个答案:

答案 0 :(得分:1)

这是一个艰难的。

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

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

$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();

答案 1 :(得分:-1)

你可以制作自己的单身人士'模仿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();

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