laravelのルーティングは/routes/web.phpファイルで定義されています
1. カスタムルーティングファイル
1. ルート ディレクトリに新しいルーティング ファイルを作成し、Illuminate\Support\Facades\Route をインポートします。
2. ルーティング ファイルを登録し、app\Providers\RouteServiceProvider.php にメソッドを記述して呼び出します。
ルート登録
protected function mapLyRoutes()
{
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/ly.php'));//路由文件地址
}
マップメソッドの呼び出し
/**
* Define the routes for the application.
*
* @return void
*/
public function map()
{
$this->mapApiRoutes();
$this->mapWebRoutes();
$this->mapLyRoutes();
}
2. ルーティングを使用する
[CSRF 保護に注意]:
ルーティングは CSRF 保護を提供するため、上記の機能を実装するにはミドルウェアの CSRF 部分をコメント アウトする必要があります:
CSRF 保護: Web ルーティング ファイルで定義された POST、PUT、または DELETE ルートを指す任意の HTML フォームshould
CSRF トークン フィールドを含める必要があります。含めない場合、リクエストは拒否されます。
または、ルートにホワイトリストを書き込みます [app\Http\Middleware\VerifyCsrfToken.php ファイルにルート名を書き込みます]
1. ルーティング識別子の追加
\Http\Middleware\VerifyCsrfToken.php;
<?php
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| 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::post('ceshi', function () {
return '我是post方法';
});
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
class VerifyCsrfToken extends Middleware
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
//
'ceshi',
];
}
2. ミドルウェアの CSRF 部分についてのコメント
\app\Http\Kernel.php
/**
* 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,//注释掉这个CSRF 部分
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
ルーターを使用すると、あらゆる HTTP リクエストに応答するルートを登録できます。
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
# ルーティングメソッドのルーティング識別クロージャ
Route::get('foo', function () { return 'Hello World'; }); # コントローラにルーティングすることもできます: app\Http\Controllers\HelloController の hello にルートしますコントローラーメソッドRoute::get('foo', 'HelloController@hello');場合によっては、複数の HTTP リクエストに応答できるルートを登録する必要がある場合があります。この場合、match メソッドを使用するすべての HTTP リクエストに応答するルートを実装する
# 能匹配到数组中的任意一种方式
Route::match(['get', 'post'], '/', function () {
//
});
# 能匹配到任意一种方式
Route::any('/', function () {
//
});
3. ルーティングパラメータ
3.1 必須パラメータ
場合によっては、ルーティングでいくつかの URL フラグメントをキャプチャする必要があります。たとえば、URL からユーザーの ID を取得するには、ルート パラメーターを定義します
。
Route::get('user/{id}', function ($id) {
return 'User '.$id;
});
上記メソッドは http://lbl.com/user/1 からアクセスできます。1 は id の値を表します。アクセス時にパラメータを渡さないとエラーになります。
このパラメータは必ず渡す必要があります。
必要に応じてルート内に複数のパラメータを定義することもできます [注: 渡される最初のパラメータはパラメータ リストの最初のパラメータに対応し、
名前とは関係ありません]:
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
//
});
3.2 オプションのパラメータ
場合によっては、ルート パラメーターを指定する必要がありますが、このパラメーターをオプションにしたい場合があります。パラメータの後に追加できますか? これを実現するには
、ルートの対応する変数にデフォルト値があることが前提となります。
Route::get('user/{name?}', function ($name = null) {
return $name;
});
上記のコンテンツには、http://lbl.com/user および http://lbl.com/user/hello を通じてアクセスされます。オプションで name パラメータを渡すことができます
。
3.3. ルーティングの規則性
3.3.1 正規表現の制約
ルート インスタンスの where メソッドを使用して、ルート パラメーターの形式を制限できます。where メソッドは、パラメーター名と、
パラメーターの制約方法を定義する正規表現を受け入れます。
// 使用正则表达式限定 name 参数必须是字母的
Route::get('user/{name}', function ($name) {
//
})->where('name', '[A-Za-z]+');
Route::get('user/{name}/{age}', function ($name) {
//
})->where(['name'=>'[A-Za-z]+','age'=>'[1-10]+']);
上記のコンテンツには http://lbl.com/user/hello からアクセスできますが、http://lbl.com/user/123 からはアクセスできません。
3.3.2 グローバル制約
特定のルーティング パラメータを同じ正規表現制約に従わせたい場合は、pattern メソッドを使用して、
\app\Providers\RouteServiceProvider.php のブート メソッドで次のパターンを定義します。
public function boot()
{
Route::pattern('name','[a-z]+');
parent::boot();
}
定義すると、これらのルールは、このパラメータ名を使用するすべてのルートに自動的に適用されます。
3.4
ルートの名前付け: 指定したルートの URL またはリダイレクトを簡単に生成できます。
ルート名は、ルート定義で name メソッドを連鎖させることで指定できます。
Route::get('getu', function () {
return \route('user');// 生成命名路由的URL
// return redirect()->route('user'); // 也可以快速重定向到 user
});
Route::get('user', function () {
return '路由标识';
})->name('user');
3.5.ルーティンググループ
ルート グループを使用すると、ミドルウェアや名前空間などのルート属性をルートごとに個別に定義することなく、多数のルート間で共有できます
。共有プロパティは、Route::group メソッドの最初のパラメーターで配列として渡す必要があります。以下は、一般的に使用される共有属性の詳細な説明です
。
2.5.1 ミドルウェア
ミドルウェアの作成
コマンド: php 職人 make:middleware ミドルウェア名
ミドルウェアが作成されると、デフォルトで app\Http\Middleware ディレクトリに配置されます。また、作成したミドルウェアは
app\Http\Kernel.phpファイルに登録して使用する必要があります。
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'test' => \App\Http\Middleware\Test::class,//注册中间件
];
登録後、ルーティングでミドルウェアのコンテンツを使用できるようになります。
namespace App\Http\Middleware;
use Closure;
class Test
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$request->name ='张三';
return $next($request);
}
}
Route::middleware(['test'])->group(function (){
Route::get('ceshi',function (\Illuminate\Http\Request $request){
return $request->name;
});
});
このミドルウェアを使用するすべてのルートは、最初にミドルウェアのコンテンツを実行します。
3.5.2. 名前空間
もう 1 つの一般的な使用例は、名前空間メソッドを使用して、ルーティング グループ内のすべてのコントローラーに同じ PHP 名前空間を割り当てることです。
Route::namespace('Admin')->group(function (){
Route::get('useri',function(){
return 'Admin1';
});
Route::get('userh',function(){
return 'Admin2';
});
});
Index メソッドと hello メソッドには、それぞれ http://lbl.com/useri と http://lbl.com/userh を通じてアクセスできます。
3.5.3. ルーティングプレフィックス
プレフィックスメソッドを使用して、ルーティンググループで指定された URL にプレフィックスを追加できます。たとえば、
グループ内のすべてのルートの URI に admin という接頭辞を付けることができます。
Route::prefix('admin')->group(function () {
Route::get('users', function () {
//
});
});
アクセスするときは、このルーティング グループの下のすべてのルートに admin http://lbl.com/admin/users というプレフィックスを付ける必要があります。
name メソッドを使用すると、ルート グループ内の各ルート名に特定の文字列を追加できます。
ここでは、ルート ID ではなくルート名が接頭辞として付けられることに注意してください。たとえば、すべてのルート名に admin というプレフィックスを付けたいとします。
Route::name('admin.')->group(function (){
Route::get('users',function (){
return 'users';
})->name('users');
Route::get('goods',function (){
return 'goods';
})->name('goods');;
});
Route::get('ceshi',function (){
return redirect()->route('admin.users'); // 也可以快速重定向到 users
});
3.5.4. ルーティンググループ
上記の内容は、Route::group メソッドの最初のパラメーターに配列の形式で渡すことも、組み合わせてネストして
使用することもできます。
Route::group(['namespace'=>'admin','prefix'=>'pre'],function(){
Route::middleware('first')->group(function(){
Route::get('users','AdminController@index');
});
});
3.6. フォールバックルーティング
Route::fallback メソッドを使用すると、受信リクエストに一致するルートが他にない場合にのみ実行されるルートを定義できます。
Route::fallback(function (){
return '未找到此地址';
});