最为常用的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/

目录
相关文章
|
14天前
|
API 开发者 Python
"FastAPI路由大揭秘!轻松玩转URL映射,让你的Web应用路由设计既RESTful又灵活多变,秒杀传统框架的秘籍在这里!"
【8月更文挑战第31天】在Web开发中,路由是连接用户请求与后端逻辑的关键。FastAPI作为现代Python Web框架的佼佼者,以其简洁的API设计和高性能,提供了高度灵活的路由系统。本文通过开发一个博客系统的案例,详细介绍了FastAPI中路由的实现方法,包括基础路由定义、参数类型验证及路由分组与嵌套等,展示了如何轻松构建RESTful风格的URL映射,提升应用的可维护性和扩展性。
28 2
|
14天前
|
开发框架 自然语言处理 前端开发
|
1月前
|
负载均衡 算法 网络协议
动态路由的主流算法
【8月更文挑战第3天】BGP 协议使用的算法是路径矢量路由协议(path-vector protocol)。它是距离矢量路由协议的升级版。
|
3月前
|
缓存 监控 中间件
探究Django中间件的神奇:功能、应用场景和核心方法
在Django中,中间件是一个强大的概念,它们提供了一种灵活的方式来处理请求和响应。本文将探讨Django中间件的基本概念、常见应用场景以及中间件类中的父类和核心方法。
|
3月前
|
安全 前端开发 测试技术
安全开发-PHP应用&模版引用&Smarty渲染&MVC模型&数据联动&RCE安全&TP框架&路由访问&对象操作&内置过滤绕过&核心漏洞
安全开发-PHP应用&模版引用&Smarty渲染&MVC模型&数据联动&RCE安全&TP框架&路由访问&对象操作&内置过滤绕过&核心漏洞
|
4月前
|
开发者 Python
Django模板系统的强大之处:动态渲染与扩展性
【4月更文挑战第15天】Django模板系统是Web开发中的强大工具,支持动态渲染和扩展性。动态渲染包括变量、标签和过滤器的使用,实现内容根据上下文数据动态生成。模板继承和自定义标签则提升了扩展性,减少代码重复,增强可维护性。通过这些特性,Django模板系统助力开发者构建高效、动态的Web应用。
|
前端开发 开发工具 开发者
挑战21天手写前端框架 day11 应用元数据与约定式路由
挑战21天手写前端框架 day11 应用元数据与约定式路由
130 0
|
PHP 索引
最为常用的Laravel操作(3)-模板
整理了 Laravel 框架模板最常用的操作,如模板常用语法、模板继承、流程控制、循环等。本系列共有 3 篇文章。
65 0
|
JavaScript
【Vue 开发实战】生态篇 # 20:选择何种模式的路由及底层原理
【Vue 开发实战】生态篇 # 20:选择何种模式的路由及底层原理
55 0
【Vue 开发实战】生态篇 # 20:选择何种模式的路由及底层原理
|
JavaScript 程序员
vue设计一个高扩展性能的路由和实现菜单与路由相结合
我们知道路由一般有两种方案,第一种是基于我们的配置的,另一个就是基于我们自己本身写代码的程序猿自己约定的,约定就是第三方轮子提供的工具暗战其规范生成的路由的配置。
vue设计一个高扩展性能的路由和实现菜单与路由相结合