2017-05-18 4 views
0

app\Http\Controllerには、他のすべてのコントローラが継承するマスタコントローラクラスControllerがあります。他のコントローラでは、次のコードは正常に動作します:しかしLaravel 5 Authはコントローラの構造体ではない

class OtherController extends Controller{ 

    public function index(){ 
     dd(\Auth::user()->id); 
    } 
} 

、親クラスすなわちController.phpで、私は非のプロパティを取得しようとするとを持っているconstruct方法ではそのような何かをしようとすると、オブジェクトエラー:

class Controller extends BaseController { 

    use AuthorizesRequests, 
     DispatchesJobs, 
     ValidatesRequests; 
    public $foo = 'null'; 

    public function __construct() { 
     $this->middleware('auth'); 
     dd(\Auth::user()->id);//Error is here. 
     dd(\Route::getCurrentRoute()->action['controller']); 

    } 

} 

どうすればこの問題を解決できますか?

答えて

5

編集このメソッドを宣言し、parent::call_action()行の前に、それにあなたのコードを入れてみてください、実際の答え

を追加する:thisページの下から撮影

public function callAction($method, $parameters) 
{ 
    // Put your code right here 

    // then do this last 
    return parent::callAction($method, $parameters); 
} 

。つまり、宛先メソッドが呼び出される直前にcallActionが常に呼び出されますが、の後にとも呼ばれ、ミドルウェアが正常にアクセスできるようになります。おそらく、コンストラクタで何をしようとしていたとしても、このメソッドでそれを望むように動作します。

オリジナル回答

それはあなたが、具体的ができることを意味し、私はlaravel 5.4の周りつついてきたので、ビットをされているが、私が正しくリコール場合ミドルウェアは、コントローラのコンストラクタ後まで発生しません。 'tあなたは何をしようとしていますか? authミドルウェアは、コントローラが構築されるまで、しかしコントローラメソッドが呼び出されるまで(つまり、最初の例がうまくいくまで)、ログインしたユーザでAuthファサードを生成しません。

これは意図した動作だと考えていますので、変更する可能性は低いです。

あなたがやろうとしていることをやり遂げるために別の方法を見つけなければならないということは、(それ以上知識のある人が私を訂正しない限り)短いです。

編集実際

を追加するには、this questionはそれを明確に私の疑惑が正しかったということになります。コントローラーのコンストラクターの後にミドルウェアが起動すると、コントローラーコンストラクター内のログインユーザーにアクセスできなくなります。振り返ってみると、コントローラのコンストラクタ内で行うことができるのは、システムが実行するミドルウェアを指定することなので、これは明らかです。ミドルウェアがすでに稼働していた場合、そのミドルウェアは実行できません。つまり、コントローラのコンストラクタ内からAuthファサードに(実質的に)アクセスすることができないことです。これはラーバルチームの意図的なものなので、すぐに変更されることはありません。あなたはそれを行う別の方法を見つける必要があります。

+0

をチェックし、私は達成するために必要なのCakePHP' 'で' beforeAction'コールバックのようなものです。つまり、コントローラのアクションの実行前に特定のタスクを実行する前に実行されます。 – SaidbakR

+0

あなたがしようとしていることの詳細は、適切な解決方法を見つけ出すのに役立ちます –

+0

これは私が必要とするものです。確かに、私は自分のAuthorization実装を作るために 'Controller.php'でそのようなメソッドを使うことがこのアプローチにとって不可欠です。 – SaidbakR

2

私はあなたのエラーに基づいて私の答えを更新してい... laravel 4で今use Illuminate\Support\Facades\Auth;

を追加し、ファイルの先頭に確認してください。すべてです

$userId = Auth::id(); 

:2+ユーザーのIDを取得することは容易です。

しかし、ID以外のユーザーのデータを取得するために、あなたが使用します。詳細については

$email = Auth::user()->email; 

を、実際security part of the documentation

+0

私はこのエラーがあります: 'App \ Http \ Controllers \ ControllerはIlluminate \ Support \ Facades \ Authを使用できません - それは特性です' – SaidbakR

+0

@SaidbakR私は答えを更新しました –

+0

あなたはどちらかもの。 PHPには、ファイルの先頭(名前空間の後でクラス定義の前)またはクラスの先頭にuseディレクティブを置く場所が2つあります。クラスの先頭にある 'use'ディレクティブは、PHPに特性を使用するよう指示します。認証ファサードは特性ではないので、あなたが発見したように、それを1つとして使用しようとするとエラーになります。ファイルの先頭に 'use'ディレクティブを置くと、基本的にPHPのクラスのエイリアスになります。しかし、それはあなたの問題ではありません(もっと多くの人に) –

関連する問題