มิดเดิลแวร์ส่วนกลาง Laravel 5.7 ไม่ทำงาน

ฉันต้องการสร้างมิดเดิลแวร์ในโปรเจ็กต์ laravel ของฉันเพื่อตรวจสอบว่าผู้ใช้ประเภทใดที่ล็อกอินเข้าสู่เว็บไซต์ของฉัน แนวคิดก็คือ ฉันจะตรวจสอบว่าผู้ใช้เข้าสู่ระบบในมิดเดิลแวร์หรือไม่ จากนั้นจึงตั้งค่าตัวแปรเซสชันเป็นค่าที่แน่นอน

นี่คือมิดเดิลแวร์:

CheckIfLoggedin.php

use Closure;
use Auth;

class CheckIfLoggedin
{
    public function handle($request, Closure $next)
    {
        if (Auth::check()) {
            $request->session()->put('loggedin', 'admin');
        }
        return $next($request);
    }
}

ฉันได้ลงทะเบียนเป็นมิดเดิลแวร์ส่วนกลางตามที่อธิบายไว้ในเอกสารโดยเพิ่มบรรทัดนี้ใน Kernel.php:

protected $middleware = [
    // ...
    \App\Http\Middleware\CheckIfLoggedin::class,
];

และฉันตรวจสอบค่าของตัวแปรเซสชันนี้ในเทมเพลตเบลดของฉันดังนี้:

@if(session('loggedin'))
    <!-- some html code -->
@endif

ฉันรู้ว่าฉันสามารถใช้สิ่งนี้เพื่อยืนยันการเข้าสู่ระบบได้:

@auth
    <!-- some html code -->
@endauth

แต่เหตุผลในการใช้ตัวแปรเซสชันนี้คือ ฉันจะมีสมาชิกหลายประเภท (เช่น member หรือ admin) และฉันจะกำหนดประเภทการเข้าสู่ระบบให้กับตัวแปรเซสชันนั้นในภายหลัง จากนั้นควรจะทำงานในลักษณะนี้ในเทมเพลตเบลด:

@if(session('loggedin')=='member')
    <!-- some html code that only members can see -->
@elseif(session('loggedin')=='admin')
    <!-- some html code that only admins can see -->
@endif

มีความคิดเห็นใดบ้างว่าทำไมมิดเดิลแวร์นี้ถึงไม่ทำงานอย่างที่ฉันคาดหวังไว้ โปรดทราบว่าฉันค่อนข้างใหม่กับ Laravel แม้ว่า ...

ขอบคุณ!


person wohe1    schedule 18.09.2018    source แหล่งที่มา


คำตอบ (1)


คุณต้อง เริ่มเซสชันก่อนจึงจะสามารถทำงานใดๆ ได้ หากคุณอ่านหุ้น kernel.php คุณจะเห็นว่าเซสชันเริ่มต้นเฉพาะในกลุ่ม web (ผ่าน \Illuminate\Session\Middleware\StartSession::class) ดังนั้นคุณต้องเพิ่มมิดเดิลแวร์ของคุณเองด้านล่าง

protected $middleware = [
    \App\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    \App\Http\Middleware\TrustProxies::class,
];
/**
 * The application's route middleware groups.
 *
 * @var array
 */
protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        // \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

หมายเหตุ: สิ่งที่ฉันจะทำคือใช้ประโยชน์จากนโยบายและประตู และบางทีอาจเป็นยามแบบกำหนดเอง แต่ ไม่ใช่ เซสชันสำหรับงานประเภทนี้

person Kyslik    schedule 18.09.2018