监控系统实践第12天:5天上手Laravel8.5之路由篇(1/5)
Posted 家铭didphp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了监控系统实践第12天:5天上手Laravel8.5之路由篇(1/5)相关的知识,希望对你有一定的参考价值。
监控系统实践第12天:5天上手Laravel8.5之路由篇(1/5)
前言
很多编程语言的书,开头都是给你输出一个Hello World
。
很多web框架的文档,开头都是给你显示一个欢迎页面
。
感觉这种代入感不太好,Hello World
来得太简单,欢迎页面
来得太懵。
之前计划监控系统的后台业务的开发框架就用Laravel
,在准备编写后台业务之前,我想用 5 天的时间来过一遍Laravel 8.5
的文档。
接下来的 5 天时间里,前 4 天我主要梳理Laravel 8.5
基础功能的路由
、中间件
、控制器
、请求
和响应
,最后 1 天来综合实操基础功能,对前 4 天的内容做一个补充。
三个月之前上Laravel 中文社区
的时候,对着社区里翻译的Laravel 8.x
的文档简单操作过了一遍Laravel 8.5.9
,发现在方法调用上,跟以往的版本区别并不是很大。
前几天又重新上社区,看到一个消息是说Laravel 8.x
的文档只适合Laravel 8.0
,因为最近两个月官方对结构进行了部分调整,如果要用Laravel 8.5
系列的框架,就要看正在翻译的Laravel 8.5
的文档。
时间有限,粗略的扫了一遍Laravel 8.5
的文档,发现我之前总结的Laravel 8.x
笔记还可以用,而Laravel 8.5
的文档开头,主要多了一些介绍框架自带的命令的内容,后面的内容因为我太心急,暂时没去比对。
安装与配置
不想再次啰嗦安装与配置了,但是这个又跟路由有那么一些关联关系。
如果想回顾,或者不会的朋友,可以翻回去我之前写的两篇:
-
如果不知道怎么下载部署
Laravel
框架的话,就看这个:监控系统实践第10天:用宝塔部署Laravel8.5框架的站点 -
如果不知道怎么配置
Laravel
框架的话,就看这个:监控系统实践第11天:配置Laravel8.5与开关网站方法
Laravel基础功能:路由(Route)
路由是什么?
Laravel
的路由是什么?就把它的作用当成是设置和定义访问网址的吧。
路由的所有相关配置文件默认在根目录 routes
文件夹下,里面有多个路由配置文件,可以在 app/Providers/RouteServiceProvider.php
中查看并进行深入的修改。
路由是相当于入口 public/index.php
之后的另一个入口文件。
常规的web界面,调用的是 routes/web.php
中的路由规则,可以自定义用户最终对应用程序的访问路径。
用过Thinkphp 3
、Yii 2
这些框架的人应该都知道,只要有一个控制器,控制里面也定义了一个public
方法,当我知道控制器与方法名,就可以马上访问它了。
Laravel
的这个路由不同于它,不是说你有了一个控制器有了一个方法就可以立即访问。
这个路由,跟Python
中的Flask
框架很像,都需要自己指定URI
,页面才能被访问。
@app.route('/hello')
def show_hello():
return 'Hello'
比如我指定:/
、/aa
、/a-1
等URI
,通过路由文件配置了,才可以通过网址进行访问,如果不配置,直接给你一个大大的HTTP 404
没有页面的错误提示:
设置路由的请求方式
每个路由规则对应一个访问路径,每个访问路径使用Route
类中的方法来定义,而每个访问路径又有不同的请求方式,诸如GET
、POST
、PUT
、PATCH
等。
Laravel
的每个路由,具体只能使用什么方式访问,都有Route
类来指定。
这里列举一些常用的请求方式的方法:
$uri 为 相对路径
$callback 为 调用的内容
# GET 请求
Route::get($uri, $callback);
# POST 请求
Route::post($uri, $callback);
# PUT 请求
Route::put($uri, $callback);
# PATCH 请求
Route::patch($uri, $callback);
# DELETE 请求
Route::delete($uri, $callback);
# OPTIONS 请求
Route::options($uri, $callback);
# 支持多种请求方式
$method = ['get', 'post'];
Route::match($method, $uri, $callback);
# 支持所有方式的请求
Route::any($uri, $callback);
# 重定向,状态码默认 302
Route::redirect('/here', '/there');
# 重定向,指定状态码
Route::redirect('/here', '/there', 301);
# 重定向,状态码默认 301
Route::permanentRedirect('/here', '/there');
定义路由的路径
Route
类有GET
、POST
、PUT
等方法,这些方法都有默认参数,从前面可知,第一个参数就是URI
,即:路径。
假设我的域名是:http://laravel.didphp.com
。
我想直接通过浏览器打开首页:http://laravel.didphp.com
,我要到路由文件中去定义一个GET
方法,指定URI
路径为/
,即:Route::get('/', function () {});
,来让这个首页可以打开,并且显示对应的页面内容。
Route::get('/', function () {
return view('welcome');
});
再比如我想访问http://laravel.didphp.com/abc
,我要到路由文件中去定义一个方法:Route::get('/abc', function () {});
,来让这个页面显示文本:abc
。
Route::get('/abc', function () {
return ‘abc’;
});
路由可以限制访客,让用户只能通过GET
或者POST
来请求页面。
如果是GET
请求,结果使用POST
方法,那么页面是不能正常打开的,指定了什么方式就只能用什么方式打开。
举几个实际的定义路由的例子:
- 访问
/foo
,仅支持get请求,返回Hello World
Route::get('foo', function () {
return 'Hello World';
});
- 访问
/
,仅支持get与post请求,两者都返回Hi
Route::match(['get', 'post'], '/', function () {
return 'Hi';
});
- 访问
/foo
,支持任何方式的请求,都返回Hello
Route::any('foo', function () {
return 'Hello';
});
定义路由的内容
前面可以看到,路由有两个主要参数:
第一个是
URI
,即:用户访问的路径;第二个是内容
,即:用户看到的实际内容。
我们通过Route
类的方法来设置路由的请求方式,定义URI
之后,剩下的就是定义它的显示内容了,比如显示指定的文本、html
段落、JSON
格式的数据等。
常见的内容有:闭包
、控制器
、视图
、模型
等方法来定义。
闭包中定义内容
Route::get('foo', function () {
return 'Hello World';
});
控制器中定义内容
引用控制器,参数以数组的方式传递,数组第一个元素是类,第二个元素是方法名。
use App\\Http\\Controllers\\UserController;
Route::get('/user', [UserController::class, 'index']);
# 控制器文件:/app/Http/Controllers/UserController.php
<?php
namespace App\\Http\\Controllers;
use App\\Http\\Controllers\\Controller;
class UserController extends Controller {
public function index() {
return 'index';
}
}
视图中定义内容
视图是直接关联显示指定的视图内容。
Route::view('/welcome', 'welcome');
其它内容的说明
还有其它比较少用的,这里就不一一列举了
定义路径URI的参数
路由可以定义路径和内容,内容可以自定义,当然路径也是可以有类似的操作的,比如接受外部传递进来的URI参数:
- 参数在路由路径
URI
里面定义; - 使用大括号
{}
包含起来; - 大括号中间的参数名称不需要使用符号,只使用字母开头的字符串,可以由字母和数字组成;
- 参数是传递到内容中的,参数名称不要同名,它是按顺序传递到内容里面的。
闭包中传递URI参数
Route::get('/abc/{name}', function ($name='') {
return "Hello World {$name}";
});
代码如下:
当你定义了参数,必须传递进去,否则页面是HTTP 404
传递进去了就正常显示
想为URI定义一个参数,但是非必填可以吗?
可以,左边URI参数的名称最后加个问号?
,右边内容接受URI
传参的时候记得对应给一个默认值,在它不给URI
传参的时候生效:
Route::get('/abc/{name?}', function ($name='') {
return "Hello World {$name}";
});
控制器中传递URI参数
与闭包中传递参数一样,这里我传递了两个参数,一个id
,一个name
,这个地方是整型还是字符串,由传参的人自己来定,后面方法中对应接收参数的地方,不需要跟前面的参数名称一致。
use App\\Http\\Controllers\\UserController;
Route::get('/user/{id}/{name}', [UserController::class, 'index']);
public function index($a, $b) {
return $a . ':' . $b;
}
视图中传递URI参数
Route::view('/welcome/{name}', 'welcome' );
这里要单独提一下,路由类中常用的Route::get
和Route::post
都是可以用来定义路径和内容的。
而这个Route::view
,它的内容实际就是指定路径下的视图文件,比如上面示例中定义的内容是welcome
,实际这个文件是调用的/resources/views/
文件夹中的welcome.blade.php
文件。
Laravel
的视图是可以接受数据的,这个Route::view
也不例外,它的第三个参数,就是传递给视图文件的数据,第三个参数为数组。
Route::view('/welcome', 'welcome', ['name' => 'hello'] );
最后补充
不要使用Laravel 8.0
之前的定义路由的方法了,能用最新的写法就用最新的写法,避免后期框架升级造成影响。
路由调用模型的方法我没介绍:
Route::get('api/users/{user}', function (App\\Models\\User $user) {
return $user->email;
});
Route::get('api/posts/{post:slug}', function (App\\Models\\Post $post) {
return $post;
});
本来计划的就是快速上手,避免越看越懵,有些方法和写法就不一一介绍了,只介绍用得最多,且最实用的。
以上的阐述只对有基础的朋友有作用,如果对以上的知识点有质疑或者不懂的可以在下方留言。
以上是关于监控系统实践第12天:5天上手Laravel8.5之路由篇(1/5)的主要内容,如果未能解决你的问题,请参考以下文章
监控系统实践第15天:5天上手Laravel8.5之HTTP请求篇(4/5)
监控系统实践第13天:5天上手Laravel8.5之中间件篇(2/5)
监控系统实践第14天:5天上手Laravel8.5之控制器篇(3/5)
监控系统实践第10天:用宝塔部署Laravel8.5框架的站点