路由是 laravel的特色,是体验laravel框架优雅和美妙的第一站,也是laravel中的重点。 **laravel中路由的定义:** > 分析来自客户端请求的统一资源标识符(URI),根据设定的规则将请求分发至期待的处理逻辑,这一规则就是路由规则,而这一过程就是路由 。 ### 简单的路由规则 假设我们有这样一段简单的处理逻辑 ``` echo 'hello world'; ``` 我希望通过`http://myapp.com/home`访问这段处理逻辑,那么在laravel中要如何实现呢?我们在laravel框架app/Http/routes.php文件中添加如下代码: ``` Route::get('home',function(){ echo 'hello world'; }); ``` 就能够实现我们的目的,以上代码就是一个简单的路由规则,其中/home是统一资源标识符uri,请求方式为get,处理逻辑为闭包内的代码。 如果我们想通过url传递参数怎么办?比如我想通过id获取某篇文章的内容: ``` Route::get('article/{id}',function($id){ return 'Article:'.$id; }); ``` 这样我们就能够在闭包中获取id值了,我们知道id值一般只能是数字,那么如果要路由只匹配参数为数字的url,而不是匹配像这样的url:`http://myaap.com/article/a`。可以这样写 ``` Route::get('article/{id}',function($id){ return 'Article:'.$id; })->where('id','[0-9]+'); ``` where里面第一个是参数名称,第二个是正则验证规则。 ### 中间件 什么是路由中间件呢?我们知道路由是一个过程,分析来自客户的请求按照路由规则分发至相应的处理逻辑。但是有些情况下,路由的访问需要经过一些验证,比如登录后台系统,需要验证用户是否登录,或用户是否有访问权限。 这时候中间件就该上场发挥作用了。 > HTTP 中间件提供一个方便的机制来过滤进入应用程序的 HTTP 请求,例如,Laravel 默认包含了一个中间件来检验用户身份验证,如果用户没有经过身份验证,中间件会将用户导向登录页面,然而,如果用户通过身份验证,中间件将会允许这个请求进一步继续前进。 上面这段话摘自larave文档,很好的说明了中间价的作用其实就是用来过滤请求的。如果把请求路线当做一个管道,那么中间件就是管道中经过的一系列过滤装置,最终到达的数据都是经过中间件过滤了的。 laravel默认内置了一些的中间件,包括登录,CSRF保护等,所有的中间件都放在app/Http/Middleware 目录内。 **如何使用中间件?** ``` Route::get('admin/profile', ['middleware' => 'auth', function () { // }]); ``` 上面这样就为admin/profile这个路由加入了一个中间件auth,所有访问他的请求都会通过auth验证。 关于如何自定义中间件请参照官方文档。 **路由分组** 路由分组使路由的配置更加的方便,比如:有一系列的路由需要应用同一个中间价,我们就可以将它组成一个分组。 ``` Route::group(['middleware' => 'auth'], function () { Route::get('/', function () { // 使用 Auth 中间件 }); Route::get('user/profile', function () { // 使用 Auth 中间件 }); }); ``` 路由群组允许你共用路由属性,例如:中间件、命名空间,你可以利用路由群组统一为多个路由设置共同属性,而不需在每个路由上都设置一次。共用属性被指定为数组格式,当作 Route::group 方法的第一个参数 ### 控制器 上面我们把处理逻辑都写在了路由的闭包中,实际开发中,我们把处理逻辑单独放到控制器类中,具体的做法如下: ``` User::findOrFail($id)]); } } ``` 然后通过路由来指定控制器的行为 ``` Route::get('user/{id}', 'UserController@showProfile'); ``` 资源控制器 在了解资源控制器之前,请先读下这篇讲解resetful的文章,传送门:http://www.ruanyifeng.com/blog/2011/09/restful.html 在接触laravel之前,我也仅仅知道get,post两种请求方式,至于put,delete,option这些请求方式从来没有去了解过。 **laravel使用了get,post,put,delete四种请求方式。** - get 用于获取资源 - post 用于新增资源 - put 用于更新资源 - delete 用于删除资源 可能你会觉得有get,post这两种请求方式就足够了,为什么搞那么复杂。可是这恰恰就是为了防止我们的uri变得过于复杂的。 回想下我们曾经做过的系统,你是否会发现我们所定义的uri都是没有任何规范,极其随意的,这样的uri根本没有任何可读性,和维护性。 我们知道uri是开放的接口。所以对于他的命名应当是需要非常谨慎的。一旦确定后期的改变都需要很大的成本。而resetful架构就是为了解决我们 uri命名没有规范,可读性差,可维护性差的问题的。 像下面这种路由是不是感觉赏心悦目 ``` Route::get('user','UserController@index'); Route::post('user','UserController@store'); Route::put('user/{id}','UserController@update'); Route::delete('user/{id}','UserController@delete'); Route::get('user/{id}','UserController@show'); ``` 运用好路由,可以写出优雅的接口,这对于 App 后端开发相当有用。遵循 RESTful,会让你的程序更加规范。 ### 最后的总结 如果你是从其他框架(比如:ThinkPHP,Zend Freamwork)转过来的初学者,一开始会很不习惯,不明白通过控制器和uri的映射就可以实现的东西,为什么要多此一举加入一个中间配置文件,慢慢的你会发现这样有诸多好处。 - **极其灵活的路由规则** 支持各种命名方式,多种的动作(http请求可不只有get,post),路由分组等等。 - **路由的组织高效,方便,整洁** 所有的路由现在统一管理起来,使用路由分组,搭配中间件,集中管理更加的高效,整洁。 - **控制器的分工更加明确** 想想之前控制器中杂糅了各种基类,和毫不相干的方法,现在控制器变得干净许多。 - **控制器和路由完全解耦** 其实前面的这些好处都可以归功于此。因为控制器和路由的完全解耦,两边都变的灵活自由,互不相干了。 这些带来开发效率的提升和后期的可维护性都是显著的。
上一篇:PhpStrom优雅运行laravel命令 下一篇:laravel Eloquent ORM解析
如果这篇文章帮助到了您,可以赞助下主机费~~
赞赏