热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Laravel路由

博客原文地址:https:www.ryanzoe.topphplaravellaravel-route版本:Laravel7.13.0Laravel中的路由是什么?对任何一个Web

博客原文地址:https://www.ryanzoe.top/php/laravel/laravel-route/

版本:Laravel 7.13.0


Laravel 中的路由是什么?

对任何一个 Web 应用框架而言,通过 HTTP 协议处理用户请求并返回响应都是核心必备功能,也就是说,对于我们学习和使用一个 Web 框架,第一件要做的事情就是定义应用路由,否则,将无法与终端用户进行交互。

Laravel 路由可以定位到程序具体使用哪个 PHP 文件或者控制器,Laravel是一个强路由的框架,所有的请求都必须先定义好路由才能访问。


 

应用中的大多数路由都会定义在 routes/web.php 文件中。最简单的 Laravel 路由由URI 和闭包回调函数组成。


路由配置文件

所有的 Laravel 路由都在 routes 目录中的路由文件中定义,这些文件都由框架自动加载。


routes/web.php


用于定义 web 界面的路由,这里面的路由都会被分配给 web 中间件组,它提供了会话状态和 CSRF 保护等功能。

定义路由最简单的方式就是在 routes/web.php 中定义一个 URI 和一个映射到该路径的闭包函数:

// routes/web.php
Route::get('/', function () {
return 'Hello, World!';
});
 

这样,当我们访问应用首页 http://localhost/ 时,就可以看到页面显示 Hello, World! 这一行字符串。这就是一个最简单的 Laravel 路由定义。

这里需要注意的是,我们并没有通过 echo 或 print 显示输出内容,而是通过 return 将其返回,Laravel 会通过内置的响应机制和中间件对返回内容进行处理。

很多简单的静态 Web 站点通过这种最基本的路由定义就可以完成了,比如一些企事业单位宣传网站,只有一些静态页面,通过几个 GET 路由以及视图模板就可以搞定了,如下所示,使用 Laravel 开发静态站点,就是这么简单!

// routes/web.php
// 首页
Route::get('/', function () {
return view('welcome');
});
// 关于我们
Route::get('about', function () {
return view('about');
});
// 产品页
Route::get('products', function () {
return view('products');
});
// 服务页
Route::get('services', function () {
return view('services');
});

 


routes/api.php


处理其他接入方的 API 请求(通常是跨语言、跨应用的请求),定义在 routes/api.php 中的路由都是无状态的,并且被分配了 api 中间件组。在这个路由组中,会自动添加 URL 前缀 /api 到此文件中的每个路由,这样你就无需再手动添加了。你可以在 RouteServiceProvider 类中修改此前缀以及其他路由组选项。

// routes/api.php
Route::get('/test', function () {
return view('welcome');
});

 

在 api.php 中定义了路由后,会自动加上 “api“ 前缀,可以通过下面的 url 访问到 welcome 视图的内容

http://localhost/api/test
^^^

如果想要修改默认的 “api“ 前缀,可以到 app/Providers/RouteServiceProvider.php 中修改,例如下面的代码将默认的 “api“ 前缀修改为 “ryan”

protected function mapApiRoutes()
{
Route::prefix('ryan')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
}

 

 

 

 


routes/console.php


定义了基于控制台的应用入口(和路由作用一样),也就是定义 artisan 闭包命令

在routes/console.php 文件中,可以看到默认定义了一个 inspire 命令,运行后会显示乔布斯说过的一句名言。

 

 

> php artisan inspire
The only way to do great work is to love what you do. - Steve Jobs

 

我们可以使用 Artisan::command 方法定义基于闭包的自定义命令路由。

// routes/console.php
Artisan::command('test {project}', function ($project) {
$this->info("Testing {$project}!");
})->describe('test a project');

 

说明:
command 方法接收两个参数 —— 命令标识和接收命令参数和选项的闭包

命令行中调用

> php artisan test demo
Testing demo!

 

查看命令详情

> php artisan --help test
Description:
test a project
Usage:
test


Arguments:
project

 


routes/channels.php


定义广播频道的授权规则

// routes/channels.php
Broadcast::channel('order.{orderId}', function ($user, $orderId) {
return $user->id === Order::findOrNew($orderId)->user_id;
});

 

channel 方法接收两个参数:频道名称和一个回调函数,该回调通过返回 true 或者 false 来表示用户是否被授权监听该频道。


路由基础配置


路由方法

上面的路由定义中使用了 Route::get,这种语法的含义是只匹配 GET 请求路由,那如果提交的是 POST 请求,或者 PUT、DELETE 请求呢?Laravel 框架也为我们提供了能响应任何 HTTP 请求的路由:

Route::post('/', function () {});
Route::put('/', function () {});
Route::delete('/', function () {});
Route::patch('/', function () {});
Route::options('/', function () {});

 

此外,还可以通过 Route::any 定义一个可以捕获任何请求方式的路由:

Route::any('/', function () {});

 

从安全角度说,并不推荐上述这种捕获如何请求方式的路由定义方式,但是兼顾到便利性,我们可以通过 Route::match 指定请求方式白名单数组,比如下面这个路由可以匹配 GET 或 POST 请求:

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

 


