HTTP层 —— 路由

Laravel框架在PHP开荒中应用非常周围,本文首要对Laravel框架中的路由设置作详细的牵线,Laravel的路由配置特别灵活,怎么着设置好路由对PHP应用来讲也是生机勃勃对风度翩翩关键的。

php Laravel框架学习(三State of Qatar 之 路由 

正文将指导我们齐声上学 Laravel 路由的连锁文化!

 

澳门新浦京手机版 1

基本路由

您的应用程序的绝大多数路由将要 app/routes.php 文件中定义。Laravel
中最轻便易行的路由由贰个 U翼虎I 和三个闭包调用组成。

基本 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'; }));

每每您要求依附路由发生 U哈弗Ls,您能够因而接受 URL::to 方法:

$url = URL::to('foo');
1、基本路由

最大旨的 Laravel
路由只接到三个 UPAJEROI
和一个闭包,并以此提供三个特轻易且高贵的定义路由艺术:

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

默许路由文件

抱有Laravel路由都定义位于routes目录下的路由文件中,那么些文件通过框架自动加载。routes/web.php文件定义了web分界面包车型地铁路由,那一个路由被分配给web中间件组,从而能够提供session和csrf防护等效果。routes/api.php中的路由是无状态的,被分配到api中等件组。

对大多数行使来说,都以从 routes/web.php 文件初叶定义路由。

得力的路由方法

我们得以注册路由来响应任何 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);

有的时候候还索要注册路由响应多少个 HTTP 乞请——那足以透过 match
方法来促成。大概,能够应用 any 方法注册多个路由来响应全数 HTTP 须要:

Route::match(['get', 'post'], '/', function () {
    //
});
Route::any('foo', function () {
    //
});

CSRF防护

web路由文件中具备哀求方式为PUTPOSTDELETE的HTML表单都会包蕴四个CSTucsonF令牌字段,不然,央求会被驳倒。关于CSXC90F的更加多细节,可以参见其文档:

<form method="POST" action="/profile">
    {{ csrf_field() }}
    ...
</form>

基本路由

路由参数

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]+');
2、路由参数

您的应用程序的超越一半路由将要 app/routes.php 文件中定义。Laravel
中最简便的路由由多少个 U揽胜极光I 和叁个闭包调用组成。

路由过滤器

路由过滤器提供了生龙活虎种约束访谈钦命路由的简易的方式,那在您必要为你的站点创造供给表明区域的时候极度实用。Laravel
框架中含有了有个别路由过滤器,譬如 auth 过滤器、auth.basic
过滤器、guest 过滤器、以及 csrf
过滤器。它们被贮存在app/filters.php 文件中。

概念八个路由过滤器

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

假诺二个响应从一个路由过滤器中回到,这几个响应即被以为是其生龙活虎央浼的响应,路由将不被试行,任何有关那一个路由的
after 过滤器也将被注销施行。

为叁个路由内定叁个路由过滤器

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

