最为常用的Laravel操作(2)-路由

简介: 整理了 Laravel 框架路由最常用的操作,如路由参数、路由群组、中间件等。本系列共有 3 篇文章。

基本路由

// 接收一个 URI 和一个闭包
Route::get('hello', function () {
   
    return 'Hello, Laravel';
});

// 支持的路由方法
Route::get({
   mathJaxContainer[0]}callback);
Route::post({
   mathJaxContainer[1]}callback);
Route::put({
   mathJaxContainer[2]}callback);
Route::patch({
   mathJaxContainer[3]}callback);
Route::delete({
   mathJaxContainer[4]}callback);
Route::options({
   mathJaxContainer[5]}callback);

// 支持多个路由方法
Route::match(['get', 'post'], '/', function () {
   
    //
});

// 注册所有路由方法
Route::any('foo', function () {
   
    //
});

路由参数

  • 使用花括号包裹
  • 路由参数不能包含 - 字符, 需要的话可以使用 _ 替代
// 捕获用户 ID
Route::get('user/{id}', function ($id) {
   
    return 'User '.$id;
});

// 捕获多个参数
Route::get('posts/{post}/comments/{comment}', function ({
   mathJaxContainer[6]}commentId) {
   
    //
});

// 可选参数
Route::get('user/{name?}', function ($name = null) {
   
    return $name;
});
Route::get('user/{name?}', function ($name = 'John') {
   
    return $name;
});

// 正则约束
Route::get('user/{name}', function ($name) {
   
    //
})->where('name', '[A-Za-z]+');

Route::get('user/{id}', function ($id) {
   
    //
})->where('id', '[0-9]+');

Route::get('user/{id}/{name}', function ({
   mathJaxContainer[7]}name) {
   
    //
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

命名路由

// 为路由闭包指定名称
Route::get('user/profile', function () {
   
    //
})->name('profile');

// 为控制器操作指定名称
Route::get('user/profile', 'UserController@showProfile')->name('profile');

// 使用命名路由生成 URL: 不带参数
$url = route('profile');
return redirect()->route('profile');

// 使用命名路由生成 URL: 附带参数
Route::get('user/{id}/profile', function ($id) {
   
    //
})->name('profile');
$url = route('profile', ['id' => 1]);

路由群组

中间件

Route::group(['middleware' => 'auth'], function () {
   
    Route::get('/', function () {
   
        // 使用 Auth 中间件
    });
    Route::get('user/profile', function () {
   
        // 使用 Auth 中间件
    });
});

命名空间

Route::group(['namespace' => 'Admin'], function(){
   
    // 控制器在 "App\Http\Controllers\Admin" 命名空间下
});

子域名路由

Route::group(['domain' => '{account}.myapp.com'], function () {
   
    Route::get('user/{id}', function ({
   mathJaxContainer[8]}id) {
   
        //
    });
});

路由前缀

Route::group(['prefix' => 'admin'], function () {
   
    Route::get('users', function () {
   
        // 匹配 "/admin/users" URL
    });
});

表单方法伪造

<form action="/foo/bar" method="POST">
    <input type="hidden" name="_method" value="PUT">
    <input type="hidden" name="_token" value="{
    { csrf_token() }}">
</form>

或使用辅助函数 method_field :

{
  { method_field('PUT') }}

访问当前路由

$route  = Route::current();
$name   = Route::currentRouteName();
$action = Route::currentRouteAction();

路由缓存

# 添加路由缓存
php artisan route:cache
# 移除路由缓存
php artisan route:clear

路由模型绑定

隐式绑定

// {user} 与 $user 绑定, 如果数据库中找不到对应的模型实例, 会自动生成 HTTP 404 响应
Route::get('api/users/{user}', function (App\User $user) {
   
    return $user->email;
});

// 自定义键名: 重写模型 getRouteKeyName 方法
/**
 * Get the route key for the model.
 *
 * @return string
 */
public function getRouteKeyName()
{
   
    return 'slug';
}

显式绑定

要注册显式绑定, 需要使用路由的 model 方法来为给定参数指定绑定类. 应该在 RouteServiceProvider 类的 boot 方法中定义模型绑定:

public function boot()
{
   
    parent::boot();
    Route::model('user', App\User::class);
}

定义一个包含 {user} 参数的路由:

{
   mathJaxContainer[9]}user) {
   
    //
});

如果请求 URLprofile/1, 就会注入一个用户 ID1User 实例, 如果匹配的模型实例在数据库不存在, 会自动生成并返回 HTTP 404 响应.

自定义解析逻辑

