1. 程式人生 > >Laravel之路由 Route::get/post/any、路由引數、過濾器、命名、子域名、字首、與模型繫結、丟擲 404 錯誤、控制器

Laravel之路由 Route::get/post/any、路由引數、過濾器、命名、子域名、字首、與模型繫結、丟擲 404 錯誤、控制器

基本路由

應用中的大多數路都會定義在 app/routes.php 檔案中。最簡單的Laravel路由由URI和閉包回撥函式組成。

基本 GET 路由

程式碼如下:


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

基本 POST 路由

程式碼如下:


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

註冊一個可以響應任何HTTP動作的路由

程式碼如下:


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

僅支援HTTPS的路由

程式碼如下:


Route::get('foo', array('https', function()
{
    return 'Must be over HTTPS';
}));

實際開發中經常需要根據路由生成 URL,URL::to方法就可以滿足此需求:

$url = URL::to('foo');

路由引數

程式碼如下:


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

可選路由引數

程式碼如下:


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

帶有預設值的可選路由引數

程式碼如下:


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

用正則表示式限定的路由引數

程式碼如下:


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(array('id' => '[0-9]+', 'name' => '[a-z]+'))

定義全域性模式

如果希望在全域性範圍用指定正則表示式限定路由引數,可以使用 pattern 方法:

程式碼如下:


Route::pattern('id', '[0-9]+');

Route::get('user/{id}', function($id)
{
    // Only called if {id} is numeric.
});

訪問路由引數

如果想在路由範圍外訪問路由引數,可以使用 Route::input 方法:

程式碼如下:


Route::filter('foo', function()
{
    if (Route::input('id') == 1)
    {
        //
    }
});

路由過濾器

路由過濾器提供了非常方便的方法來限制對應用程式中某些功能訪問,例如對於需要驗證才能訪問的功能就非常有用。Laravel框架自身已經提供了一些過濾器,包括 auth過濾器、auth.basic過濾器、guest過濾器以及csrf過濾器。這些過濾器都定義在app/filter.php檔案中。

定義一個路由過濾器

程式碼如下:


Route::filter('old', function()
{
    if (Input::get('age') < 200)
    {
        return Redirect::to('home');
    }
});

如果從路由過濾器中返回了一個response,那麼該response將被認為對應的是此次request,路由將不會被執行,並且,此路由中所有定義在此過濾器之後的程式碼也都不會被執行。

為路由繫結過濾器

程式碼如下:


Route::get('user', array('before' => 'old', function()
{
    return 'You are over 200 years old!';
}));

將過濾器繫結為控制器Action

程式碼如下:


Route::get('user', array('before' => 'old', 'uses' => '[email protected]'));

為路由繫結多個過濾器

程式碼如下:


Route::get('user', array('before' => 'auth|old', function()
{
    return 'You are authenticated and over 200 years old!';
}));

指定過濾器引數

程式碼如下:


Route::filter('age', function($route, $request, $value)
{
    //
});

Route::get('user', array('before' => 'age:200', function()
{
    return 'Hello World';
}));

所有其後的過濾器將接收到 $response作為第三個引數:

程式碼如下:


Route::filter('log', function($route, $request, $response, $value)
{
    //
});

基於模式的過濾器

你也可以指標對URI為一組路由指定過濾器。

程式碼如下:


Route::filter('admin', function()
{
    //
});

Route::when('admin/*', 'admin');

上述案例中,admin過濾器將會應用到所有以admin/開頭的路由中。星號是萬用字元,將會匹配任意多個字元的組合。

還可以針對HTTP動作限定模式過濾器:

程式碼如下:


Route::when('admin/*', 'admin', array('post'));

過濾器類

過濾器的高階用法中,還可以使用類來替代閉包函式。由於過濾器類是通過IoC container實現解析的,所有,你可以在這些過濾器中利用依賴注入(dependency injection)的方法實現更好的測試能力。

定義一個過濾器類

程式碼如下:


class FooFilter {

    public function filter()
    {
        // Filter logic...
    }

}

註冊過濾器類

程式碼如下:


Route::filter('foo', 'FooFilter');

命名路由

重定向和生成URL時,使用命名路由會更方便。你可以為路由指定一個名字,如下所示:

程式碼如下:


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

還可以為 controller action指定路由名稱:

程式碼如下:


