路由文件 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';
}
}
中間件 路由交互 基本上就是這三個文件在相互編寫設置 就可以達到中間件的作用