laravel之路-2 laravel路由详解

本文介绍了laravel框架中独特的路由机制,不同于传统框架的固定规则,laravel允许开发者自定义controller方法的路由规则,提供了路由前缀和资源路由等功能。资源路由可以生成多个预定义的路由,通过设置第三个参数可以选择生成特定的路由。通过这种方式,laravel路由为开发者带来了更高的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    laravel的路由比较特别,没有和其它框架一样,用一套固定的命名格式来自动寻找controller,laravel提供的是由自己定义controller中每一个方法的路由规则。一开始接触这个感觉没必要,而且很繁琐。后来应用到项目之后发现自己可以自定义路由真的很舒服,才发现自己被其它框架的规则套得麻目了。不多说,开始正题:


1.文件位置
laravel的默认路由文件是 /routes/web.php, 跟nginx配置文件一样,可以include其它文件。格式为:include_once("admin.php");不过include有个小bug,include的文件在使用php artisan route:cache时不会缓存到缓存文件中;解决办法只能是全写在web.php中咯
2.基本格式:
        
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

具体应用:

    Route::get('/register', '\App\Http\Controllers\RegisterController@index');
解释:当你访问http://localhost/register时,会转到RegisterController这个类的index()方法
需要注意的是
1.如果传输方式不同$url可以重名,否则不能重名
2.post、put、delete方式的路由,在提交时需要验证csrf,即在form表单中加入{{ csrf_field() }}或在ajaxSetup中加入X-CSRF-TOKEN
3.参数绑定
    格式:
Route::get('/user/{user}', '\App\Http\Controllers\UserController@show');
    解释:
当你访问http://localhost/user/123 时,会转到UserController这个类的show()方法,在这个方法中可以接收一个参数  show(User $user) User为对应model的命名空间,这样可以接收到 id=123 这个用户的一个对象 用dd($user);打印出来的结果如下图:没有找个解释每个字段的含义的文章,欢迎大家补充;

扩展:

Route::get('user/{id}/{name}', 'xxxxxx')->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
绑定的参数可以用正则来约束;如果你希望路由参数在全局范围内都遵循一个确定的正则表达式约束,则可以在 RouteServiceProvider 的 boot 方法里定义Route::pattern('id', '[0-9]+');
4.路由组(group)
格式:
Route::group([], function(){
    	Route::get('xxx', 'xxx');
});
    顾名思义,将多个Route合并到一个组中,同个组中的Route共享路由组的属性,如:中间件和命名空间等(结合下文理解)。很重要,敲黑板。。。
5.命名空间(namespace)
格式:
Route::group(['namespace'=>'\App\Admin\Controllers'], function(){
		Route::get('/login', 'LoginController@index');
});
解释:namespace的作用就是省了组里每个路由都需要加上命名空间,修改时也方便。该路会访问到\App\Admin\Controllers\LoginController@index。很实用的小技巧。有一点需要注意,使用时需要把RouteServiceProvider里面的$namespace置为空,否则该值会追加在你的路由前面。。。
6.中间件(middleware)
格式:
Route::group(['middleware'=>'auth:web'], function(){
		Route::get('/logout', 'LoginController@logout');
});
解释:给路由分配http层中间件,本人理解为从路由到控制器中的一个层。可作数据校验和登陆验证等,web.php中默认有csrf等校验,可通过app/Http/Kernel.php中的$middlewareGroups查看。该功能结合以后 登陆验证、权限验证 章节理解

7.路由前缀(prefix)

格式:

Route::group(['prefix'=>'admin', 'namespace'=>'\App\Admin\Controllers'], function(){
    	Route::get('/login', 'LoginController@index');
});
    解释:prefix的值会追加到路由组中每个路由的URI前缀相当于 Route::get('/admin/login', 'LoginController@index');

8.资源路由(resource)

格式:

Route::resource('user', 'UserController');

解释:resource会生成下面7个路由

动作URI操作路由名称
GET/photosindexphotos.index
GET/photos/createcreatephotos.create
POST/photosstorephotos.store
GET/photos/{photo}showphotos.show
GET/photos/{photo}/editeditphotos.edit
PUT/PATCH/photos/{photo}updatephotos.update
DELETE/photos/{photo}destroyphotos.destroy

    如果只想要其中几个路由的话可以用第三个参数,格式如下

Route::resource('user', 'UserController', ['only'=>['index','create','store']]);

    用artisan生成控制器时就可以直接生成对应的方法

php artisan make:controller UserController --resource
8.表单方法伪造
由于HTML的form中不支持PUT、TATCH、DELETE提交,所以框架默认将"_method"名字的值作为请求方法,故表单提交时要注意是否需要加入下面元素
<input type="hidden" name="_method" value="PUT">
9.其它
还有隐式绑定、显式绑定、自定义键名等功能,本人没有用到,还没深入研究,有兴趣的同学可以直接在  中文文档 里了解

最后附上laravel中文文档- 路由篇:https://laravel-china.org/docs/laravel/5.4/routing

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值