乐趣区

关于php:Laravel-框架之路由基础

What 局部

路由的概念(定义)、作用

留神:Laravel 路由仅指 Web 中的后端路由。

概念:Laravel 中路由,是指外界拜访 Laravel 应用程序的通路。
作用:定义外界拜访 Laravel 应用程序的资源或逻辑处理程序的匹配规定。也就是说,通过路由,咱们能够通过与路由匹配的 申请形式1 和 URI2 拜访到对应的资源或处理程序。

Laravel 各版本路由配置的一些区别

版本 默认路由文件
>= 5.3 routes/web.app
~5.1, ~5.2 app/Http/routes.php

How 局部

写在后面

  1. 不要再路由中写逻辑代码,逻辑代码请放到 controller 解决
  2. 路由缓存不会作用于基于闭包的路由。
  3. 绝不 在路由配置文件里书写『闭包路由』或者其余业务逻辑代码,因为一旦应用将无奈应用 路由缓存。
  4. 路由器要放弃洁净整洁,绝不 搁置除路由配置以外的其余程序逻辑
  5. 优先应用 Restful 路由(即资源路由)

路由的形成、分类

形成 Laravel 路由最外围的三局部:申请形式(Method)、URI、解决形式(Action)。

按 Action 可分为:根本路由、控制器路由。

// 根本路由。只需一个 URI 和一个闭包函数
Route::get('index', function () {return 'hello world';});

// 控制器路由。只需一个 URI 和 一个控制器接口
// 写法一
Route::get('users', 'App\Http\Controllers\UsersController@index');
// 写法二
Route::get('users', ['App\Http\Controllers\UsersController', 'index']);
// 写法三
use App\Http\Controllers\UsersController
Route::get('users', [UsersController::class, 'index']);
// 写法四
Route::namespace('App\Http\Controllers')->group(function () {Route::get('users', 'UsersController@index');
});

按 Method 可分为:根本路由(同上)、视图路由、重定向路由、回进路由、资源路由。

// 视图路由
Route::view(
    'index', //uri,必填
    'index', // 视图名称,必填
    ['name' => 'jack', 'gender' => '男'], // 参数,选填
);

// 重定向路由
Route::redirect('welcome', 'index');

// 回进路由
Route::fallback(function () {abort(404);
});

// 资源路由
Route::resource('users', UsersController::class);

资源路由

应用 php artisan route:list 可查看已注册的路由。

Route::resource('users', UsersController::class);

向下面的资源路由代码,即是资源路由的个别定义。它等同于定义了以下七个路由:

// 1. 获取全副用户数据。相当于拜访列表页
Route::get('/users', 'UsersController@index')->name('users.index');
// 2. 拜访用户的新增页面
Route::get('/users/create', 'UsersController@create')->name('users.create');
// 3. 新增用户的逻辑解决
Route::post('/users', 'UsersController@store')->name('users.store');
// 4. 拜访用户详情展现页面
Route::get('/users/{user}', 'UsersController@show')->name('users.show');
// 5. 拜访用户详情编辑页面
Route::get('/users/{user}/edit', 'UsersController@edit')->name('user.edit');
// 6. 更新用户的逻辑解决
Route::put('/users/{user}', 'UsersController@update')->name('users.update');
// 7. 删除用户的逻辑解决
Route::delete('/users/{user}', 'UsersController@destroy')->name('users.destroy');

应用 resource 办法时,如果仅应用到局部路由,必须 应用 only 列出所有可用路由, 绝不 应用 except,因为 only 相当于白名单,绝对于 except 更加直观。路由应用白名单有利于养成『平安习惯』:

Route::resource('photos', 'PhotosController', ['only' => ['index', 'show']]);

路由参数

路由参数通常放在 {} 内,而且参数名只能为字母,同时路由参数不能蕴含 - 符号,如果须要请应用下划线 _ 代替。路由参数会按程序顺次被注入到路由回调或者控制器中,而不受回调或者控制器的参数名称的影响。

// 必填参数
Route::get('users/{id}', function ($id) {return '用户 id:'.$id;});

// 可选参数。可选参数必须有默认值。Route::get('users/{id}/{name?}', function ($id, $name) {return '用户 id:'.$id.",用户名:".$name;});

路由命名

路由命名能够不便地为指定路由生成 URL 或者重定向。

