2016-04-01 20 views
2

Wie erhält man Zugriff auf $ app in einem Controller, da das Slim 3.3 nur das ContainerInterface injiziert?

-Code zu veranschaulichen die Frage:

$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

Was ist deine Slim-Version? '\ Slim \ Slim :: getInstance();' eine Option? – ficuscr

+0

Verwenden Sie einfach 'global' Ich denke, ist das DI-Muster;) Nein, lesen Sie dieses? http://stackoverflow.com/questions/32365258/access-app-in-class-in-slim-framework-3 – ficuscr

+0

@ficuscr Ich habe die Informationen zum Beitrag hinzugefügt. Ich benutze die Version 3.3, so dass die getInstance veraltet ist. –

Antwort

-1

Sie können Ihre eigenen 'Singleton' machen Slim::getInstance(); nachzuahmen;)

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

dann Ihre Initialisierung wie folgt ändern:

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

Jetzt können Sie Ihre \Slim\App Instanz überall in Ihrem Code per Callin erhalten g Anorexic::getInstance(); Natürlich sollten Sie dies nie zu Hause versuchen: P

1

Das war eine schwierige Frage.

In Slim 3 wird die Abhängigkeitsinjektion stark verwendet, daher sollten Sie sie auch verwenden.

Zuerst in Ihrer dependencies.php müssen Sie die $ app und werfen sie in einen Container, um es später auf den Controller zu injizieren.

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

Dann hast du es zu injizieren:

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

Jetzt auf Ihrem 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; 
    } 

Jetzt haben Sie es gerade diese wie nennen:

$this->slim->doSomething(); 
Verwandte Themen