Laravel 5.2 HTTP(高级)路由与创建控制器
Posted mingc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel 5.2 HTTP(高级)路由与创建控制器相关的知识,希望对你有一定的参考价值。
一、HTTP路由
所有路由都定义在 App\\Providers\\RouteServiceProvider 类载入的 app/Http/routes.php文件中。
1. 基本路由
简单的 Laravel 路由只接受一个 URI 和一个闭包
Route::get(\'foo\', function () { return \'Hello, Laravel!\'; });
对于常见的 HTTP 请求,Laravel 有以下几种路由
Route::get($uri, $callback); //响应 get 请求 Route::post($uri, $callback); Route::put($uri, $callback); Route::patch($uri, $callback); Route::delete($uri, $callback); Route::options($uri, $callback); Route::match([\'get\', \'post\'], $uri, $callback); //响应 get, post 请求 Route::any(\'foo\', $callback); //响应所有请求
其中,$callback 可以是一个闭包,也可以是一个控制器方法。实际上,在开发中有不少情况是用作控制器方法的。
2. 路由参数
//单个路由参数 Route::get(\'user/{id}\', function ($id) { return \'User \'.$id; }); //多个路由参数 Route::get(\'posts/{post}/comments/{comment}\', function ($postId, $commentId) { // }); //单个路由参数(可选) Route::get(\'user/{id?}\', function ($id = 1) { return \'User \'.$id; }); //多个路由参数(可选) Route::get(\'posts/{post}/comments/{comment?}\', function ($postId, $commentId = 1) { // }); //注意:多个参数时,只可以对最后一个参数设置可选,其他位置设置可选会解析错误 // 正则约束单个参数 Route::get(\'user/{name?}\', function ($name = \'Jone\') { return $name; })->where(\'name\', \'\\w+\'); //约束参数为单词字符(数字、字母、下划线) // 正则约束多个参数 Route::get(\'user/{id}/{name}\', function ($id, $name) { // })->where([\'id\' => \'[0-9]+\', \'name\' => \'[a-z]+\']);
二、创建控制器
使用 Artisan 命令创建 php artisan make:controller UserController
现在,在 app/Http/Controllers 这个控制器目录下就生成了 UserController.php 的控制器文件。
三、高级路由
1. 命名路由
//命名闭包路由 Route:get(\'user\', array(\'as\' => \'alial\', function(){}); //或 name 方法链 Route:get(\'user\', function(){})->name(\'alias\'); //命名控制器方法路由 Route:get(\'user\', array(\'uses\' => \'Admin\\IndexController@index\', \'as\' => \'alias\')); //或 name 方法链 Route:get(\'user\', \'Admin\\IndexController@index\')->name(\'alias\'));
2. 路由分组
2.1 路由前缀和命名空间
例如,有两条指向控制器方法的路由
Route::get(\'admin/login\', \'Admin\\IndexController@login\'); Route::get(\'admin/index\', \'Admin\\IndexController@index\');
拿第一条来说,
参数一:admin/login 表示这个 URI 在请求网站根目录下的 admin/login 资源,完整地址就是 http://域名/admin/login (这里开启了 Apache 的路由重写,隐藏了 “index.php“ ),这个请求被映射到第二个参数中指定的控制器方法。注意,网站根目录是入口文件所在目录,在 Laravel 中就是 public 目录,配置服务器时最好也指向这里。
参数二:Admin\\IndexController@login 表示这个控制器方法是在 App\\Http\\Controllers 命名空间下的,连起来就是 App\\Http\\Controllers\\Admin\\IndexController 控制器里的 login 方法。
显然,两条路由的 URI 和 控制器方法 都有相同的部分,那么,启用路由分组可以提取出公共部分:
// 第一个数组参数中,prefix 键定义 URI 的公共部分,namespace 键定义方法名(命名空间语法)的公共部分 Route::group(array(\'prefix\' => \'admin\', \'namespace\' => \'Admin\'), function(){ Route::get(\'login\', \'IndexController@login\'); Route::get(\'index\', \'IndexController@index\'); });
2.2 资源路由
资源路由就是映射到资源控制器的路由,Laravel 资源控制器内置了对资源增删改查的 7 个方法以及 7 条路由。
首先,创建资源控制器 ArticleController
php artisan make:controller Admin/ArticleController --resource
这样就生成了资源控制器在 app/Http/Controllers/Admin/ArticleController.php 文件(Admin 文件夹不存在时会自动创建),内置的 7 个方法如下 :
<?php namespace App\\Http\\Controllers\\Admin; use Illuminate\\Http\\Request; use App\\Http\\Requests; use App\\Http\\Controllers\\Controller; class LinksController extends Controller { /** * 显示一个资源的列表 * * @return \\Illuminate\\Http\\Response */ public function index() { // } /** * 显示一个表单来创建一个新的资源 * * @return \\Illuminate\\Http\\Response */ public function create() { // } /** * 保存最新创建的资源 * * @param \\Illuminate\\Http\\Request $request * @return \\Illuminate\\Http\\Response */ public function store(Request $request) { // } /** * 显示指定的资源 * * @param int $id * @return \\Illuminate\\Http\\Response */ public function show($id) { // } /** * 显示一个表单来编辑指定的资源 * * @param int $id * @return \\Illuminate\\Http\\Response */ public function edit($id) { // } /** * 更新指定的资源 * * @param \\Illuminate\\Http\\Request $request * @param int $id * @return \\Illuminate\\Http\\Response */ public function update(Request $request, $id) { // } /** * 删除指定的资源 * * @param int $id * @return \\Illuminate\\Http\\Response */ public function destroy($id) { // } }
然后,定义资源路由 。这里我还是选择在路由分组下定义,定义一条就好
Route::group(array(\'prefix\' => \'admin\', \'namespace\' => \'Admin\'), function(){ Route::get(\'login\', \'IndexController@login\'); Route::get(\'index\', \'IndexController@index\'); // 资源路由 Route::resource(\'article\', \'ArticleController\'); });
最后,查看路由。有了资源控制器 和 资源路由,就可以看一下对以上 7 个方法的 HTTP 请求方式了。
使用 Artisan 命令 php artisan route:list 列出当前的所有路由,请求方式、URI、控制器方法、中间件都罗列出来了。
推荐阅读:有关 Laravel 的 HTTP 路由知识点还有 路由模型绑定、表单方法伪造 和 CSRF 保护等知识,详细请参考 Laravel 手册-HTTP路由功能。
相关阅读:URI 和 URL 的区别
以上是关于Laravel 5.2 HTTP(高级)路由与创建控制器的主要内容,如果未能解决你的问题,请参考以下文章