如果你想要使用自定义的解析逻辑, 需要使用 Route::bind 方法, 传递到 bind 方法的闭包会获取到 URI 请求参数中的值, 并且返回你想要在该路由中注入的类实例:

public function boot()
{
   
    parent::boot();
    Route::bind('user', function($value) {
   
        return App\User::where('name', $value)->first();
    });
}

文章来源于本人博客,发布于 2018-06-02,原文链接:https://imlht.com/archives/155/

目录
相关文章
|
机器学习/深度学习 算法 PyTorch
Pytorch自动求导机制详解
在深度学习中,我们通常需要训练一个模型来最小化损失函数。这个过程可以通过梯度下降等优化算法来实现。梯度是函数在某一点上的变化率,可以告诉我们如何调整模型的参数以使损失函数最小化。自动求导是一种计算梯度的技术,它允许我们在定义模型时不需要手动推导梯度计算公式。PyTorch 提供了自动求导的功能,使得梯度的计算变得非常简单和高效。
436 0
|
存储 人工智能 调度
GPT-4 Turbo 发布 | 大模型训练的新时代:超算互联网的调度与调优
算力对训练模型的重要性日益凸显。随着大模型训练的流行,全球显卡和算力正在快速增长。算力后周期市场也在迅速崛起。其中“后”更多是指后服务市场,涵盖从显卡服务器到货IDC之后,形成稳定算力到输出稳定商业推理结果全过程。该过程主要涉及云化、调优、调度、部署、落地和数据管理等环节。
1130 0
|
存储 安全 Java
每日大厂面试题大汇总 —— 今日的是“美团-后端开发-一面”
文章汇总了美团后端开发一面的面试题目,内容涉及哈希表、HashMap、二叉树遍历、数据库索引、死锁、事务隔离级别、Java对象相等性、多态、线程池拒绝策略、CAS、设计模式、Spring事务传播机制及RPC序列化工具等。
291 0
|
机器学习/深度学习 传感器 人工智能
构建未来:AI技术在智能交通系统中的应用
【5月更文挑战第30天】 在快速发展的人工智能领域,智能交通系统作为一个高度集成了多种AI技术的应用平台,正在逐步改变我们的出行方式。本文将深入探讨AI技术在智能交通系统中的关键作用,包括实时数据分析、预测模型构建、自动驾驶车辆以及交通管理优化等方面。通过对当前技术的深度分析与未来趋势的展望,文章旨在提供一个全面的视角,理解AI如何塑造交通的未来。
|
存储 监控 安全
贴片卡的应用场景
贴片卡,通常指的是尺寸小巧、可以直接贴在或嵌入到产品、设备或表面的卡片或芯片,它们集成了电路、存储器、微处理器等电子元件。这些卡片广泛应用于多个行业和领域,以实现数据的存储、传输、认证或控制等功能。以下是贴片卡的一些主要应用场景:
|
存储 API 数据库
深入浅出理解后端开发:从概念到实践
【8月更文挑战第31天】本文将带您走进后端开发的神秘世界,一步步解析后端开发的核心概念、技术栈选择、以及实际开发中的代码实践。我们将通过一个简易的待办事项列表API的开发过程,展示如何从零开始构建一个后端服务,包括数据库设计、RESTful API实现及部署流程。无论您是初学者还是希望深化理解,这篇文章都将为您提供清晰的指导和实用的知识。
|
供应链 定位技术 数据库
仓库选址问题【数学规划的应用(含代码)】阿里达院MindOpt
使用阿里云MindOpt工具,文章展示了如何解决仓库选址的数学规划问题。该问题涉及构建工厂以供应多个商店,考虑因素包括建设成本、库存成本、运输成本和需求量。MindOpt是一个优化求解器,能处理大规模数据的数学规划问题。通过声明集合、参数、变量、目标函数和约束条件,构建模型并求解,以最小化总成本。文中还提到了不同行业的应用场景,如农业、制造业、零售业和电商,并提供了视频讲解和代码示例。
|
存储 编解码 算法
音视频编程ffmepg中的关键术语与概念:深度解析与实践(二)
音视频编程ffmepg中的关键术语与概念:深度解析与实践
485 0
|
Java Spring
Spring Event陷阱重重,我为何含泪放弃?
网络上比较推崇使用Spring Event 优雅的实现观察者模式。我在调研后也确实觉得这种方式能实现业务逻辑上的解耦,但线上的一次事故,让我意识到 Spring Event远远没有那么简单。
849 1
Spring Event陷阱重重,我为何含泪放弃?
|
前端开发 关系型数据库 MySQL
一年时间, 我们开发了一款开箱即用的开源博客系统
一年时间, 我们开发了一款开箱即用的开源博客系统
344 0