2016-03-24 13 views
0

私はLaravelは自動的にこれらの依存関係を解決すると思うし、私はないshound依存性注入Laravel

class UserController extends Controller 
{ 
    public function store(Request $request) 
    { 
     $this->request = $request; 
     $payload = json_decode($this->request->getContent()); 
     if($this->validateJson('user.create', $payload)) { 
      $validator = Validator::make((array) $payload, User::$rules); 
      if ($validator->fails()) { 
       $messages = $validator->errors(); 
       return $this->sendResponse(false, $messages); 
      } 
      FUser::signup($payload); 
      return $this->sendResponse(true, $response); 
     } 
    } 
} 

以下のようなRUser::signup()機能を使用しようとしています私のUserControllerからファサードクラス

use App\Http\Response 

class RUser 
{ 
    public function signup(TokenGenerator $token_generator, $data) 
    { 
     $response = []; 
     $access_token = $token_generator->generate(32); 
     dd($access_token); 
     $user = User::create($data); 
     $response['user_id'] = $user->_id; 
     $response['']; 
    } 
} 

を持っていますTokenGeneratorのインスタンスを明示的に渡してください。しかし、私は次のエラーが発生しています。

Argument 1 passed to App\Http\Responses\RUser::signup() must be an instance of App\Utils\TokenGenerator, instance of stdClass given, called in 
+0

'signup'関数の最初のパラメータとして' TokenGenerator'のオブジェクトを渡す必要があります –

+0

Laravel IOCにバインディングのようなものがありますか? –

答えて

1

Laravelはデフォルトでコンストラクタでインスタンスをカスタムクラスに挿入します。コントローラのアクションは、注入されたインスタンスも受け取ります。

だからあなたの例では、正常に動作するような変更が必要になります。自分でクラスをインスタンス化するとき、あなたが点灯するmake()メソッドを呼び出す必要があり

class RUser 
{ 
    protected $token_generator; 

    public function __construct(TokenGenerator $token_generator) 
    { 
     $this->token_generator = $token_generator; 
    } 

    public function signup($data) 
    { 
     $response = []; 
     $access_token = $this->token_generator->generate(32); 
     dd($access_token); 
     $user = User::create($data); 
     $response['user_id'] = $user->_id; 
     $response['']; 
    } 
} 

class UserController extends Controller 
{ 
    public function store(Request $request, RUser $ruser) 
    { 
     $this->request = $request; 
     $payload = json_decode($this->request->getContent()); 
     if($this->validateJson('user.create', $payload)) { 
      $validator = Validator::make((array) $payload, User::$rules); 
      if ($validator->fails()) { 
       $messages = $validator->errors(); 
       return $this->sendResponse(false, $messages); 
      } 
      $ruser->signup($payload); 
      return $this->sendResponse(true, $response); 
     } 
    } 
} 

を外部に依存性の注入をトリガするには\ Foundation \ Applicationインスタンスの場合、次のようになります。

$fooBar = $this->app->make('FooBar'); 

を参照Laravel docs

+0

S \ 'App \ Http \ Responses \ RUser :: __ construct()に渡される引数1は、App/Utils \ TokenGeneratorのインスタンスでなければなりません。/ var/www/html/myapp/app /Providers/RUserServiceProvider.php 29行目に定義されています。 –

+0

サービスプロバイダでコンストラクタを直接呼び出して初期化しています。このような場合、依存性注入は起こりません。 '$ ruser = $ this-> app-> make( 'RUser');'を使って作成することができます。 –

+0

どこでこれを行う必要がありますか?あなたが自由であれば、私は実際にすべてのコードで新しい質問を作成し、人々は何が起こっているのか知ることができますhttp://stackoverflow.com/questions/36203271/laravel-di-not-working-when-using-in-facades-基礎クラス –