Laravel的控制器类通常存放在laravel/app/Http/Controllers目录下。应用程序的控制器类需要继承Laravel的控制器基类(Illuminate/Routing/Controller)。控制器类作为HTTP请求的二次分发控制部分,与路由有着紧密的关系,Laravel通依赖注入的方式降低了这种耦合。
控制器路由
前面讲了路由的处理由闭包函数完成,其实也可以将请求分发给控制器的具体函数进行处理。
基础控制器路由
基本格式与前面的路由一致,只是将第二个参数从闭包函数换为"控制器类@函数名"形式的字符串。如:
Route::get('user/{name}', 'UserController@index');
上述用例中,将user/{name}形式的请求分发给UserController下的index函数进行处理,其中index函数需要一个形参用于接收URL中的name参数。控制器类如:
namespace App\Http\Controllers;
use Illuminate\Routing\Controller as BaseController;
class UserController extends BaseController
{
public function index($name)
{
return 'Hello ' . $name;
}
}
隐式控制器路由(在Laravel 5.3中被弃用)
基础控制器路由需要对路由逐个定义,效率较低,而隐式控制器路由是一条语句定义多条路由信息。
隐式控制器路由的具体格式:
Route::controller('路由前缀', '控制器类名' [, 命名路由]);
// 最后一个参数是当需要添加命名路由时,才以关联数组的形式给出。
实例:
// 路由
<?php
Route::controller('user', 'UserController');
// 控制器类
<?php
namespace App\Http\Controllers;
use Illuminate\Routing\Controller as BaseController;
class UserController extends BaseController
{
public function getIndex($name)
{
return 'Hello ' . $name;
}
public function anyTest()
{
return 'This is any request Test';
}
public function postIndex()
{
}
}
以上实例中,user/index/Alan的GET请求会被分发给getIndex方法;user/test的任意请求都会被分发给anyTest方法;user/index的POST请求会分发给postIndex方法。
注意:
① 隐式控制器路由在5.3版本及之后被弃用;
② 路由前缀可以为'/';
③ 当控制器的方法名为多个单词时(如:getUserIndex),请求地址应该是home-index的形式;
RESTful资源控制器路由
定义格式:
Route::resource('根资源标识', '控制器类名');
resource方法可以创建多条路由来处理不同的HTTP请求,控制器类的方法与HTTP请求的对应关系如下:
请求方法 | 路径 | 行为 | 控制器类处理函数名 |
---|---|---|---|
GET | /home | 索引(首页) | index |
GET | /home/create | 创建 | create |
POST | /home | 保存 | store |
GET | /home/{id} | 显示 | show |
GET | /home/{id}/edit | 编辑 | edit |
PUT/PATCH | /home/{id} | 更新 | update |
DELETE | /home/{id} | 删除 | destroy |
用例:
// 路由文件
<?php
Route::resource('user', 'UserController');
// 控制器类
<?php
namespace App\Http\Controllers;
use Illuminate\Routing\Controller;
class UserController extends Controller
{
public function index()
{
return 'This is index';
}
public function show($id)
{
return 'ID is' . $id;
}
}
上述用例中,当路由为'/'时,GET请求被分发到index方法;'/home/12'时,GET请求被分发到show方法。