Route::get('user/profile', array('as' => 'profile', 'uses' => '[email protected]'));

現在,你可以使用路由名稱來建立URL和重定向:

程式碼如下:


$url = URL::route('profile');

$redirect = Redirect::route('profile');

可以使用currentRouteName方法來獲取當前執行的路由名稱:

程式碼如下:


$name = Route::currentRouteName();

路由組

有時你可能需要為一組路由應用過濾器。使用路由組就可以避免單獨為每個路由指定過濾器了:

程式碼如下:


Route::group(array('before' => 'auth'), function()
{
    Route::get('/', function()
    {
        // Has Auth Filter
    });

    Route::get('user/profile', function()
    {
        // Has Auth Filter
    });
});

子域名路由

Laravel中的路由功能還支援萬用字元子域名,你可以在域名中指定萬用字元引數:

註冊子域名路由

程式碼如下:


Route::group(array('domain' => '{account}.myapp.com'), function()
{

    Route::get('user/{id}', function($account, $id)
    {
        //
    });

});

路由字首

可以通過prefix屬性為組路由設定字首:

為路由組設定字首

程式碼如下:


Route::group(array('prefix' => 'admin'), function()
{

    Route::get('user', function()
    {
        //
    });

});

路由與模型繫結

模型繫結,為在路由中注入模型例項提供了便捷的途徑。例如,你可以向路由中注入匹配使用者ID的整個模型例項,而不是僅僅注入使用者ID。首先,使用 Route::model 方法指定要被注入的模型:

將參一個模型

Route::model('user', 'User');
然後,定義一個包含{user}引數的路由:

程式碼如下:


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

由於我們已將{user}引數繫結到了User模型,因此可以向路由中注入一個User例項。例如,對profile/1的訪問將會把ID為1的User例項注入到路由中。

注意: 如果在資料庫中無法匹配到對應的模型例項,404錯誤將被丟擲。
如果你希望自定義"not found"行為,可以通過傳遞一個閉包函式作為 model 方法的第三個引數:

程式碼如下:


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

如果你想自己實現路由引數的解析,只需使用Route::bind方法即可:

程式碼如下:


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

丟擲 404 錯誤

有兩種從路由中手動觸發404錯誤的方法。首先,你可以使用App::abort方法:

程式碼如下:


App::abort(404);

其次,你可以丟擲Symfony\Component\HttpKernel\Exception\NotFoundHttpException異常。

更多關於處理404異常以及錯誤發生時自定義response的資訊可以檢視錯誤文件。

控制器路由

Laravel不光提供了利用閉包函式處理路由的功能,還可以路由到控制器,甚至支援建立 resource controllers。

相關推薦

Laravel路由 Route::get/post/any路由引數過濾器命名域名字首模型 404 錯誤控制器

