web-dev-qa-db-ja.com

Laravel 5.3コンストラクタの認証チェックがfalseを返す

私は_Laravel 5.3_を使用しており、idメソッドでauthenticatedユーザーのconstructorを取得して、フィルタリングできるようにしています次のように割り当てられた会社によるユーザー:

_namespace App\Http\Controllers;

use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Support\Facades\View;
use App\Models\User;
use App\Models\Company;
use Illuminate\Support\Facades\Auth;


class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests ;

    public $user;
    public $company;


    public function __construct()
    {


        $companies = Company::pluck('name', 'id');
        $companies->prepend('Please select');
        view()->share('companies', $companies);
        $this->user = User::with('profile')->where('id', \Auth::id())->first();
        if(isset($this->user->company_id)){
            $this->company = Company::find($this->user->company_id);
            if (!isset($this->company)) {
                $this->company = new Company();
            }
            view()->share('company', $this->company);
            view()->share('user', $this->user);
        }

    }
_

ただし、これはユーザーidを返しません。私もAuth::check()を試しましたが、機能しません。

Auth::check()__construct()メソッドから移動すると、次のように機能します。

_<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HomeController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
        $this->middleware('auth');
    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        dd(\Auth::check());
        return view('home');
    }
}
_

ただし、これをHomeControllerの構成メソッドに追加すると、は失敗します

これが失敗する理由はありますか?

14
001221

ドキュメント

ミドルウェアがまだ実行されていないため、コントローラーのコンストラクターでセッションまたは認証済みユーザーにアクセスできません。

別の方法として、コントローラーのコンストラクターでClosureベースのミドルウェアを直接定義できます。この機能を使用する前に、アプリケーションがLaravel 5.3.4以上で実行されていることを確認してください。

class ProjectController extends Controller
{
    /**
     * All of the current user's projects.
     */
    protected $projects;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware(function ($request, $next) {
            $this->projects = Auth::user()->projects;

            return $next($request);
        });
    }
}
15
ABDEL-RHMAN

5.3以降Auth::checkはコントローラーのコンストラクターでは機能しません。これは文書化されていない変更の1つです。したがって、ミドルウェアに移動するか、代わりにコントローラーメソッドをチェックインするか、プロジェクトを5.2.xに移動する必要があります。

9
Alexey Mezenin

$this->middleware('auth');の後にparent::__construct();を呼び出すため、失敗します。これは、ミドルウェアが適切にロードされていないことを意味します。

2