99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

基礎(chǔ) ―― HTTP路由

2018-02-24 15:38 更新

基礎(chǔ) —— HTTP 路由

1、基本路由

大部分路由都定義在被App\Providers\RouteServiceProvider類(lèi)載入的app/Http/routes.php文件中。

最基本的Laravel路由接收一個(gè)URI和一個(gè)閉包:

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

Route::post('foo/bar', function () {
    return 'Hello World';
});

Route::put('foo/bar', function () {
    //
});

Route::delete('foo/bar', function () {
    //
});

為多個(gè)動(dòng)作注冊(cè)路由

有時(shí)候需要注冊(cè)一個(gè)路由來(lái)響應(yīng)多個(gè)不同的HTTP動(dòng)作,你可以使用Route門(mén)面match方法來(lái)實(shí)現(xiàn):

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

或者,還可以使用any方法注冊(cè)一個(gè)路由響應(yīng)所有HTTP動(dòng)作:

Route::any('foo', function () {
    return 'Hello World';
});

生成路由對(duì)應(yīng)的URLs

可以使用幫助函數(shù)url來(lái)生成路由對(duì)應(yīng)的URLs:

$url = url('foo');

2、路由參數(shù)

2.1 必選參數(shù)

有時(shí)我們需要在路由中捕獲URI片段,比如,如果想要從URL中捕獲用戶(hù)ID,可以通過(guò)如下方式定義路由參數(shù):

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

可以按需要定義在路由中定義多個(gè)路由參數(shù):

Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
    //
});

路由參數(shù)總是通過(guò)花括號(hào)進(jìn)行包裹,參數(shù)在路由被執(zhí)行時(shí)會(huì)被傳遞到路由的閉包。

注意:路由參數(shù)不能包含’-‘字符,需要的話可以使用_替代。

2.2 可選參數(shù)

有時(shí)候可能需要指定路由參數(shù),并且使得該路由參數(shù)是可選的,可以通過(guò)在參數(shù)名后加一個(gè)?來(lái)標(biāo)記:

Route::get('user/{name?}', function ($name = null) {
    return $name;
});

Route::get('user/{name?}', function ($name = 'John') {
    return $name;
});

2.3 正則約束

可以使用路由實(shí)例上的where方法來(lái)約束路由參數(shù)的格式。where方法接收參數(shù)名和一個(gè)正則表達(dá)式來(lái)定義該參數(shù)如何被約束:

Route::get('user/{name}', function ($name) {
    //
})->where('name', '[A-Za-z]+');

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

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

2.3.1 全局約束

如果想要路由參數(shù)在全局范圍內(nèi)被給定正則表達(dá)式約束,可以使用pattern方法??梢栽?code>RouteServiceProvider類(lèi)的boot方法中定義約束模式:

/**
 * 定義路由模型綁定,模式過(guò)濾器等
 *
 * @param  \Illuminate\Routing\Router  $router
 * @return void
 * @translator  http://laravelacademy.org
 */
public function boot(Router $router){
    $router->pattern('id', '[0-9]+');
    parent::boot($router);
}

一旦模式被定義,將會(huì)自動(dòng)應(yīng)用到所有包含該參數(shù)名的路由中。

擴(kuò)展閱讀:實(shí)例教程——HTTP路由實(shí)例教程(一)—— 基本使用及路由參數(shù)

3、命名路由

命名路由使生成URLs或者重定向到指定路由變得很方便,在定義路由時(shí)指定路由名稱(chēng),然后使用數(shù)組鍵as指定路由別名:

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

還可以為控制器動(dòng)作指定路由名稱(chēng):

Route::get('user/profile', [
    'as' => 'profile', 'uses' => 'UserController@showProfile'
]);

3.1?路由分組?& 命名路由

如果你在使用路由分組,可以在路由分組屬性數(shù)組中指定as關(guān)鍵字來(lái)為分組中的路由設(shè)置一個(gè)共用的路由名前綴:

