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