2015-04-17 27 views
8

Buduję projekt laravel iw jednym z kontrolerów mam dożylnie dwie zależności w metodzie:PHP - Dependency Injection laravel: Parametry podaje do Dependency konstruktora

public function pusherAuth(Request $request, ChannelAuth $channelAuth) { ... } 

Moje pytanie jest bardzo proste: Jak przekazać parametry do zależności $channelAuth?

Obecnie używam niektóre ustawiające przekazać potrzebne zależności:

public function pusherAuth(Request $request, ChannelAuth $channelAuth) 
{ 
    $channelAuth 
     ->setChannel($request->input('channel')) 
     ->setUser(Auth::user()); 

Jakie są alternatywy dla tego podejścia?

P.S. Kod musi być testowalny.

Odpowiedz

7

Dzięki pomocy, którą otrzymałem na temat tego Laracast discussion, byłem w stanie odpowiedzieć na to pytanie. Za pomocą dostawcy usług można zainicjować zależność, przekazując odpowiednie parametry do konstruktora. To jest dostawca usług, który utworzyłem:

<?php namespace App\Providers; 

use Security\ChannelAuth; 
use Illuminate\Contracts\Auth\Guard; 
use Illuminate\Http\Request; 
use Illuminate\Support\ServiceProvider; 

class ChannelAuthServiceProvider extends ServiceProvider { 

    /** 
    * Bootstrap the application services. 
    * 
    * @return void 
    */ 
    public function boot() 
    { 
     // 
    } 

    /** 
    * Register the application services. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     $this->app->bind('Bloom\Security\ChannelAuthInterface', function() 
     { 
      $request = $this->app->make(Request::class); 
      $guard = $this->app->make(Guard::class); 

      return new ChannelAuth($request->input('channel_name'), $guard->user()); 
     }); 
    } 
} 
+0

Ale co, jeśli dane wejściowe nie mają ustawionego "nazwa_kanału"? Ten kod może zostać wywołany, zanim będziesz mógł zweryfikować swoje dane wejściowe. – omarjebari

+0

@omarjebari Domyślam się, że to zależy od tego, gdzie wstrzykujesz 'Bloom \ Security \ ChannelAuthInterface', który w moim przypadku jest po zatwierdzeniu danych wejściowych. – siannone

0

Możesz utworzyć i zarejestrować własnego dostawcę usług i utworzyć obiekt z parametrami żądań konstruktora.

Nie wiem, jak to zrobić w Laravel, ale w Symfony2 można wstrzykiwać w swojej własnej usłudze coś w stylu RequestStack. To najlepszy sposób, ponieważ masz małych dostawców usług, którzy są w pełni testowalni.

Powiązane problemy