简介#

除了在路有文件中以闭包的形式定义所有的请求处理逻辑外,还可以使用控制器类来组织此类行为,控制器能够将相关

的请求处理逻辑组成的一个单独的类,控制器被存放在app/Http/Controller目录下。

基础控制器#

定义控制器#

下面是一个基础控制器的例子。需要注意的是,该控制器继承了Laravel 内置的基础控制器类,该基础控制器类提供了一些

便捷的方法,比如 middleware 方法,该方法可以用来给控制器行为添加中间件:

<?php

namespace App\Http\Controller;

use App\User;

use App\Http\Controllers\Controller;

class userController extends Controller

{

  /*

    展示给定用户的信息。

    @param int $id

    @return Response

  */

  public function show($id)

  {

    return view('user.profile',['user'=>User::findOrFail($id)]);

  }

}

你可以这样定义一个指向该控制器行为的路由:

Route::get('user/{id}','UserController@show');

现在,当一个请求与此指定路由的URL匹配时,UserController 类的show 方法就会被执行。当然,路由参数也会

被传递至该方法。

注意: 控制器并不是一定要继承基础类,但是,如果控制器没有继承基础类,你将无法使用一些便捷的功能,

比如:middleware validate 和 dispatch 方法。

控制器与命名空间

需要注意的是,在定义控制器的路由时候,我们不需要指定完整的控制器命名空间,因为 RouteServiceProvider

会在一个包括命名空间的路由器组中加载路由文件,所以我们只需要指定类名中,

App\Http\Controllers 命名空间之后的部分就可以了。

如果你选择将控制器存放在 App\Http\Controllers 目录下的某一个目录,只需要简单的使用相对于

App\Http\Controllers 根命名空间的特定类名,也就是说,如果完整的控制器类是

App\Http\Controller\Photos\AdminController 那你应该用以下这种方式向控制器注册路由:

Route::get('foo','Photos\AdminController@method');

单个行为控制器#

如果你想定义一个只处理单个行为的控制器,你可以在控制器中放置一个 __invoke 方法:

注册单个行为控制器的路由时,不需要指定方法:

Route::get('user/{id}','ShowProfile');

控制中间件#

中间件可以在路有文件中被分配给控制器路由:

Route::get('profile','UserController@show')->middleware('auth');

但是,在控制器的构造方法中指定中间件会更方便,使用控制器构造函数中middleware 方法,你可以很容易地将

中间件分配给控制器的行为,你甚至可以约束中间件只对控制器类中的某些特定方法生效:

class UserController extends Controller

{

  /*

    实例化一个新的控制器实例

  */

  publoic function __construct()

  {

    $this->middleware('auth');

    $this->middleware('log')->only('index');

    $this->middleware('subscribed')->except('store');

}

}

还能使用闭包来为控制器注册中间件。闭包的方便之处在于,你无需特地创建一个中间件类来为某一个特殊的控制器

注册中间件:

$this->middleware(function($request,$next){

  return $next($request);

});

你可以将中间件分配给控制器的部分行为上,然后这样可能意味着你的控制器正在变得很大,这里建议你将控制器

分成多个更小的控制器。

资源控制器#

Laravel 资源控制器路由将典型的[CRUD] 路由分配给具有单行代码的控制器,比如,创建一个控制器来处理应用保存的

[照片] 的所欲HTTP 请求,使用Artisan 命令make::controller 来快速创建控制器:

php artisan make:controller PhotoController --resource

这个命令生成一个控制器 app/Http/Controllers/PhotoController.php 。 其中包含了每个可用资源的操作方法。

接下来,你可以给控制器注册一个资源路由:

Route::resource('photos','PhotoController');

这个路由声明创建多个路由来处理资源上的各种行为,生成的快控制器为每个行为保留了方法,同时还包括了处理HTTP

动作和URI的声明注释

指定资源模型#

如果你使用了路由模型绑定,并且想在资源控制器的 方法中使用类型提示,你可以在生成控制器的时候使用 --model

选项:

php artisan make:controller PhotoController -- resource --model=Photo

伪造表单方法#

因为HTML 表单不能生成 PUT  PATCH 或者 DELETE 请求,所以你需要添加一个隐藏的_method 输入字段来伪造这些

HTTP动作,辅助函数method_field 可以帮你创建这个字段:

{{method_field('PUT')}}

部分资源路由#

声明资源路由时,你可以指定控制器处理的部分行为,而不是所有默认的行为:

Route::resource('photo','PhotoController',['only'=>['index','show']]);

Route::resource('photo','PhotoController',['except'=>['create','store','update','destory']]);

API资源路由#

当声明用于APIs的资源路有时,通常需要排除显示HTML 模板的路由(如create he edit) 为了方便起见,你可以使用 apiResource

方法自动排除这两个路由:

Route::apiResource('photo','PhotoController');

你可以传递一个数组给 apiResources 方法来注册多个API资源控制器:

Route::apiResources([

  'photos' => 'PhotoController',

  'posts'  => 'PostController'

]);

命名资源路由#

默认情况下,所有的资源控制器行为都有一个路由名称,你可以传入names 数组来覆盖这些名称:

Route::resource('photo','PhotoController',[

  'names' => [

  'create' => 'photo.build'

]

]);

最新文章

  1. 我们常用,却容易忽视——CSS的BFC(Block formatting contexts)
  2. HDU1541 树状数组
  3. 使用navigator.geolocation来获取用户的地理位置信息
  4. 简易购物车 --day2
  5. PHP无限极分类生成树方法,无限分级
  6. VMware打卡虚拟机提示“此虚拟机可能已被复制或移动”
  7. android 退出整个程序
  8. 字符设备驱动、平台设备驱动、设备驱动模型、sysfs的比较和关联
  9. C#超时处理(转载)
  10. [IDEA学习笔记][keymap]
  11. DOM方法入门 - 第二课
  12. JAVA-读取文件部分内容计算HASH值
  13. C语言学生信息管理系统项目源码
  14. hibernate--HelloWorld
  15. centos7 安装zabbix
  16. java中带参数的try(){}语法
  17. [Canvas]用透明PNG图在背景上画前景能不遮挡背景
  18. jdk下载--操作系统
  19. SQL Server删除表及删除表中数据的方法
  20. QSignalMapper类处理多信号关联同一个槽的方法(2)

热门文章

  1. 爬虫之robots.txt
  2. MobaXterm实时查看Linux服务器上的日志
  3. 【洛谷P1827】【USACO】 美国血统 American Heritage 由二叉树两个序列求第三个序列
  4. npm ci命令比npm installer命令快2至10倍
  5. 微信小程序之组件开发中的基础知识
  6. 创建多个Django业务模块
  7. mysql错误日志目录
  8. MySQL与PostgreSQL比较 哪个数据库更好
  9. 微信小程序开发之图片等比例缩放 获取屏幕尺寸图片尺寸 自适应
  10. Android平台本地(离线)打包指南 - Android Studio