为一个路由钦命七个路由过滤器

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) {     // });

基本路由过滤器的格局

您恐怕希望依据 U大切诺基I 为黄金时代组路由钦赐过滤器。

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

在上头的例子中,admin 过滤器将接收带全数以 admin/
开端的路由。星号作为叁个通配符,将适配到具有字符的咬合。

你也足以因而点名 HTTP 方法节制格局过滤器:

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

过滤器类

对于高档次和品级的过滤器,您能够行使二个类取代闭包函数。因为过滤器类是放在应用程序之外的
IoC 容器,您能够在过滤器中使用信任注入,更易于测量检验。

概念一个过滤器类

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

注册二个基于类的过滤器

Route::filter('foo', 'FooFilter');
必选参数

突发性大家须要在路由中捕获 URAV4I 片段。譬如,要从
URL 中抓获客户ID,需求通过如下格局定义路由参数:

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

能够按必要在路由中定义多少个路由参数:

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

路由参数总是通过花括号实行李包裹装,那几个参数在路由被实行时会被传送到路由的闭包。

留意:路由参数无法包罗 - 字符,须要的话可以行使 _ 替代。

基本 GET 路由

命名路由

命名路由在更易于在变化跳转或 UEscortLs
时钦赐路由。您能够像这么为路由钦定一个名字:

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

您也足以为调控器的艺术钦命路由名字:

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

今日您在生成 UPRADOLs 或跳转的时候使用路由的名字:

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

你能够采纳 currentRouteName 方法拿到三个路由的名字:

$name = Route::currentRouteName();
可选参数

临时可能需求钦命可选的路由参数,那足以因而在参数名后加一个 ?
标识来促成,这种情景下需求给相应的变量钦命私下认可值:

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

路由组

稍稍时候你可能希望选取过滤器到风流浪漫组路由。您不要求为种种路由钦点过滤器,能够接收路由组:

Route::group(array('before' => 'auth'), function() {     Route::get('/', function()     {         // Has Auth Filter     });      Route::get('user/profile', function()     {         // Has Auth Filter     }); });
3、命名路由

命名路由为生成 U牧马人L 或重定向提供了谋福。完成也相当轻易,在路由定义之后接受
name 方法链的方法来兑现:

Route::get('user/profile', function () {
    //
})->name('profile');

还足感到调控器动作钦定路由名称:

Route::get('user/profile', 'UserController@showProfile')->name('profile');

为命名路由生成UEscortL

为给定路由分配名称今后,就足以经过协理函数 route 为该命名路由生成
UXC60L:

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

要是命名路由定义了参数,能够将该参数作为第2个参数传递给 route
函数。给定的路由参数将会活动插入到 U路虎极光L 中:

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

基本 POST 路由

子域名路由

Laravel 路由也能够管理通配符的子域名,何况从域名中赢得通配符参数:

登记子域名路由

Route::group(array('domain' => '{account}.myapp.com'), function() {      Route::get('user/{id}', function($account, $id)     {         //     });  });
4、路由群组

路由群组允许我们在多少个路由中国共产党享路由属性,举例中间件和命名空间等,那样的话大家就不必为每一个路由独立定义属性。分享属性以数组的花样作为第多少个参数被传送给
Route::group 方法。

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

路由前缀

后生可畏组路由得以透过在质量数组中接纳 prefix 选项为路由组增加前缀:

为路由组增添前缀

Route::group(array('prefix' => 'admin'), function() {      Route::get('user', function()     {         //     });  });
中间件

要给路由群组中定义的全部路由分配中间件,可以在群组属性数组中使用
middleware。中间件将会奉公守法数组中定义的相继依次实施:

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

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

注册八个路由以响应全部 HTTP 方法

路由模型绑定

模型绑定提供了多少个简约的方式向路由中注入模型。例如,不止注入四个顾客的
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荒诞。

风流洒脱旦您愿意钦点您自己定义的未有找到的行为,您可以为 model
方法传递八个闭包作为第多个参数:

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

有时你愿意采纳本人的主意管理路由参数,能够运用 Route::bind 方法:

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

另一个通用的例证是路由群组分配同三个 PHP
命名空间给其下的几个调整器,能够在分组属性数组中运用
namespace来钦定群组中具备调控器的公家命名空间:

Route::group(['namespace' => 'Admin'], function(){
    // 控制器在 "AppHttpControllersAdmin" 命名空间下

    Route::group(['namespace' => 'User'], function(){
        // 控制器在 "AppHttpControllersAdminUser" 命名空间下
    });
});

默许情状下,RouteServiceProvider
引进你的路由文件并钦点其下具备调控器类所在的暗中同意命名空间AppHttpControllers,因而,大家在概念的时候只须求钦定命名空间
AppHttpControllers 之后的风度翩翩部分就能够。

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

引发404错误

有二种形式在路由中手动触发一个404错误。首先,您能够应用 App::abort
方法:

App::abort(404);

说不上,您能够抛出三个
SymfonyComponentHttpKernelExceptionNotFoundHttpException 的实例。

越来越多关于管理404那几个和为这几个错误采用应用自定义响应的信息能够在 错误
章节中找到。

子域名路由

路由群组仍是可以被用来子域名路由通配符,子域名能够像 UPAJEROI
同样被分配给路由参数,从而允许捕获子域名的有个别用以路由或许调整器,子域名能够透过群组属性数组中的
domain 来指定:

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

强逼叁个路由必得经过 HTTPS 访谈

路由至调控器

Laravel 不仅仅允许你路由至闭包,也得以路由至调节器类,以致同意创立资源支配器.

越多新闻请访谈 调整器 文书档案。

正文章摘要自:Laravel4-中文手册


路由前缀

群组属性 prefix 能够用来为群组中各类路由增多一个给定 UEscortI
前缀,比方,你可感到全部路由 UHighlanderI 增多 admin 前缀 :

Route::group(['prefix' => 'admin'], function () {
    Route::get('users', function () {
        // 匹配 "/admin/users" URL
    });
});
Route::get('foo', array('https', function()
{
    return 'Must be over HTTPS';
}));
5、路由模型绑定

流入模型ID到路由或调控器动作时,经常供给查询数据库本事博得相应的模子数据。Laravel
路由模型绑定让流入模型实例到路由变得轻巧,举例,你能够将相称给定 ID
的一切 User 类实例注入到路由中,而不是直接注入客商 ID。

平时您须求基于路由爆发 U福特ExplorerLs,您能够因此接收 UGL450L::to 方法:

隐式绑定

Laravel 会自动分析定义在路由或调整器动作(变量名相称路由局地)中的
Eloquent 模型类型申明,比方:

Route::get('api/users/{user}', function (AppUser $user) {
    return $user->email;
});

在此个事例中,由于品种注解了 Eloquent 模型 AppUser,对应的变量名
$user 会相称路由一些中的{user},那样,Laravel 会自动注入与央浼 UEscortI
中传来的 ID 对应的顾客模型实例。

即使数据库中找不到相应的模子实例,会自动生成 HTTP 404 响应。

自定义键名

假定你想要隐式模型绑定使用数据表的别样字段,能够重写 Eloquent 模型类的
getRouteKeyName 方法:

/**
 * Get the route key for the model.
 *
 * @return string
 */
public function getRouteKeyName()
{
    return 'slug';
}
$url = URL::to('foo');
显式绑定

要注册显式绑定,要求接受路由的 model
方法来为给定参数钦定绑定类。应该在 RouteServiceProvider::boot
方法中定义模型绑定:

绑定参数到模型

public function boot()
{
    parent::boot();
    $router->model('user', 'AppUser');
}

接下去,定义一个包罗 {user} 参数的路由:

$router->get('profile/{user}', function(AppUser $user) {
     //
});

由于我们已经绑定 {user} 参数到 AppUser 模型,User
实例会被注入到该路由。由此,借使必要 UKugaL 是profile/1,就能注入八个用户ID 为 1 的 User 实例。

设若同盟的模子实例在数据库不设有,会自动生成并赶回 HTTP 404 响应。

自定义解析逻辑

纵然您想要使用自定义的深入分析逻辑,需要动用 Route::bind 方法,传递到
bind 方法的闭包会获取到 UENCOREI
央浼参数中的值,何况重回您想要在该路由中注入的类实例:

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

路由参数

6、表单方法杜撰

HTML 表单不协助 PUTPATCH 或者 DELETE 央浼方法,由此,当定义
PUTPATCHDELETE 路由时,须要丰盛四个藏匿的 _method
字段到表单中,其值被用作该表单的 HTTP 须要方法:

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

还足以应用补助函数 method_field 来达成这一目标:

{{ method_field('PUT') }}
Route::get('user/{id}', function($id)
{
return 'User '.$id;
});
7、访谈当前路由

您能够使用 Route 门面上的 currentcurrentRouteName
currentRouteAction 方法来访问管理当下输入伏乞的路由音讯:

$route = Route::current();
$name = Route::currentRouteName();
$action = Route::currentRouteAction();

参谋API文书档案驾驭路由门面底层类以及Route实例的更加的多可用方法。

 

可选的路由参数

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]+');

路由过滤器

路由过滤器提供了豆蔻梢头种范围访谈钦命路由的简短的艺术,那在你须求为您的站点创造要求验证区域的时候超实惠。Laravel
框架中蕴藏了部分路由过滤器,比方 auth 过滤器、auth.basic 过滤器、guest
过滤器、以致 csrf 过滤器。它们被存放在 app/filters.php 文件中。

概念一个路由过滤器

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

倘若贰个响应从三个路由过滤器中回到,这几个响应即被感觉是其风流罗曼蒂克必要的响应,路由将不被实践,任何关于那么些路由的
after 过滤器也将被废除试行。

为一个路由钦命三个路由过滤器

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

为一个路由钦点三个路由过滤器

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)
{
//
});

基本路由过滤器的形式

你只怕希望依据 USportageI 为生机勃勃组路由钦点过滤器。

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

在上头的例子中,admin 过滤器将选择带全数以 admin/
早先的路由。星号作为壹个通配符,将适配到拥有字符的组合。

您也得以经过点名 HTTP 方法节制方式过滤器:

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

过滤器类

对此高档次和等第的过滤器,您能够运用贰个类取代闭包函数。因为过滤器类是身处应用程序之外的
IoC 容器,您能够在过滤器中动用重视注入,更便于测量检验。

概念三个过滤器类

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

登记一个依照类的过滤器

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

命名路由

命名路由在更易于在扭转跳转或 U奥迪Q3Ls
时钦定路由。您能够像那样为路由钦命贰个名字:

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

您也得认为调节器的法子钦命路由名字:

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

明天您在生成 UHighlanderLs 或跳转的时候利用路由的名字:

$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乖谬。

意气风发旦您愿意钦赐您本身定义的从未有过找到的表现,您可感觉 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);

援救,您能够抛出一个SymfonyComponentHttpKernelExceptionNotFoundHttpException
的实例。

越多关于管理404可怜和为那个不当使用使用自定义响应的消息方可在 错误
章节中找到。

路由至调整器

Laravel 不仅仅允许你路由至闭包,也得以路由至调节器类,以致同意创制资源支配器.

发表评论

电子邮件地址不会被公开。 必填项已用*标注