Laravel路由使用详解,解决路由修改不起作用

PHP 投稿 50900 0 评论

Laravel路由使用详解,解决路由修改不起作用

默认路由文件

所有的 Laravel 路由都在 routes 目录中的路由文件中定义,这些文件都由框架自动加载。routes/web.php 文件用于定义 web 界面的路由。这里面的路由都会被分配给 web 中间件组,它提供了会话状态和 CSRF 保护等功能。定义在 routes/api.php 中的路由都是无状态的,并且被分配了 api 中间件组。

大多数的应用构建,都是以在 routes/web.php 文件定义路由开始的。可以通过在浏览器中输入定义的路由 URL 来访问 routes/web.php 中定义的路由。例如,你可以在浏览器中输入 http://www.feishuai.vip/user 来访问以下路由:

Route::get('/user', 'UserController@index');

routes/api.php 文件中定义的路由通过 RouteServiceProvider 被嵌套到一个路由组里面。在这个路由组中,会自动添加 URL 前缀 /api 到此文件中的每

路由配置文件

路由文件的位置:项目目录/routes/web.php文件

4种基础路由的定义(重点)

Route::请求方式('uri',匿名函数);
#从服务器取出资源(一项或多项)
Route::get($uri, $callback);
#在服务器新建一个资源 insert
Route::post($uri, $callback);
#在服务器更新资源  update
Route::put/patch($uri, $callback);
#从服务器删除资源 delete
Route::delete($uri, $callback);

4种基础路由中,只有GET请求方式不进行CSRF验证,其它请求方式则需要CSRF验证

CSRF

  1. CSRF(Cross-site request forgery)跨站请求伪造,攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。

  2. laravel框架中,路由定义在routes/web.php文件中,就会自带有csrf验证功能。

  3. 并不是所有请求都需要进行CSRF攻击防御的,比如去第三方API获取数据的请求。可以通过在 app/Http/Middleware/VerifyCsrfToken.php文件中将要排除的请求URI添加到$except属性数组中。

其它路由

# 一次性匹配多种请求类型
Route::match(array(请求方式,多个以逗号隔开),$uri, $callback);
# 匹配所有请求 工作不用  不安全
Route::any($uri, $callback);

注:如果路由请求方法没有定义,请求不存在的方法,报405状态

路由参数

url地址可以通过query方式去传参数,但是不美观且还不利于seo优化。laravel提供一种路由参数的机制,更佳优美的方式来进行参数的传递。laravel路由参数不用使用$_GET函数来获取,只能通过它自身的方式来获取。

# 必填
Route::get('URI/{参数名称}','闭包函数或控制器响应方法标识');
# 可选
Route::get('URI/{参数名称?}','闭包函数或控制器响应方法标识');
# 参数限制
Route::get('URI/{参数名称}','闭包函数或控制器响应方法标识')->where(['参数名称'=>'正则']);

路由别名

作用:方便管理生成的URL地址 和 权限控制

Route::get('/user/{id}',function($id){
    return "当前用户id是:" . $id;
}) -> name('名字');
# 生成了对应的URL地址      参数
$url = route('路由名称',[array(key=>value)]);

路由分组之路由前缀

很多路由都有相同的前缀,每次都需要敲一遍太繁琐,所以就可以把统一的前缀摘出来 做路由分组

可以用 prefix 方法为路由组中给定的 URL 增加前缀。例如,你可以为组中所有路由的 URI 加上 admin 前缀:

Route::prefix('admin')->group(function () {
    Route::get('users', function () {
        // 匹配包含 "/admin/users" 的 URL
    });
});

路由名称前缀

name 方法可以用来给路由组中的每个路由名称添加一个给定的字符串。 例如,您可能希望以 「admin」为所有分组路由的名称加前缀。 给定的字符串与指定的路由名称前缀完全相同,因此我们将确保在前缀中提供尾部的 . 字符:

Route::name('admin.')->group(function () {
    Route::get('users', function () {
        // 路由分配名称“admin.users”...
    })->name('users');
});

查看定义好的路由

php artisan route:list

使用路由缓存

老实说, 使用路由缓存很简单. 有一个新的 Artisan 命令 route:cache 可以把 routes.php 文件中的所有路由定义序列化 -- 会对所有的路由进行一次解析然后把解析结果缓存起来. 如果你曾经用过 Handlebars 模板的预编译的话, Laravel 5 的路由缓存机制跟它有点类似.

这样就已经搞定了. 执行完这个命令以后, 所有的路由都是从缓存文件而不是路由文件进行读取. 之后你可以对 routes.php 的随意进行修改, 但应用的路由不会发生变化, 一直到再次执行 route:cache 重新缓存.

优点和缺点

优点很明显: 网站的速度会更快.

但缺点也不得不提: 只要缓存过一次网站的路由定义, 以后每次对 routes.php 文件进行修改都需要重新执行缓存操作, 否则修改不会生效. 这可能会造成部分开发者的疑惑, 有可能你可能怎么修改 routes.php 都没用, 偏偏一时没想到是路由缓存造成的.

幸亏有两个方法可以解决这个问题. 

第一种方法: 可以执行 artisan route:clear , 这样 artisan 会删除路由缓存. 

第二种方法: 可以考虑只在正式环境使用路由缓存. 然后在 Git 的 post-deploy 钩子中执行 artisan route:cache , 或者在部署脚本中来执行它.

编程笔记 » Laravel路由使用详解,解决路由修改不起作用

赞同 (108) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