Route::group(['as' => 'admin::'], function () {
    Route::get('dashboard', ['as' => 'dashboard', function () {
        // 路由被命名為 "admin::dashboard"
    }]);
});

3.2 為命名路由生成URLs

一旦你為給定路由分配了名字,通過(guò)route函數(shù)生成URLs時(shí)就可以使用路由名字:

$url = route('profile');
$redirect = redirect()->route('profile');

如果路由定義了參數(shù),可以將路由參數(shù)作為第二個(gè)參數(shù)傳遞給route函數(shù)。給定的路由參數(shù)將會(huì)自動(dòng)插入U(xiǎn)RL中:

Route::get('user/{id}/profile', ['as' => 'profile', function ($id) {
    //
}]);
$url = route('profile', ['id' => 1]);

4、路由分組

路由分組允許我們?cè)诙鄠€(gè)路由中共享路由屬性,比如中間件等,這樣的話一大波共享屬性的路由就不必再各自定義這些屬性。共享屬性以數(shù)組的形式被作為第一個(gè)參數(shù)傳遞到Route::group方法中。

想要了解更多路由分組,我們希望通過(guò)幾個(gè)簡(jiǎn)單的應(yīng)用實(shí)例來(lái)展示其特性。

4.1 中間件

要分配中間件給分組中的所有路由,可以在分組屬性數(shù)組中使用middleware鍵。中間件將會(huì)按照數(shù)組中定義的順序依次執(zhí)行:

Route::group(['middleware' => 'auth'], function () {
    Route::get('/', function ()    {
        // 使用 Auth 中間件
    });

    Route::get('user/profile', function () {
        // 使用 Auth 中間件
    });
});

4.2 命名空間

另一個(gè)通用的例子是路由分組分配同一個(gè)PHP命名空間給多個(gè)控制器,可以在分組屬性數(shù)組中使用namespace參數(shù)來(lái)指定分組中控制器的命名空間:

Route::group(['namespace' => 'Admin'], function(){
    // 控制器在 "App\Http\Controllers\Admin" 命名空間下

    Route::group(['namespace' => 'User'], function()
    {
        // 控制器在 "App\Http\Controllers\Admin\User" 命名空間下
    });
});

默認(rèn)情況下,RouteServiceProvider包含routes.php并指定其所在命名空間,因此,我們只需要指定命名空間的App\Http\Controllers之后的一部分。

4.3?子域名路由

路由分組還可以被用于子域名路由通配符,子域名可以像URIs一樣被分配給路由參數(shù),從而允許捕獲子域名的部分用于路由或者控制器,子域名可以通過(guò)分組屬性數(shù)組中的domain鍵來(lái)指定:

Route::group(['domain' => '{account}.myapp.com'], function () {
    Route::get('user/{id}', function ($account, $id) {
        //
    });
});

4.4 路由前綴

屬性prefix可以用來(lái)為分組中每個(gè)給定URI添加一個(gè)前綴,比如,你想要為所有路由URIs前面添加前綴admin

Route::group(['prefix' => 'admin'], function () {
    Route::get('users', function ()    {
        // 匹配 "/admin/users" URL
    });
});

你還可以使用prefix參數(shù)為分組路由指定公共參數(shù):

Route::group(['prefix' => 'accounts/{account_id}'], function () {
    Route::get('detail', function ($account_id)    {
        // 匹配 accounts/{account_id}/detail URL
    });
});

擴(kuò)展閱讀:實(shí)例教程——HTTP路由實(shí)例教程(二)—— 路由命名和路由分組

5、防止CSRF攻擊

5.1?簡(jiǎn)介

Laravel使得防止應(yīng)用遭到跨站請(qǐng)求偽造攻擊變得簡(jiǎn)單??缯菊?qǐng)求偽造是一種通過(guò)偽裝授權(quán)用戶(hù)的請(qǐng)求來(lái)利用授信網(wǎng)站的惡意漏洞。

