laravel框架 路由 中間件 交互

路由文件 web.php 爲例子

<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});

Route::get("foo",function(){
    return "hello word";
});
//php artisan serve
//默認路由文件
Route::get("/user",'UserController@index');

//重定向路由
Route::redirect('/here', 'http://www.baidu.com', 301);

//視圖路由
Route::view('/welcome', 'welcome', ['name' => 'Taylor']);

//路由參數
Route::get('/one/{id}',function($id){
    return 'One '.$id;
});


//路由別名
Route::get("user/one",function(){
    return 'UserOne';
})->name("userone");

//你還可以指定控制器行爲的路由名稱:
Route::get("user/pro",'UserController@pro')->name("pro");
//別名生成指定的路由
//生成url
// 用助手函數 route('pro')
//生成重定向
//return redirect()->route('pro');

//如果有定義參數的命名路由 可以把參數作爲route 函數的第二個參數傳入 Route('one',['id'=>2])
//例
Route::get("one/{id}/two/",function($id){
    return $id;
})->name("one");


//路由組調用中間件 在 group調用之前調用middleware方法
//中間件會依照它們在數組中列出的順序來運行:
Route::middleware(['first','second'])->group(function(){
    Route::get("/aaa",function(){
        // 使用 first 和 second 中間件
        return 'this is aaa';
    });
    Route::get("/bbb",function(){
        // 使用 first 和 second 中間件
        return 'this is bbb';
    });
});

//命名空間
//根據命名空間來分配路由
Route::namespace("Admin")->group(function(){
    // 在 "App\Http\Controllers\Admin" 命名空間下的控制器
});

// 路由前綴  使用 url函數 會觸發
Route::prefix('admin')->group(function () {
    Route::get('ccc', function () {
        // 匹配包含 "/admin/users" 的 URL
        // 方法來訪問處理傳入請求的路由的信息:
        $route = Route::current();
        print_r($route);
        $name = Route::currentRouteName();
        print_r($name);
        $action = Route::currentRouteAction();
        print_r($action);
    });
});


//訪問控制
//中間件用於控制應用程序對路由的訪問
// 如果想使用 請將throttle中間件分配給一個路由或者路由組
// throttle中間件會接受兩個參數 ,這兩個參數決定了在給定的分鐘數內可以進行的最大請求數
// 例如 讓我們指定一個經過身份驗證並且用戶每分鐘訪問頻率不超過 60 次的路由:
Route::middleware('auth:web', 'throttle:60,1')->group(function () {
    Route::get('/ddd', function () {
        //
    });
});

//什麼是中間件
//定義中間件
// 命令 php artisan make:middleware CheckAge
//中間件觸發 前置觸發 後置觸發

//註冊中間件
//全局中間件
//假設你想讓中間件在應用處理每個HTTP請求期間運行
//只需要在app\Http\Kernel.php中的$middleware屬性中列出這個中間件

//假如你想爲指定的路由分配中間件
// 首先應該在 app\Http\Kernel.php  文件內爲該中間件分配一個 鍵
// 默認情況下 kernle.php類的 $routeMiddleware 屬性下包含了框架的內置的中間件
// 若需要加入自定義中間件 只需要把自定義的中間件類名追加到後面 然後分配一個 自定義鍵

//一旦在 Kernel 類中定義好了中間件,就可以通過 middleware 方法將爲路由分配中間件:
//你也可以爲路由分配多箇中間件
Route::get("k/n",function(){
   return 20;
})->middleware("check",'test');

//分配中間件的時候你可以傳入完整的類名
Route::get('n/s',function(){
    return 30;
})->middleware('web');

//中間件組
// 某些時候你可能希望使用一個key把多箇中間件打包成一個組
// 方便將他們應用到路由中 你可以使用app\Http\Kernel.php中 $middlewareGroups 屬性
// 框架中內置了 web和 api兩個中間件組 他們包含了常用的中間件 應用到web.php 和api.php 路由中

//中間件組和單箇中間件一樣 可以被應用到路由和控制器中 時,中間組很方便得將多箇中間件一次性應用到路由上:

// 在 kernel.php文件中 命名key值時 不管每個屬性  key都不能重複
//Route::get('/', function () {
//    //
//})->middleware('web');
//
//Route::group(['middleware' => ['web']], function () {
//    //
//});

//Providers 目錄
//目錄包含了應用的所有 服務提供器 。
//服務提供器通過在服務容器中綁定服務、註冊事件、以及執行其他任務來爲即將到來的請求做準備來啓動應用。
// RouteServiceProvider.php文件 將 web 中間組自動應用到 routes/web.php 。

//中間件參數
//中間件也可以接受額外的參數。舉個例子,假如你的應用需要在執行特定操作之前驗證用戶是否爲給定的 「角色」,
//你可以通過創建一個 CheckRole 中間件,由它來接收「角色」名稱作爲附加參數。
//附加的中間件參數應該在 $next 參數之後被傳遞

Route::get("b/n",function(){
    return 20;
})->middleware("role:editor");
//定義路由時通過一個 : 來隔開中間件名稱和參數來指定中間件參數。多個參數就使用逗號分隔

//Terminable 中間件
//有時中間件可能需要在 HTTP 響應發送到瀏覽器之後處理一些工作。
//比如,Laravel 內置的「session」中間件會在響應發送到瀏覽器之後將會話數據寫入存儲器中。
//如果你在中間件中定義一個 terminate 方法,則會在響應發送到瀏覽器後自動調用:




下面是 Kernel.php 內容

 

<?php

namespace App\Http;

use App\Http\Middleware\CheckAge;
use App\Http\Middleware\CheckRole;
use App\Http\Middleware\testAge;
use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     * //全局中間件設置方式
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $middleware = [
        \Illuminate\Foundation\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,
       // CheckAge::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,
        ],

        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];

    /**
     * The application's route middleware.
     *  爲路由增加中間件
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        //自定義中間件
        'check'=>CheckAge::class,
        'test'=>testAge::class,
        'role'=>CheckRole::class
    ];
}

 

下面是自定義的一箇中間件內容

 

<?php

namespace App\Http\Middleware;

use Closure;

class CheckRole
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next,$role)
    {
       if($role!=1){
           echo '錯誤啦';
       }
        return $next($request);
    }
    ////Terminable 中間件
    ////有時中間件可能需要在 HTTP 響應發送到瀏覽器之後處理一些工作。
    ////比如,Laravel 內置的「session」中間件會在響應發送到瀏覽器之後將會話數據寫入存儲器中。
    ////如果你在中間件中定義一個 terminate 方法,則會在響應發送到瀏覽器後自動調用:
    public function terminate($request, $response)
    {
        // Store the session data...
        echo 'my is terminate';
    }
}

中間件 路由交互 基本上就是這三個文件在相互編寫設置 就可以達到中間件的作用 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章