laravel 路由控制器的一些要点(详细)

 

 

----------------- 不熟悉 ---------------------

13. 对路由参数的正则: 使用 where()
Route::get('page/{id}', function ($id) {
return '页面ID: ' . $id;
})->where('id', '[0-9]+');

Route::get('page/{name}', function ($name) {
return '页面名称: ' . $name;
})->where('name', '[A-Za-z]+');

Route::get('page/{id}/{slug}', function ($id, $slug) {
return $id . ':' . $slug;
})->where(['id' => '[0-9]+', 'slug' => '[A-Za-z]+']);


20. 子域名路由

子域名路由
子域名路由和路由路径前缀一样,不过是通过子域名而非路径前缀对分组路由进行约束,子域名路由有两个使用场景,一个是为应用子系统设置不同的子域名:

Route::domain('admin.blog.test')->group(function () {
Route::get('/', function () {
// 处理 http://admin.blog.test 路由
});
});
另一个是通过参数方式设置子域名,适用于网站拥有多租户的场景(比如天猫,顶级知名商家拥有自己独立的子域名,如 https://xiaomi.tmall.com):

Route::domain('{account}.blog.test')->group(function () {
Route::get('/', function ($account) {
//
});
Route::get('user/{id}', function ($account, $id) {
//
});
});
这种情况下,$account 永远是所有分组路由的第一个路由参数。

 

24. 带参数的路由
public function index()
{
return view('task.index')
->with('tasks', Task::all());
}


25. 控制器demo

Route::get('task/create', 'TaskController@create'); // 渲染一个任务提交表单
Route::post('task', 'TaskController@store'); // 存储提交的任务数据

public function store(Request $request)
{
$task = new Task();
$task->title = $request->input('title');
$task->description = $request->input('description');
$task->save();
return redirect('task'); // 重定向到 GET task 路由
}


// $task->title = Input::get('title');
// 这种写法需要: use Illuminate\Support\facades\Input


26. 资源控制器方法列表
以上 PostController 控制器的每个方法都有对应的请求方式、路由命名、URL、方法名和业务逻辑约定。

HTTP请求方式 URL 控制器方法 路由命名 业务逻辑描述
GET post index() post.index 展示所有文章
GET post/create create() post.create 发布文章表单页面
POST post store() post.store 获取表单提交数据并保存新文章
GET post/{post} show() post.show 展示单个文章
GET post/{id}/edit edit() post.edit 编辑文章表单页面
PUT post/{id} update() post.update 获取编辑表单输入并更新文章
DELETE post/{id} destroy() post.desc 删除单个文章
绑定资源服务器

 

27. 隐式路由模型绑定:
·> 默认: 根据资源 ID 查询资源信息
·> 重定义: 在model的getRouteKeyName()方法中指定

Route::get('/post/{task}', function(\App\Models\Task $task){ ... $task是一个model的查询结果 })

Task模型中定义重写方法
class Task extends Model
{
public function getRouteKeyName() {
return 'name'; // 以任务名称作为路由模型绑定查询字段
}
}


28. 显式路由模型绑定:
App\Providers\RouteServiceProvider 的 boot()
public function boot()
{
// 显式路由模型绑定
Route::model('task_model', Task::class);

parent::boot();
}


每次访问包含 {task_model} 参数的路由时,路由解析器都会从请求 URL 中解析出模型 ID ,然后从对应模型类 Task 中获取相应的模型实例并传递给闭包函数或控制器方法
Route::get('task/model/{task_model}', function (\App\Models\Task $task) {
dd($task);
});


29. 设置访问频率

Route::middleware('throttle:60,1')->group(function () {
Route::get('/user', function () {
//
});
});


模型属性来动态设置频率,例如,我们可以为上述通过 throttle 中间件进行分组的路由涉及到的模型类定义一个 rate_limit 属性,然后这样来动态定义这个路由:

Route::middleware('throttle:rate_limit,1')->group(function () {
Route::get('/user', function () {
// 在 User 模型中设置自定义的 rate_limit 属性值
});
Route::get('/post', function () {
// 在 Post 模型中设置自定义的 rate_limit 属性值
});
});

 

30. 路由缓存

路由缓存只能用于控制器路由,不能用于闭包路由,
如果路由定义中包含闭包路由将无法进行路由缓存,
只有将所有路由定义转化为控制器路由或资源路由后才能执行

路由缓存命令:
php artisan route:cache
如果想要删除路由缓存,可以运行:
php artisan route:clear

应用部署脚本中执行 php artisan route:cache
(运行此命令之前先要清理之前的缓存),即只在生产环境中使用路由缓存,


路由缓存对系统性能的提升应该是微乎其微的,但如果你很在意那几毫秒,则可以考虑,但是需要付出的代价是不能使用任何闭包路由,此外,由于使用路由缓存需要在每次变动路由后重新生成缓存,所以建议在应用部署脚本中执行 php artisan route:cache(运行此命令之前先要清理之前的缓存),即只在生产环境中使用路由缓存,本地开发环境路由经常变动,且没有性能方面的考虑,无需缓存。

 

 

posted @ 2019-06-17 17:41  aocn  阅读(201)  评论(0)    收藏  举报