ホームページ  >  記事  >  バックエンド開発  >  Laravel HTTPルーティング

Laravel HTTPルーティング

WBOY
WBOYオリジナル
2016-06-23 13:28:591167ブラウズ

ルーティング設定ファイル

定義: ルーティングとは、クライアントからリクエストされた URI (Uniform Resource Identifier) を解析し、設定されたルールに従って、期待される処理ロジック (リクエスト アドレスに一致する) にリクエストを振り分けることを指します。ルーティング ルール。このプロセスがルーティングです。

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

http://yourdoamin/ にアクセスすると、レンダリングされたビュー ファイル インデックスの内容は次のようになります。表示されます。これは Web サイトのホームページを作成する場合に非常に簡単で、追加のコントローラーを作成する必要はありません。もちろん、ホームページが一種の編成メソッドの一部である場合は、コントローラーを使用して実装することもできます。

静的ページに直接アクセスします:

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

アドレス http://yourdomain から about ページにアクセスします/about 、このページはビュー about ファイルで定義されます。

ルーティング設定ファイルの場所: app/Http/routes.php。ほとんどの基本的な Laravel ルートは、1 つの URI と 1 つの (クロージャー、匿名関数?) パラメーターのみを受け入れます。

クロージャー (通常はほとんど使用されません) など:

//Web サイトのルート ディレクトリにアクセスすると、hello world が出力されます

Route ::get('/', function(){
return 'Hello World';
});

基本的な get の例:

// http://ドメイン名.com/test にアクセスするための get メソッドを指定します。ルートは、/app/Http/Controllers の下にある TestController コントローラーのインデックス メソッドを指します。

Route::get('/test', 'TestController@index');

//プロジェクトが大きい場合、コントローラーは通常グループ化されます (/app/Http/Controllers ディレクトリの下に新しいグループ ディレクトリを作成するだけです) )。例: /app/Http/Controllers/shop

Route::get('/shop', 'shop/TestController@index');

ルート アクセス メソッド

ルート アクセス メソッド: get、post を指定できます。 、置く、削除する。アクセス方法を指定した場合、他の方法でアクセスするとエラーとなります。

Route::get('/', function(){
return 'Hello World';
});
Route::post('/', function(){
return 'Hello World';
}); ;
Route::put('/', function(){
return 'Hello World';
});
Route::delete('/', function(){
return 'Hello World';
}) ;

複数のアクセス方法を指定することもできます

次のように: get または post アクセスが許可されます

Route::match(['get', 'post'], '/', function(){
return ' Hello World';
});
Route::match(['get', 'post'], '/shop', 'shopShopController@index');

アクセス方法を指定してください

Route::any( 'foo ', function(){
return 'Hello World'
});
Route::any('/shop', 'shopShopController@index');

URL アドレスを取得します http://homestead.app /shop

$url = url('shop');

アクセスメソッドスプーフィング (メソッドスプーフィング)

通常、HTML フォームは PUT または DELETE リクエストをサポートしていませんが、スプーフィングによって put delete アクセスを実現できます

は HTML で使用されますフォームを呼び出すときは、hidden_​​method フィールドをフォームに追加する必要があります。 送信された _method フィールドに対応する値は、HTTP リクエスト メソッドとして扱われます

例:

<form action="/shop" method="POST">    <input type="hidden" name="_method" value="PUT"></form>

CSRF 保護

アプリケーションを CSRF (クロスサイト リクエスト フォージェリ) 攻撃から保護するために、Laravel は自動的に各ユーザーのセッションでのリクエスト にランダムなトークンを配置します。このトークンは、認証されたユーザーが実際にアプリケーションにリクエストを行ったユーザーであることを確認するために使用されます。

CSRF トークンをフォームに挿入します

<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">

テンプレートで

<input type="hidden" name="_token" value="{{ csrf_token() }}">
を使用します

POST、PUT、DELETE リクエストの CSRF トークンを手動で検証する必要はありません。

VerifyCsrfToken HTTP ミドルウェアは、セッションに保存されているリクエスト入力トークンをペアにして、トークンを自動的に検証します。

X-CSRF-TOKEN

ミドルウェアは、「POST」パラメータとして CSRF トークンを検索することに加えて、X-XSRF-TOKEN リクエスト ヘッダーもチェックします。

たとえば、トークンをメタ タグに保存し、jQuery を使用してそれをすべてのリクエスト ヘッダーに追加できます。