// 写法一
Route::get('users/{id}', function ($id) {return '用户 id:'.$id;})->name('userInfo');
// 写法二
Route::get('users/{id}/{name?}', ['as' => 'userInfo', function ($id) {return '用户 id:'.$id;}]);

路由组

路由组容许外部的路由共享雷同的路由属性(中间件、子域名、命名空间、路由前缀、路由名称前缀)

路由属性之中间件

给路由组中的所有路由调配中间件,中间件会按他们在数组中的程序来运行。

// 写法一
Route::middleware(['web', 'auth'])->group(function () {});
// 写法二
Route::group(['middleware' => ['web', 'auth']], function () {});

路由属性之子域名

// 写法一
Route::domain('test.myapp.com')->group(function () {});
// 写法二
Route::group(['domain' => 'test.myapp.com'], function () {});

路由属性之命名空间

// 写法一
Route::namespace('App\Http\Controllers')->group(function () {});
// 写法二
Route::group(['namespace' => 'App\Http\Controllers'], function () {});

路由属性之路由前缀

// 写法一
Route::prefix('admin')->group(function () {});
// 写法二
Route::group(['prefix' => 'admin'], function () {}) ;

路由属性之路由名称前缀

// 写法一
Route::name('admin.')->group(function () {});
// 写法二
Route::group(['as' => 'admin.'], function () {});
// 写法三
Route::group(['name_prefix' => 'admin.'], function () {});

路由模型绑定

当向路由或控制器行为注入模型 ID(默认为”id“字段,能够在 Eloquent 模型重写 getRouteKeyName()办法,来应用其余字段),Laravel 提供了一个间接主动将与此 ID 匹配的模型实例注入到路由中的办法。

  1. 隐式绑定

    Laravel 会主动解析定义在路由或控制器中,与类型提醒的变量名匹配的路由段名称的模型。

    Route::get('users/{user}', function (APP\Models\User $user) {});
  2. 显示绑定

    要注册显式绑定,应用路由器的 model 办法来为给定参数指定类。在 RouteServiceProvider 类中的 boot 办法内定义这些显式模型绑定.

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

如果想自定义模型绑定的解析逻辑,可在 boot 办法里应用Route::bind 办法。

public function boot()
{parent::boot();

    Route::bind('user', function ($value) {return App\User::where('name', $value)->first() ?? abort(404);
    });
}

拜访以后路由

$route = Route::current(); // 以后路由对象

$name = Route::currentRouteName(); // 以后路由名称

$action = Route::currentRouteAction(); // 以后路由行为

整体用法

单个路由中不反对命名空间路由参数,无奈应用 namespace 参数或 namespace 办法

// 1. 单个路由。单个路由中不反对命名空间路由参数,无奈应用 namespace 参数或 namespace 办法
// 1.1 用法一。Route::get('users/{user}',[
    'middleware' => 'web', // 中间件
    // 'domain' => 'test.myapp.com', // 子域名
    'prefix' => 'admin', // 路由前缀
    'as' => 'admin.user', // 路由名称(也叫路由别名)
    // 控制器 / 闭包函数选一个。'uses' => 'App\Http\Controllers\UsersController@index', // 控制器行为
]);
// 1.2 写法二。Route::get('users/{user}',[
    'middleware' => 'web', // 中间件
    // 'domain' => 'test.myapp.com', // 子域名
    'prefix' => 'admin', // 路由前缀
    'as' => 'admin.user', // 路由名称(也叫路由别名
    function () {return "hello 这是路由整体用法测试";}
]);
// 1.3 写法三。Route::get('users/{user}', 'App\Http\Controllers\UsersController@index')
->middleware('web')
// ->domain('test.myapp.com')
->prefix('admin')
->name('admin.user');

// 2. 针对路由组
// 2.1 写法一
Route
::namespace('App\Http\Controllers')
->middleware('web')
// ->domain('test.myapp.com')
->prefix('admin')
->name('admin.')
->group(function () {Route::get('users/{user}', 'UsersController@index')->name('user');
});
// 2.2 写法二
Route::group([
    'middleware' => 'web',
    // 'domain' => 'test.myapp.com',
    'prefix' => 'admin',
    'namespace' => 'App\Http\Controllers',
    'as' => 'admin.'
], function () {Route::get('users/{user}', 'UsersController@index')->name('user');
});

  1. 指 HTTP 申请形式:GET、POST、PUT、DELETE 等。↩
  2. Unified Resource Identifier,对立资源标识符。↩
退出移动版