热门标签 | 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') 引用即可。此外,我们还可以简化对路由参数的传递,比如上例可以简化为:

 

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



推荐阅读
  • 本文档提供了详细的MySQL安装步骤,包括解压安装文件、选择安装类型、配置MySQL服务以及设置管理员密码等关键环节,帮助用户顺利完成MySQL的安装。 ... [详细]
  • 本文探讨了在使用Apache Flink向Kafka发送数据过程中遇到的事务频繁失败问题,并提供了详细的解决方案,包括必要的配置调整和最佳实践。 ... [详细]
  • Web网络基础
    目录儿1使用HTTP协议访问Web2HTTP的诞生2.1因特网的起源2.2互联网、因特网与万维网2.3万维网与HTTP3网络基础TCPIP3.1TCPIP协议族3.2TCPIP的分 ... [详细]
  • Mac环境下Java与Ant自动化构建环境搭建指南
    本文详细介绍了如何在Mac操作系统上为测试工程师搭建Java和Ant开发环境,包括环境变量配置等关键步骤。 ... [详细]
  • 本文详细介绍了如何通过配置 Chrome 和 VS Code 来实现对 Vue 项目的高效调试。步骤包括启用 Chrome 的远程调试功能、安装 VS Code 插件以及正确配置 launch.json 文件。 ... [详细]
  • 万事起于配置开发环境
    万事起于配置开发环境 ... [详细]
  • 作为一名CSS初学者,我在博客园中尝试通过CSS美化页面,特别是为超链接添加图标,以提升阅读体验。本文将分享如何使用CSS和字体图标库来实现这一功能。 ... [详细]
  • 本文探讨了HTA(HTML Application)环境中HTML5 IndexedDB的可用性问题,并提供了一种替代方案,即通过使用COM ActiveX对象来实现数据存储功能。 ... [详细]
  • 本文探讨了Web API 2中特性的路由机制,特别是如何利用它来构建RESTful风格的URI。文章不仅介绍了基本的特性路由使用方法,还详细说明了如何通过特性路由进行API版本控制、HTTP方法的指定、路由前缀的应用以及路由约束的设置。 ... [详细]
  • 深入探讨Web服务器与动态语言的交互机制:CGI、FastCGI与PHP-FPM
    本文详细解析了Web服务器(如Apache、Nginx等)与动态语言(如PHP)之间通过CGI、FastCGI及PHP-FPM进行交互的具体过程,旨在帮助开发者更好地理解这些技术背后的原理。 ... [详细]
  • 本文介绍了如何在Spring框架中配置和使用定时任务,包括初始化配置和动态启动定时器的方法。通过示例代码展示了如何利用Spring的TaskScheduler接口来创建和管理定时任务。 ... [详细]
  • 微信小程序支付官方参数小程序中代码后端发起支付代码支付回调官方参数文档地址:https:developers.weixin.qq.comminiprogramdeva ... [详细]
  • UMPlatForm.NET 5.1 版本数据字典管理功能解析
    本文介绍了 UMPlatForm.NET 5.1 版本中的数据字典管理模块,探讨了该模块如何支持平台的数据共享与管理,以及如何通过用户和角色权限来增强系统的安全性。 ... [详细]
  • MVC框架下使用DataGrid实现时间筛选与枚举填充
    本文介绍如何在ASP.NET MVC项目中利用DataGrid组件增强搜索功能,具体包括使用jQuery UI的DatePicker插件添加时间筛选条件,并通过枚举数据填充下拉列表。 ... [详细]
  • Python与PyCharm:理解两者之间的差异
    本文旨在阐述Python编程语言与PyCharm集成开发环境(IDE)之间的主要区别。Python作为一种广泛使用的高级编程语言,以其简洁明了的语法著称;而PyCharm则是专为Python开发者设计的强大工具集。 ... [详细]
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社区 版权所有