<meta name="csrf-token" content="{{ csrf_token() }}" />

//jQuery.ajaxSetup() メソッドは、グローバル AJAX デフォルト オプションを設定します。

$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') }});

すべての AJAX リクエストは、CSRF トークンを自動的に追加します:

$.ajax({ url: "/foo/bar",})

ルーティング パラメーター

基本的なルーティング パラメーター (パラメーターが渡されない場合、エラーが報告されます)

Route::get('/user/{id}', function($id){    return 'User '.$id;});Route::get('/shop/{id}', 'shop\ShopController@index');

コントローラー メソッド内

function index($id){    echo $id}

注: ルーティング パラメーター- 文字を含めることはできません。 (_) の代わりにアンダースコアを使用してください。

選択可能なルートパラメータ

Route::get('/shop/{id}', function($id = null){    return $id;});Route::get('/shop/{id?}', 'shop\ShopController@index'); 

コントローラメソッド内

function index($id=null){    echo $id}

デフォルト値のルートパラメータ

Route::get('/shop/{id}', function($id = 1){    return $id;});Route::get('/shop/{id?}', 'shop\ShopController@index'); 

コントローラメソッド内

function index($id=1){    echo $id}

正規表現を使用してパラメータを制限

Route::get('user/{name}', function($name){    return $name;})->where('name', '[A-Za-z]+');//限制参数只能是大小写字母Route::get('user/{id}', function($id){    return $id;})

->where('id' , '[0- 9]+');//パラメーターを数値のみに制限します

複数の条件を使用して配列を制限します

rrree

グローバル パターンを定義します

パターン メソッドを使用します。 app/Providers/RouteServiceProvider のブート メソッドでパターンを定義します:

