Laravel 5.4 官方文档摘记:路由

Laravel 基础操作

首先,我是一个小白,纯小白,接触Laravel不到一周,所以接下来的内容基本浅显易懂到只要你认识中文的程度。

其次,我使用的Laravel版本是5.4.*。下面的例子中的文件路径,设置方法都是采用该版本的。

再有,接下来提及的文档,指的是Laravel 5.4 中文文档

运行流程

当然不是真的Laravel内部核心代码运行流程,而是针对我们开发者来说,如何操作Laravel

  1. 设置路由
  2. 创建对应路由器
  3. 如果需要,创建对应模型
  4. 输出到页面

也就是路由=>C=>M=>V。还有!!!最好使用PHPStorm作为开发IDE,否则你会在各种命名空间中排查一堆问题。

下面正式开始!

路由

路由设置

路由文件是/routes/web.php文件,其中路由的设置方法参考文档的介绍有以下几种:

路由基本格式

//拿下面这个作为一个例子
Route::get('/welcome',function(){
    return view('welcome');
});
  • get,请求类型,具体的类型下面会介绍
  • '/welcome',URL,假设你配置的域名为www.laravel.com,那么当你访问www.laravel.com/welcome时,就会对应到这个路由
  • function(){//code...},对应该路由的闭包函数,但是也可以在这里指定控制器与该控制器下的方法,下面会演示的。

请求类型

先说一些前缀知识,我也是刚百度来的,Http请求不止有我们熟悉的get post,还有put patch delete options。其中各种请求的简单介绍如下:

请求名称作用
get请求资源
post更新全部资源
put更新部分资源
patch更新部分资源
delete删除资源
options可以使用使用的功能选项

其中浏览器只支持get post,所以我们最常见的就是这两种。但是Laravel的路由设置中,是可以设置剩余的方法的,但是这种设置不是真的发送一个这种类型的请求,而是在表单中加入特定的hidden字段,从而模拟这种请求。具体的做法就是在表单中使用内置的模板{{method_field("put")}},这样就会生成一个input hidden的字段,并且把该表单交给Laravel,则会当作put请求一样处理,同理delete patch options也是一样的。

提到表单,为了保证CSRF防护(别问我设置什么,我要是懂了的话,那估计就危险了,所以呈上百度百科)

所以在提交给Laravelform中必须加入{{csrf_field()}},这个会在模板中渲染出一个令牌,后台根据该令牌,决定是否处理该请求。

路由参数

直接看路由的代码吧:

//注意,如果这里是直接在路由中进行处理的话,那么一定要在function()中显式的将参数传递进去
Route::get("user/{id}",function($id){
    return $id;
})
//当然,上面只是传递了一个参数,可以传递多个参数
Route::get("user/param1/{param1}/param2/{param2}",function($param1,$param2){
    return $param1." ".$param2;
});
//上面的路由参数是一定要有的,但是有时候我们不确定是否有该参数,那么可以使用下面的形式
Route::get("user/{name?}",function($name=='default value'){
    //注意,一定要在闭包函数内部设置默认值,保证即使该数据没有传递过来,也可以进行对应处理
});

参数正则验证

//使用where在路由中进行正则约束
Route::get('user/{id}',function(){})->where('name','[0-9]+');

全局路由正则验证

上面的参数正则验证是针对每一个路由进行设置的,但是如果想对同一个参数设置全局的验证,比如用户的id一定要为数字,则可以在/app/Providers/RouteServiceProvider.php中的boot()方法中进行设置。下面是官网给出的一个例子:

public function boot(){
    Route::pattern('id','[0-9]+');
    parent::boot();
}

当设置了上面的验证后,下次这样的路由访问,会自动进行正则的验证:

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

路由命名

为什么要使用路由命名

在介绍原因之前,先介绍一个很好用的函数:route('RouteName',array('paramName'=>'paramValue')),这个函数很像tp中的U()函数,也是用来生成URL地址的。其中的RouteName参数就是这里设置的路由命名。

具体设置方法

Route::get('users/create',function(){
    return view('users.create');
})->name('login');

下面就能使用route('login'),直接输出该URL地址。

路由群组

这玩意有什么用呢???比如你想为多个路由设置统一的配置,那么就可以使用该设置。具体内容可以看下面。

中间件设置

比如都需要相同的中间件进行审核(中间件的知识后面会介绍的,或者可以看我这篇博客)。那么可以统一进行设置:

Route::group(['middleware'=>'Admin'],function(){
    Route::get('/',function(){});
    Route::post('/',function(){});
});

上面这样的配置中,当你无论以get还是post都的方式访问/,都会经过Admin中间件的审核。

命名空间

这里先介绍一下如何在路由设置中调用控制器,以及该控制器下对应的方法:

Route::get('login','UsersController@create');

上面代码调用控制器UsersController,并且是该控制器下的create方法。调用其中的UsersController默认的命名空间是App\Http\Controllers。但是也可以额外进行设置:

Route::group(['namespace'=>'Admin'],function(){
    //这里的UsersController的命名空间就是Admin
    Route::get('login','UsersController@create');
});

子域名路由

文档上还介绍了可以设置子域名。设置方式如下:

Route::group(['domain'=>"{account}.newUrl.com"],function(){
    Route::get('users',function(){});
    Route::post('users',function(){});
});

路由前缀

比如我要访问这么多个路由:admin/users/createadmin/users/store,’admin/users/update’,为了把代码弄的简洁一点,那么可以设置如下的形式:

Route::group(['prefix'=>'admin'],function(){
    Route::get('users/create',function(){});
    Route::post('users/store',function(){});
    Route::post('users/update',function(){});
});

路由模型绑定

上面我们在路由中调用了控制器与该控制器下的方法,但是实际上还可以直接调用模型,我只能说Laravel你厉害!

隐式绑定

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

这里牵扯的知识点有几个,先介绍一下:

  • 根据上面的介绍{user}代表的是参数,这里只是把变量名命名为user,为了和后面的App\User对应
  • App\User对应的Laravel中的Model的命名空间,在Laravel中,Model类都是直接采用数据库表名为文件名,创建在app\目录下的,并且设置App\加上文件名作为命名空间。

上面这样创建之后,当你访问users/1时,会自动实例化一个User模型类,并传递进入参数。

显示绑定

上面的隐式绑定要求参数名和表名结构是一致的,也就是Laravel在猜。如果要百分百确定的话,可以直接在/app/Providers/RouteServiceProvider.php中的boot()方法中进行设置:

public function boot(){
    parent::boot();
    Route::model('user',App\User::class);
}

在路由文件中设置下面形式时:

Route::get("admin/{user}",function(App/User $user){
    //这里就会明确生成一个App/User类
});

自定义处理逻辑

还是上面的/app/Providers/RouteServiceProvider.php中的boot()方法,可以在里面这样设置:

public function boot(){
    parent::boot();
    Route::bind('user',function($value){
        return App/User::firstOrFail($value);  
    });
}

路由相关参数

在其他地方可以调用下面的Api进行查询当前路由的信息:

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

顺道一提,Route的命名空间是use Illuminate\Routing\Router;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值