2016-06-15 11 views
0

私はlaravelの新人です。ここで質問があります。私は私のカスタムクラスに 'Illuminate \ Http \ Request'を注入しようとしています。カスタムクラスでLaravel 5.2 "Illuminate Http Request"を挿入する方法は?

Error: __construct() must be an instance of Illuminate\Http\Request, none given,

は、以下の私のコードの何が問題になっているのですか?ありがとう!指定されたエラーに基づいて

namespace App\Library; 

use Crypt; 
use Illuminate\Http\Request; 

class MenuAccess 
{ 

    public function __construct(Request $request){ 
     $this->request = $request; 
    } 

    public function setLoginSession($user){ 

     $user = Crypt::encrypt($user); 

     $this->request->session()->put('PAZPOSID', $user); 

     return $request->session()->pull('PAZPOSID'); 

    } 

} 
+0

どのようにこのMenuAccessクラスをインスタンス化していますか? – Devon

+0

public function test(Request $ request) { print_r($ this-> menuAccess-> setLoginSession( 'test')); } –

+0

私は既にこれを私のコントローラで行っていますので、クラスの呼び出し/ setLoginSessionの呼び出しは問題ではありません。パブリック関数__construct() { $ this-> menuAccess = new \ App \ Library \ MenuAccess; } –

答えて

2

、あなたのコンストラクタにIlluminate\Http\Requestのインスタンスを渡していません。

あなたのパラメータをほのめかし、PHPは強制し、それがで渡される同じタイプだことを確認します入力しているので

さらに詳しい情報:。http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration

あなたはそのを見るためにあなたのクラスをインスタンス化する前に、dd($request)を行うことができますタイプ。あなたはLaravelのIoCが自動あなたのためにそれを解決したい場合は

、見た目here

+0

「」与えられた誤差に基づいて、あなたは、コンストラクタで点灯\のHttp \リクエストのインスタンスを渡していません。「」 私は
パブリック関数の__construct(リクエスト$リクエスト){ を行うと、私はこれを得ましたLaravel docoから、私は 'Illuminate \ Http \ Request'が私のクラスに正しく呼び出されなかったと思う。 誰かがこれに答えるのを見ましたが、私の上では動作しません。 http://stackoverflow.com/questions/35307773/injecting-laravel-5-1-illuminate-http-request-in-your-custom-classes –

+1

@ JohanSyah私はあなたにLaravelが自動的にリクエストを注入してほしいと思うでしょうか?もしそうなら、答えは – SteD

0

これは私のためにexteremely便利な疑問だった持っています。答えは非常に便利です。

Laravelの依存性の注入は、あなたが手で呼び出していない関数やコンストラクタで働くように思われる(コントローラのコンストラクタのように、クロージャルートとして登録されている(機能))

をしてみてください依存性注入を持つコントローラコンストラクタを手で呼び、それは動作しません。ここで

はroutes.phpの

Route::get('/func_', '[email protected]'); 

Route::get('/func', function() { 
    $c = new App\Http\Controllers\AController; 
    return $c->func(); 
}); 

Route::get('/f_', '[email protected]'); 

Route::get('/f', function() { 
    $c = new App\Http\Controllers\AController(request()); 
    return $c->f(); 
}); 

では例

あるコントローラのインスタンスが作成されますので、AController

namespace App\Http\Controllers; 

use Illuminate\Http\Request; 

use App\Http\Requests; 

class AController extends Controller 
{ 
    public $req; 
    public function __construct(Request $req) { 
     $this->req = $req; 
    } 

    public function func() { 
     return $this->req->input('name'); 
    } 

    public function f(Request $r) { 
     return $r->input('name'); 
    } 
} 

と呼ばれるコントローラを追加し、 /func_が動作する実行しようとしますLaravel /funcは、コンストラクタを自分で呼び出そうとしたために機能しません。 /f_コントローラを正しく作成したにもかかわらず、依存関係注入を使用する関数がLaravel /fによって呼び出されるため、機能しません。しかし、パラメータなしで手で呼び出されるため、関数は機能しません。

依存関係注入を持つ関数を呼び出したい場合。完全なパラメータで電話する

+0

ありがとう!それは動作しますが、私はそれを行うより簡単な方法を見つけました..以下の自分の答えを確認してください。 =)多分あなたも試してみたいです。 –

0

私は私の答えを見つけました。だから私のカスタムクラスを呼び出す前に、問題は私のコントローラで、私は私のコントローラ内の構造体でインスタンス化する必要があります。

そして、私はここに私のカスタムクラス

では何も変わっていないが、私はそれを修正するために何をしたかである:

use \App\Library\MenuAccess; 

class UserController extends Controller 
{ 
    private $menuAccess; 

    public function __construct(MenuAccess $menuAccess) 
    { 
     $this->menuAccess = $menuAccess; 
    } 

    public function login(Request $request) 
    { 
     print_r($this->menuAccess->setLoginSession('[email protected]')); 
    } 
} 
関連する問題