Route::get('user/{id}/{name}', function($id, $name){    //})->where(['id' => '[0-9]+', 'name' => '[a-z]+'])

パターンを定義すると、この特定のパラメーターを使用するすべてのルートに適用されます:

Route::get('user/{id}', function($id){    // 只有 {id} 是数字才被调用。});

路由别名。(方便生成url和重定向)

Route::get('user/profile', ['as' => 'profile', function(){    //}]);

为控制器动作指定路由名称:

Route::get('shop/index', [    'as' => 'center', 'uses' => 'shop\ShopController@index']);

//控制器中使用

$url = route('center');echo $url;  // http://homestead.app/shop/index$redirect = redirect()->route('center');echo $redirect;重定向

currentRouteName 方法会返回目前请求的路由名称:$name = Route::currentRouteName();

控制器路由

控制器路由我认为主要是解决路由定义繁杂的情况,因为大型的应用业务复杂,控制器相当的多,我们不可能每一个控制器的方法都要定义一个路由。Laravel 的控制器路由可以完美解决问题

Route::controller('/', 'HomeController');

控制器方法的写法也要有所变化:

/** * 显示首页。 * * @return Response */public function getIndex(){    return view('home');}/** * 显示关于界面 * * @return Response */public function getAbout(){    return view('about');}

前缀 get,post, any 等

资源控制器

Laravel 的资源控制器原生的支持了 RESTful 架构。其实 laravel 的资源控制器和其他控制器没什么直接区别,只是对控制器类的方法和结构略有规定,不过我们并不要手动创建资源控制器,我们可以利用 laravel 的命令行工具 ?? artisan。

php artisan make:controller ArticleController

就可以创建一个名为 ArticleController 的资源控制器,文件默认在 app/Http/Controllers 下。我们打开 ArticleController.php,发现里面已经写好了许多方法,比如 index、create、show 等等。分别是什么意思?如何在路由定义才能访问到?

Route::resource('article', 'ArticleController');

访问的地址规则呢?如果你已经了解了 RESTful,再去阅读以下官方文档,基本就已经明白了。我就着上述的控制器、路由,来说明。先看一张表:

请求方法 请求 URI 对应的控制器方法 代表的意义
GET /article index 索引/列表
GET /article/create create 创建(显示表单)
POST /article store 保存你创建的数据
GET /article/{id} show 显示对应id的内容
GET /article/{id}/edit edit 编辑(显示表单)
PUT/PATCH /article/{id} save 保存你编辑的数据
DELETE /article/{id} destroy 删除

当定义了个资源路由 Route::resource(‘article’, ‘ArticleController’);。

访问地址 http://yourdomain/article ,相当于访问控制器 ArticleController 的 index 方法。

访问地址 http://yourdomain/article/create ,就会访问到 create 方法。

通过 POST 提交数据至地址 http://yourdomain/article,相当于由 store 方法处理。

路由组

中间件路由 Middleware

app/Http/Kernel.php 中的 $middleware 数组是全局中间件,也就是说,任何一条路由都会被应用这些中间件,比如里面的CSRF验证中间件。

有时候我们不需要全局中间件,这时候可以将某一个中间件注册至 app/Http/Kernel.php 文件中的 $routeMiddleware 数组,数组的键名是中间件的别名,键值是具体的中间件类,如

'auth' => 'App\Http\Middleware\AuthMiddleware'

我们在 app/Http/Kernel.php 文件中的 $routeMiddleware 数组注册了一个独立中间件,这一中间件可被单独用绑定在一个路由和路由组上。在路由定义的时候可以像这样:

Route::get('admin/profile', ['middleware' => 'auth', function(){    //}]);

当我们访问 http://yourdomain/admin/profile 的时候,首先会经过全局中间件,然后就是我们在 app/Http/Kernel.php 的 $routeMiddleware 数组中定义的名称为 auth 的中间件。

在群组共享属性数组的 middleware 参数定义中间件列表,这些中间件就会应用到群组内的所有路由上。

中间件将会按在列表内指定的顺序执行:

Route::group(['middleware' => ['foo', 'bar']], function(){        Route::get('/', function() {                // Has Foo And Bar Middleware     });        Route::get('user/profile', function() {                // Has Foo And Bar Middleware     });});

命名空间路由 Namespaces

在 group 属性数组中使用 namespace 参数,指定在这群组中控制器的命名空间:

Route::group(['namespace' => 'Admin'], function(){        // Controllers Within The "App\Http\Controllers\Admin" Namespace     Route::group(['namespace' => 'User'], function() {                // Controllers Within The "App\Http\Controllers\Admin\User" Namespace     });});

注意: 在默认情况下, app/Providers/RouteServiceProvider 包含内置您命名空间群组的 routes.php 文件,无需使用完整的 App\Http\Controllers 命名空间前缀就可以注册控制器路由。

子域名路由

Route::group(['domain' => '{account}.homestead.app'], function(){      Route::get('shop/{id}', function($account, $id) {                return 'domain:'.$account.'===='.'id:'.$id;        });});

访问:http://myapp.homestead.app/shop/users

路由前缀

Route::group(['prefix' => 'shop'], function(){        Route::get('users', function() {             //return 111;         // Matches The "/admin/users" URL     });});

访问:homestead.app/shop/users

注册一个 URL 参数到路由前缀

Route::group(['prefix' => 'shop/{account_id}'], function(){        Route::get('users', function($account_id) {                return $account_id;                //     });});

访问:homestead.app/shop/22/users

你甚至可以在前缀中为已命名的参数定义限制:

Route::group([          'prefix' => 'shop/{account_id}',             'where' => ['account_id' => '[0-9]+'],      ],      function(){            Route::get('users', function($account_id) {                    return $account_id;                    //    });});

//访问:homestead.app/shop/22/users

路由模型绑定

Laravel 模型绑定提供方便的方式将模型实体注入到您的路由中。

例如,比起注入 User ID ,你可以选择注入符合给定 ID 的 User 类实体。

使用路由的 model 方法指定特定参数要对应的类,在 app/Providers/RouteServiceProvider::boot 方法定义您的模型绑定:

public function boot(Router $router){    parent::boot($router);    $router->model('user', 'App\User');}

然后定义一个有 {user} 参数的路由:

Route::get('profile/{user}', function(App\User $user){    //});

注意: 如果在数据库中找不到匹配的模型实体,将引发 404 错误。

如果您想要自定「没有找到」的行为,将闭包作为第三个参数传入 model 方法:

Route::model('user', 'User', function(){    throw new NotFoundHttpException;});

如果您想要使用您自己决定的逻辑,您应该使用 Route::bind方法。

闭包通过 bind 方法将传递 URI 区段数值,并应该返回您想要被注入路由的类实体:

Route::bind('user', function($value){    return User::where('name', $value)->first();});

抛出 404 错误

Route::get('/shop/{id}', function($id){    //return 'User '.$id;    abort(404);});

在控制器使用 abort 辅助函数手动触发 404 错误。

abort(404);

自定义错误页面

resources/views/errors/404.blade.php

版权声明:本文为博主原创文章,未经博主允许不得转载。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。