2016-08-22 4 views
1

In Laravel habe ich eine Klasse, die ich dem Service Controller zur Verfügung stellen möchte, einige Änderungen in der Controller-Aktion vornehmen und dann mit einem ViewComposer rendern.Laravel Singleton funktioniert nicht über Controller/ViewComposer

Ich habe dies schon mehrmals ohne Problem gemacht, aber aus irgendeinem Grund funktioniert mein üblicher Ansatz diesmal nicht - klar mache ich etwas anderes, und ich beginne zu vermuten, dass ich einen Aspekt von falsch verstanden habe was mache ich.

Ich habe einen Serviceprovider mit diesem Register() Methode:

public function register() 
{ 
    $this->app->singleton(HelperTest::class, function ($app) { 
     $pb = new HelperTest(); 

     $pb->test = "jokes on you batman"; 

     return $pb; 
    }); 
} 

Da ist in meinem Controller Ich mache folgendes:

private $helper; 

public function __construct(HelperTest $pb) 
{ 
    $this->helper = $pb; 
    $this->helper->test = "hahah"; 
} 

Und dann habe ich eine viewcomposer wie folgt vorgehen:

private $helper; 

public function __construct(HelperTest $pb) 
{ 
    $this->helper = $pb; 
} 

public function compose(View $view) 
{ 
    $view->with('output', $this->helper->test); 
} 

Als ich {{ $output }} in der Klinge Ansicht aufrufen, erwarte ichzu sehen, aber stattdessen bekomme ich jokes on you batman.

Mein Debugging hat gezeigt, dass alle drei dieser Methoden definitiv aufgerufen werden. Es sieht für mich so aus, als ob der ViewComposer aus irgendeinem Grund seine eigene, neue Instanz der Klasse instanziiert. Was mache ich falsch?

Danke!

+0

Ich habe ein bisschen mehr Debugging getan und es scheint, dass compose() VOR der Controller-Aktion aufgerufen wird. Warum sollte das sein ??? – Raiden616

Antwort

0

Führen Sie php artisan optimize auf Ihrer Konsole aus. Dadurch wird ein optimierter Klassenlader für Ihre Anwendung generiert. Überprüfen Sie dann, ob Sie den HelperTest Ihrer Klasse in der services.php in boostrap/cache finden. Bis HelperTest dort nicht registriert ist, kann Larvel IOC Ihre Klasse nicht auflösen.