Laravel自動(dòng)為每一個(gè)被應(yīng)用管理的有效用戶(hù)Session生成一個(gè)CSRF“令牌”,該令牌用于驗(yàn)證授權(quán)用戶(hù)和發(fā)起請(qǐng)求者是否是同一個(gè)人。想要生成包含CSRF令牌的隱藏輸入字段,可以使用幫助函數(shù)csrf_field來(lái)實(shí)現(xiàn):

<?php echo csrf_field(); ?>

幫助函數(shù)csrf_field生成如下HTML:

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

當(dāng)然還可以使用Blade模板引擎提供的方式:

{!! csrf_field() !!}

你不需要了解在POST、PUT或者DELETE請(qǐng)求時(shí)CSRF令牌是如何進(jìn)行驗(yàn)證的,HTTP中間件VerifyCsrfToken會(huì)為我們做這項(xiàng)工作:將請(qǐng)求中輸入的token值和session中的存儲(chǔ)的作對(duì)比。

5.2 從CSRF保護(hù)中排除URIs

有時(shí)候我們想要從CSRF保護(hù)中排除一些URIs,比如,如果你在使用Stripe來(lái)處理支付并用到他們的webhook系統(tǒng),這時(shí)候你就需要從Laravel的CSRF保護(hù)中排除webhook處理器路由。

你可以通過(guò)在VerifyCsrfToken中間件中將要排除的URIs添加到$except屬性:

<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;

class VerifyCsrfToken extends BaseVerifier
{
    /**
     *從CSRF驗(yàn)證中排除的URL
     *
     * @var array
     */
    protected $except = [
        'stripe/*',
    ];
}

5.3 X-CSRF-Token

除了將CSRF令牌作為一個(gè)POST參數(shù)進(jìn)行檢查,Laravel的VerifyCsrfToken中間件還會(huì)檢查X-CSRF-TOKEN請(qǐng)求頭,你可以將令牌保存在”meta”標(biāo)簽中:

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

創(chuàng)建完這個(gè)meta標(biāo)簽后,就可以在js庫(kù)如jQuery中添加該令牌到所有請(qǐng)求頭,這為基于AJAX的應(yīng)用提供了簡(jiǎn)單、方便的方式來(lái)避免CSRF攻擊:

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

5.4 X-XSRF-Token

Laravel還將CSRF令牌保存到了名為XSRF-TOKEN的cookie中,你可以使用該cookie值來(lái)設(shè)置X-XSRF-TOKEN請(qǐng)求頭。一些JavaScript框架,比如Angular,將會(huì)為你自動(dòng)進(jìn)行設(shè)置,基本上你不太會(huì)手動(dòng)設(shè)置這個(gè)值。

擴(kuò)展閱讀:實(shí)例教程——HTTP路由實(shí)例教程(三)—— CSRF攻擊原理及其防護(hù)

6、表單方法偽造

HTML表單不支持PUT、PATCH或者DELETE動(dòng)作,因此,當(dāng)定義被HTML表單調(diào)用的PUT、PATCHDELETE路由時(shí),需要添加一個(gè)隱藏的_method字段到給表單中,其值被用作HTTP請(qǐng)求方法名:

<form action="/foo/bar" method="POST">
    <input type="hidden" name="_method" value="PUT">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>

7、拋出404錯(cuò)誤

有兩者方法手動(dòng)從路由觸發(fā)404錯(cuò)誤。

第一種,使用幫助函數(shù)abort,abort函數(shù)會(huì)拋出一個(gè)指定狀態(tài)碼的Symfony\Component\HttpFoundation\Exception\HttpException

abort(404);

第二種,手動(dòng)拋出Symfony\Component\HttpKernel\Exception\NotFoundHttpException.的實(shí)例。

更多關(guān)于處理404異常的信息以及如何自定義視圖顯示這些錯(cuò)誤信息,請(qǐng)查看錯(cuò)誤文檔一節(jié)。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)