基本路由 應用中的大多數路都會定義在 app/routes.php 檔案中。最簡單的Laravel路由由URI和閉包回撥函式組成。 基本 GET 路由 程式碼如下: Route::get('/', function() {     return 'Hello World'

Express路由獲取get/post引數的方法

post方法通過body獲取。req.body即可獲取引數。app.use(bodyParser.urlencoded({extended: true})) *必須新增注意要使用bodyParser,否則req.body為空。get方法通過params獲取。請求時需將引數寫在

AspNetCore 檔案上傳(模型Ajax) 兩種方式 get到了嗎?

就目前來說,ASP.NET Core2.1了,已經相當成熟了,希望下個專案爭取使用吧!! 上傳檔案的三種方式("我會的,說不定還有其他方式") 模型繫結 Ajax WebUploader 一。模型繫結   官方機器翻譯的地址:https://docs.microsoft.com/en-us

node的express框架接收get/post請求時,引數獲取方式

一.接收get請求 情況一:引數是url的一部分: 1 eg:router.get('/nodeServer/dataSet/page/:name/:pageNum/:pageSize', function(request, resopnse){ 2 // 獲取引數name , pageNum

iOS開發WebView怎麼載入post請求並且傳引數

      由於種種因素,現在國內的移動開發大都是原生和html5混合開發, 那麼iOS端的UIWebView和WKWebView就啟到了非常重要的作用! 而從我們原生頁面跳轉的web頁面的時候我們往

Android通過Get,Post,HttpClient方式提交引數給伺服器

package cn.itcast.net; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL;

【vue大師晉級路第一集:Vue基礎】第5章——Class Style

Class 與 Style 繫結 操作元素的 class 列表和內聯樣式是資料繫結的一個常見需求。因為它們都是屬性,所以我們可以用 v-bind 處理它們:只需要通過表示式計算出字串結果即可。不過,字串拼接麻煩且易錯。因此,在將 v-bind 用於 class 和 style 時,Vue

C++中的動態型別動態虛擬函式執行時多型的實現【轉】

(轉自:https://blog.csdn.net/iicy266/article/details/11906509) 動態型別與靜態型別 靜態型別          是指不需要考慮表示式的執行期語

【常用】查詢輸入框:一個關鍵字多個屬性(包括intstring不同的型別)

從input獲取輸入一個待查詢關鍵字key,前端不區分,傳到後臺再進行處理,基本邏輯如下: //根據訂單號(int)或者供應商名稱(string)查詢訂單 if (!string.IsNullOrEmpty(key)) { var Id = MathTools.ToInt(key);

golangWeb框架---github.com/gin-gonic/gin學習八(監聽多埠多型別的struct模型)

監聽多埠 如何利用gin實現監聽多埠 package main import ( "log" "net/http" "time" "github.com/gin-gonic/gin" "golang.org/x/sync/errgroup" )

11:類常量魔術變數抽象類延遲

常量、類常量、魔術變數 普通常量:define(‘常量名’,‘常量值’); 全域性可訪問 值不可改變 類常量:const 常量名 = 常量值; 在PHP7中 類內可以訪問,類外則根據許可權的不同而定

net MVC中的模型驗證以及ModelState

模型繫結 模型繫結應該很容易理解,就是傳遞過來的資料,建立對應的model並把資料賦予model的屬性,這樣model的欄位就有值了。 比如要建立使用者,在form表單中填寫使用者名稱密碼,在controller中直接使用User類接收就行了: publi

python面向物件程式設計封裝-方法方法

1.繫結方法    特性:繫結給誰就應該由誰來呼叫,誰來呼叫就會將誰當做第一個引數自動傳入    (精髓在於自動傳入)    繫結方法分為兩類:        1.繫結給物件方法            在類內部定義的函式(沒有被任何封裝器修飾的),預設就是繫結給物件用的   

Vue.js基礎學習(三Class Style

Class 與 Style 繫結 Class 與 Style 繫結 1.建立一個 Vue 例項 1.1 物件語法 1.2 陣列語法 1.3 用在元件上 2.繫結內聯樣式 2.1

面向物件方法方法

一 類中定義的函式分成兩大類 一:繫結方法(繫結給誰,誰來呼叫就自動將它本身當作第一個引數傳入):     1. 繫結到類的方法:用classmethod裝飾器裝飾的方法。                 為類量身定製                 類.boud_method(),自動將類當作第一個

C++中的動態型別動態虛擬函式執行時多型的實現

動態型別與靜態型別 靜態型別          是指不需要考慮表示式的執行期語義,僅分析程式文字而決定的表示式型別。靜態型別僅依賴於包含表示式的程式文字的形式,而在程式執行時不會改變。通俗的講,就是上下文無關,在編譯時就可以確定其型別。 動態型別         是指由一個

.NET各大平臺數據列表控制元件原理及比較(WebFormWinformWPF)

說說WebForm: 資料列表控制元件:WebForm 下的列表繫結控制元件基本就是GridView、DataList、Repeater;當然還有其它DropDownList、ListBox等。 它們的共同的設定資料來源方法:XXX.DataSource=資料來源。 那麼這個

前端UI框架——VueAPI使用Class Style

一、基本介紹 1、繫結 HTML Class  字串語法  物件語法  陣列語法  2、繫結內聯樣式——Style  物件語法 二、程式碼示例: 1、class(字串) 程式碼案例: <!DOCTYPE html> <html lang="en"&

winform,DataGridView資料後更改列屬性動態建立(用一個控制元件顯示多表適用)

DataGridView 特效 = new DataGridView(); string[] 列名 = { "直線", "炸彈", "骷髏", "禮盒" },

Mybatis深入原始碼分析Mapper介面原理原始碼分析

緊接上篇文章:Mybatis深入原始碼分析之SqlSessionFactoryBuilder原始碼分析,這裡再來分析下,Mappe