监控系统实践第12天:5天上手Laravel8.5之路由篇(1/5)

Posted 家铭didphp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了监控系统实践第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的文档开头,主要多了一些介绍框架自带的命令的内容,后面的内容因为我太心急,暂时没去比对。


安装与配置

不想再次啰嗦安装与配置了,但是这个又跟路由有那么一些关联关系。

如果想回顾,或者不会的朋友,可以翻回去我之前写的两篇:

  1. 如果不知道怎么下载部署Laravel框架的话,就看这个:监控系统实践第10天:用宝塔部署Laravel8.5框架的站点

  2. 如果不知道怎么配置Laravel框架的话,就看这个:监控系统实践第11天:配置Laravel8.5与开关网站方法


Laravel基础功能:路由(Route)

路由是什么?

Laravel的路由是什么?就把它的作用当成是设置和定义访问网址的吧。

路由的所有相关配置文件默认在根目录 routes 文件夹下,里面有多个路由配置文件,可以在 app/Providers/RouteServiceProvider.php 中查看并进行深入的修改。

路由是相当于入口 public/index.php 之后的另一个入口文件。

常规的web界面,调用的是 routes/web.php 中的路由规则,可以自定义用户最终对应用程序的访问路径。

用过Thinkphp 3Yii 2这些框架的人应该都知道,只要有一个控制器,控制里面也定义了一个public方法,当我知道控制器与方法名,就可以马上访问它了。

Laravel的这个路由不同于它,不是说你有了一个控制器有了一个方法就可以立即访问。

这个路由,跟Python中的Flask框架很像,都需要自己指定URI,页面才能被访问。

@app.route('/hello')
def show_hello():
    return 'Hello'

比如我指定://aa/a-1URI,通过路由文件配置了,才可以通过网址进行访问,如果不配置,直接给你一个大大的HTTP 404没有页面的错误提示:
在这里插入图片描述


设置路由的请求方式

每个路由规则对应一个访问路径,每个访问路径使用Route类中的方法来定义,而每个访问路径又有不同的请求方式,诸如GETPOSTPUTPATCH等。

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类有GETPOSTPUT等方法,这些方法都有默认参数,从前面可知,第一个参数就是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方法,那么页面是不能正常打开的,指定了什么方式就只能用什么方式打开。

举几个实际的定义路由的例子:

  1. 访问/foo,仅支持get请求,返回Hello World
Route::get('foo', function () {
    return 'Hello World';
});
  1. 访问/,仅支持get与post请求,两者都返回Hi
Route::match(['get', 'post'], '/', function () {
    return 'Hi';
});
  1. 访问/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参数:

  1. 参数在路由路径URI里面定义;
  2. 使用大括号{}包含起来;
  3. 大括号中间的参数名称不需要使用符号,只使用字母开头的字符串,可以由字母和数字组成;
  4. 参数是传递到内容中的,参数名称不要同名,它是按顺序传递到内容里面的。

闭包中传递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::getRoute::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框架的站点

监控系统实践第9天:使用Composer下载Laravel8.5

监控系统实践第11天:配置Laravel8.5与开关网站方法