复杂业务逻辑处理

传递闭包并不是定义路由的唯一方式,闭包简单快捷,但是随着应用体量的增长,将日趋复杂的业务逻辑全部放到路由文件中显然是不合适的,另外,通过闭包定义路由也无法使用路由缓存从而优化应用性能。对于稍微复杂一些的业务逻辑,我们可以将其拆分到控制器方法中实现,然后在定义路由的时候使用控制器+方法名来取代闭包函数:

Route::get('/', 'WelcomeController@index');

 

这段代码的含义是将针对 / 路由的 GET 请求传递给 App\Http\Controllers\WelcomeController 控制器的 index 方法进行处理。你可以将之前定义的闭包函数内的代码移植到 index 方法中,效果完全一样


路由参数

如果你定义的路由需要传递参数,只需要在路由路径中进行标识并将其传递到闭包函数即可:

Route::get('user/{id}', function ($id) {
return "用户ID: " . $id;
});

 

当你访问 http://localhost/user/1000 的时候,就可以在浏览器看到 用户ID: 1000 字符串。


 

此外,还可以定义可选的路由参数,只需要在参数后面加个 ? 标识符即可,同时你还可以为可选参数指定默认值:

Route::get('user/{id?}', function ($id = 1) {
return "用户ID: " . $id;
});

 

更高级的,你还可以为路由参数指定正则匹配规则:

Route::get('page/{id}', function ($id) {
return '页面ID: ' . $id;
})->where('id', '[0-9]+');
Route::get('page/{name}', function ($name) {
return '页面名称: ' . $name;
})->where('name', '[A-Za-z]+');
Route::get('page/{id}/{slug}', function ($id, $slug) {
return $id . ':' . $slug;
})->where(['id' => '[0-9]+', 'slug' => '[A-Za-z]+']);

 

如果传入的路由参数与指定正则不匹配,则会返回 404 页面


重定向路由

如果要定义重定向到另一个 URI 的路由,可以使用 Route::redirect 方法。这个方法可以快速的实现重定向,而不再需要去定义完整的路由或者控制器:

Route::redirect('/here', '/there');

 

Route::redirect 默认会返回状态码 302 。 你可以通过第三个参数自定义返回码:

Route::redirect('/here', '/there', 301);
// 也可以使用 Route::permanentRedirect 方法来返回 301 状态码
Route::permanentRedirect('/here', '/there');

 


路由命名

在应用其他地方引用路由的最简单的方式就是通过定义路由的第一个路径参数,你可以在视图中通过辅助函数 url() 来引用指定路由,该函数会为传入路径加上完整的域名前缀,所以 url('/') 对应的输出是 http://localhost。你可以在视图文件中这么使用:

此外,Laravel 还允许你为每个路由命名,这样一来,不必显式引用路径 URL 就可以对路由进行引用,这样做的好处是你可以为一些复杂的路由路径定义一个简单的路由名称从而简化对路由的引用,另一个更大的好处是即使你调整了路由路径(在复杂应用中可能很常见),只要路由名称不变,那么就无需修改前端视图代码,提高了系统的可维护性。

路由命名很简单,只需在原来路由定义的基础上以方法链的形式新增一个 name 方法调用即可:

Route::get('user/{id?}', function ($id = 1) {
return "用户ID: " . $id;
})->name('user.profile');

 

前端视图模板中可以通过辅助函数 route 并传入路由名称(如果有路由参数,则以数组方式作为第二个参数传入)来引用该路由:


 


// 输出:http://localhost/user/100

 

如果没有路由参数,通过 route('user.profile') 引用即可。此外,我们还可以简化对路由参数的传递,比如上例可以简化为:

 

在实际开发过程中,推荐使用路由命名来引用路由。



推荐阅读
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 20211101CleverTap参与度和分析工具功能平台学习/实践
    1.应用场景主要用于学习CleverTap的使用,该平台主要用于客户保留与参与平台.为客户提供价值.这里接触到的原因,是目前公司用到该平台的服务~2.学习操作 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 【MicroServices】【Arduino】装修甲醛检测,ArduinoDart甲醛、PM2.5、温湿度、光照传感器等,数据记录于SD卡,Python数据显示,UI5前台,微服务后台……
    这篇文章介绍了一个基于Arduino的装修甲醛检测项目,使用了ArduinoDart甲醛、PM2.5、温湿度、光照传感器等硬件,并将数据记录于SD卡,使用Python进行数据显示,使用UI5进行前台设计,使用微服务进行后台开发。该项目还在不断更新中,有兴趣的可以关注作者的博客和GitHub。 ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 服务器上的操作系统有哪些,如何选择适合的操作系统?
    本文介绍了服务器上常见的操作系统,包括系统盘镜像、数据盘镜像和整机镜像的数量。同时,还介绍了共享镜像的限制和使用方法。此外,还提供了关于华为云服务的帮助中心,其中包括产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题和视频帮助等技术文档。对于裸金属服务器的远程登录,本文介绍了使用密钥对登录的方法,并提供了部分操作系统配置示例。最后,还提到了SUSE云耀云服务器的特点和快速搭建方法。 ... [详细]
author-avatar
全程解密_785
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有