Lumen 5.2 HTTP 路由入门教程

2019-09-30 作者:网络时代   |   浏览(143)

1、基本路由

 

所有路由都定义在app/Http/routes.php中。最基本的 Lumen 路由接收一个 URI 和一个闭包:

1 基本路由

 

1.1 定义路由的文件

app/Http/routes.php

 

1.2 最基本的路由:

Route::get(''index", function () { return "hello world"; }

可用的路由方法:

Route::get($uri, $callback); Route::post($uri, $callback); Route::put($uri, $callback); Route::patch($uri, $callback); Route::delete($uri, $callback); Route::options($uri, $callback);

 

1.3 一个可以响应多个HTTP动作的路由:

 

Route::match(['get', 'post'], '/', function () { // }); Route::any('foo', function () { // });

 

$app->get('foo', function () {
    return 'Hello World';
});
$app->post('foo', function () {
    //
});

2 路由参数

 

2.1 必选参数

Route::get('user/{id}', function ($id) { return 'User '.$id; });

 

Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) { // });

 

注意: 路由参数不能包含 - 字符。请用下划线 (_) 替换。

 

2.2 可选的路由参数

可以在参数名称后面加上 ? 来实现:

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

 

2.3 正则表达式限制参数

你可以使用 where 方法来限制路由参数格式。where 方法接受参数的名称和定义参数应该如何被限制的正则表达式: Route::get('user/{id}', function ($id) { // }) ->where('id', '[0-9]+'); Route::get('user/{id}/{name}', function ($id, $name) { // }) ->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

 

2.4 全局限制

所有的路由参数都遵循,则可以使用 pattern 方法。

在 RouteServiceProvider 的 boot 方法里定义这些模式:

/** * 定义你的路由模型绑定,模式过滤器等。 * * @param IlluminateRoutingRouter $router * @return void */ public function boot(Router $router) { $router->pattern('id', '[0-9]+'); parent::boot($router); }

 

有效的路由方法

3 命令路由

命名路由让你可以更方便的为特定路由生成 URL 或进行重定向,如果你在每个视图中生成url时候都使用别名,当某个路由改变时候不必去每个url中更改。

 

3.1 使用 as 数组键

Route::get('user/profile', ['as' => 'profile', function () { // }]);

 

Route::get('user/profile', [ 'as' => 'profile', 'uses' => 'UserController@showProfile' ]);

 

3.2 链式调用 name 方法:

Route::get('user/profile', 'UserController@showProfile')->name('profile');

 

3.3 对命名路由生成 URLs

一旦你在指定的路由中分配了名称,则可通过 route 函数来使用路由名称生成 URLs 或重定向:

$url = route('profile'); $redirect = redirect()->route('profile');

如果路由定义了参数,那么你可以把参数作为第二个参数传递给 route 方法。指定的参数将自动加入到 URL 中:

Route::get('user/{id}/profile', ['as' => 'profile', function ($id) { // }]); $url = route('profile', ['id' => 1]);

 

路由器允许你注册响应任何HTTP动作的路由:

4 路由群组

 

路由群组允许你共用路由属性,例如:中间件、命名空间,你可以利用路由群组统一为多个路由设置共同属性,而不需在每个路由上都设置一次。共用属性被指定为数组格式,当作 Route::group 方法的第一个参数。

 

4.1 路由前缀

Route::group(['prefix' => 'admin'], function () { Route::get('users', function () { // 符合「/admin/users」URL }); });

你也可以使用 prefix 参数去指定路由群组中共用的参数:

Route::group(['prefix' => 'accounts/{account_id}'], function () { Route::get('detail', function ($account_id) { // 符合 accounts/{account_id}/detail URL }); });

 

4.2 中间件

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

 

4.3 命名空间

Route::group(['namespace' => 'Admin'], function() { // 控制器在「AppHttpControllersAdmin」命名空间 Route::group(['namespace' => 'User'], function() { // 控制器在「AppHttpControllersAdminUser」命名空间 }); });

 

请记住,默认 RouteServiceProvider 会在命名空间群组内导入你的 routes.php 文件,让你不用指定完整的 AppHttpControllers 命名空间前缀就能注册控制器路由。所以,我们只需要指定在基底 AppHttpControllers 根命名空间之后的部分命名空间。

 

$app->get($uri, $callback);
$app->post($uri, $callback);
$app->put($uri, $callback);
$app->patch($uri, $callback);
$app->delete($uri, $callback);
$app->options($uri, $callback);

5 资源路由

 

请求方法 请求URI 对应的控制器方法 代表的意义
GET /admin/article index 索引/列表
GET /admin/article/create create 创建(显示表单)
POST /admin/article store 保存你创建的数据
GET /admin/article/{id} show 显示对应id的内容
GET /admin/article/{id}/edit edit 编辑(显示表单)
PUT/PATCH /admin/article/{id} save 保存你编辑的数据
DELETE /admin/article/{id} destroy 删除

 

1>定义资源路由Route::resource('admin/article', 'ArticleController');。

2>当我使用get方式访问地址http://yourdomain/admin/article,相当于访问控制器ArticleController的index方法。

3>当我使用get方式访问地址http://yourdomain/admin/article/create,就会访问到create方法。

4>当我通过POST提交数据至地址http://yourdomain/admin/article,相当于由store方法处理。

 

使用命令 php artisan route:list 可以查看我们现有的路由,如下截图

澳门新葡亰网址大全 1

 澳门新葡亰网址大全 2

2、路由参数

6 控制器路由

注意:laravel5.3版本中被彻底移除

控制器路由我认为主要是解决路由定义繁杂的情况,因为大型的应用业务复杂,控制器相当的多,我们不可能每一个控制器的方法都要定义一个路由。Laravel的控制器路由可以完美解决问题:

Route::controller('/', 'HomeController');

我们的控制器方法的写法也要有所变化:

<?php namespace AppHttpControllers; use AppHttpControllersController; class HomeController extends Controller { /** * 显示首页。 * * @return Response */ public function getIndex() { return view('home'); } /** * 显示关于界面 * * @return Response */ public function getAbout() { return view('about'); } }

依照上述例子,如果我们访问地址http://yourdomain/就会显示HomeController的getIndex方法产生的内容,访问http://yourdomain/about,就会显示getAbout方法产生的内容。除了使用如get{Method}这种格式,还可以有post{Method}、delete{Method}等,至于前缀get,post等代表的意义,应该猜得出吧?

 

这样的定义我们可以不用再给控制器的每一个方法定义一个路由,只需给控制器定义一个路由即可。

 

 

 

必选参数

有时我们需要在路由中捕获URI片段,比如,如果想要从URL中捕获用户ID,可以通过如下方式定义路由参数:

$app->get('user/{id}', function ($id) {
    return 'User '.$id;
});
可以按需要定义在路由中定义多个路由参数:

$app->get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
    //
});

路由参数总是通过花括号进行包裹,参数在路由被执行时会被传递到路由的闭包。

注意:路由参数不能包含’-‘字符,需要的话可以使用_替代。

3、命名路由

命名路由使生成URL或者重定向到指定路由变得很方便,在定义路由时指定路由名称,然后使用数组键as指定路由别名:

$app->get('profile', ['as' => 'profile', function () {
    //
}]);

澳门新葡亰网址大全,还可以为控制器动作指定路由名称:

$app->get('profile', [
    'as' => 'profile', 'uses' => 'UserController@showProfile'
]);
生成指向命名路由的URL

一旦你为给定路由分配了名字,通过route函数生成URL时就可以使用路由名字:

本文由澳门新葡亰网址大全发布于网络时代,转载请注明出处:Lumen 5.2 HTTP 路由入门教程

关键词: