跟我學Laravel之路由_php執行個體

來源:互聯網
上載者:User
基本路由

應用中的大多數路都會定義在 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;
});

用Regex限定的路由參數

複製代碼 代碼如下:
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]+'))

定義全域模式

如果希望在全域範圍用指定Regex限定路由參數,可以使用 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' => 'UserController@showProfile'));

為路由綁定多個過濾器

複製代碼 代碼如下:
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' => 'UserController@showProfile'));

現在,你可以使用路由名稱來建立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。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.