2016-04-01 3 views
2

Как получить доступ к $ app внутри контроллера, поскольку Slim 3.3 вводит только ContainerInterface?

Кода для иллюстрации вопроса:

$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

Какая у вас Slim версия? '\ Slim \ Slim :: getInstance();' опция? – ficuscr

+0

Просто используйте 'global' Я думаю, это шаблон DI;) Naw, прочитайте это? http://stackoverflow.com/questions/32365258/access-app-in-class-in-slim-framework-3 – ficuscr

+0

@ficuscr Я добавил информацию к сообщению. Я использую версию 3.3, поэтому getInstance не рекомендуется. –

ответ

-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 в любом месте вашего кода, вызвав g Anorexic::getInstance(); Конечно, вы никогда не должны пытаться это делать дома: P

1

Это было сложно.

Тонкий 3 сильно использует инъекцию зависимости, поэтому вы также можете использовать его.

Прежде всего, вы можете захватить $ 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(); 
Смежные вопросы