[Day 34] 自我介紹後台及前台(三) - 建立中介層

自我介紹後台及前台

建立中介層

我們在這裡透過session取得了User的資料,
但是在這之前,
針對需要登入才能使用的頁面,
我們要先確認使用者是否已經登入,
如果還沒就轉到登入頁,

我們可以用php artisan make:middleware指令來建立中介層.

當我們下指令
php artisan make:middleware AdminMiddleware
 

https://ithelp.ithome.com.tw/upload/images/20201004/20105694qDJCnAC7FQ.png

就會產生app/Http/Middleware/AuthUserAdminMiddleware.php這個檔案,
我們看一下檔案內容

<?php

namespace App\Http\Middleware;

use Closure;

class AdminMiddleware
{
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
}

return $next($request); 表示照常做原本要做的動作,
我們在這裡加上登入的判斷

<?php

namespace App\Http\Middleware;

use Closure;

class AdminMiddleware
{
    public function handle($request, Closure $next)
    {
        //預設不允許存取
        $is_allow = false;
        //取得會員編號
        $user_id = session()->get('user_id');
        
        if(!is_null($user_id))
        {
            //已登入,允許存取
            $is_allow_access = true;
        }

        if(!$is_allow)
        {
            //若不允許存取,重新導向至首頁
            return redirect()->to('/');
        }

        return $next($request);
    }
}

如果登入就可以繼續進行下個步驟,
否則就回到首頁.

之後我們要在app/Http/Kernel.php中註冊中介層

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    //應用程式共用中介層
    protected $middleware = [
        //省略
    ];

    //路由中介層群組
    protected $middlewareGroups = [
        //省略
    ];

    //應用程式中介層
    protected $routeMiddleware = [
        'auth.admin' => \App\Http\Middleware\AdminMiddleware::class,
        //以下省略
    ];
}

$middleware是整個Laravel應用程式共用的中介層,
所有的請求都會經過這些中介層的處理.

$middlewareGroups是路由中介層群組,
所有的Web路由請求都會經過web的中介層群組處理,
所有的API路由請求都會經過api的中介層群組處理.

$routeMiddleware是個別的中介層,
分別指定不同的名稱給中介層類別.

我們將自定義的中介層加在$routeMiddleware底下,
我們可以在routes/web.php中呼叫中介層,
有兩種方式可以呼叫中介層,
一種是加在路由的後面

Route::group(['prefix' => 'admin'], function(){
    //自我介紹相關
    Route::group(['prefix' => 'user'], function(){
        //自我介紹頁面
        Route::get('/', 'AdminController@editUserPage')->middleware(['auth.admin']);
    });
});

另外一種是把所有需要登入的頁面都透過中介層

Route::group(['middleware'=>['auth.admin']], function(){
    Route::group(['prefix' => 'admin'], function(){
        //自我介紹相關
        Route::group(['prefix' => 'user'], function(){
            //自我介紹頁面
            Route::get('/', 'AdminController@editUserPage');
            //處理自我介紹資料
            Route::post('/', 'AdminController@editUserProcess');
        });

        //心情隨筆相關
        Route::group(['prefix' => 'mind'], function(){
            //心情隨筆列表頁面
            Route::get('/', 'AdminController@mindListPage');
            //新增心情隨筆資料
            Route::get('/add', 'AdminController@addMindPage');
            //處理心情隨筆資料
            Route::post('/edit', 'AdminController@editMindProcess');
            //單一資料
            Route::group(['prefix' => '{mind_id}'], function(){
                //編輯心情隨筆資料
                Route::get('/edit', 'AdminController@editMindPage');
                //刪除心情隨筆資料
                Route::get('/delete', 'AdminController@deleteMindProcess');
            });
        });
    });
});

這時候我們輸入 http://localhost:8915/admin/user 的時候(根目錄請根據自己實際的情況調整),
如果還沒有登入,
就會自動轉到首頁.