laravel笔记-控制器

来源:互联网 发布:在软件广场英文 编辑:程序博客网 时间:2024/06/03 04:16

laravel笔记-控制器

写在前面

时间可贵,善用目录↑

学习Laravel的笔记,仅仅是作为laravel文档笔记,目的是强化对文档的理解,质量不高。


什么是控制器(Controller)

将相关的 HTTP 请求封装到一个类中进行处理。通常控制器存放在 app/Http/Controllers 目录中。

继承App\Http\Controllers\Controller

控制器嘛,起一个控制调度的作用。

一个简单的控制器:

namespace App\Http\Controllers;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)]);    }}

怎么用?

创建

Artisan命令:

php artisan make:controller <controller-name>

当然也可以自己写~

调用

在路由文件中调用控制器~

最简单的一种方法:

//当用户访问user时,调用UserController的show方法Route::get('user/{id}', 'UserController@show');//命名空间可以省略App\Http\Controllers 

和中间件的互动

给控制器分配中间件有两种方法

一是在路由中分配中间件(laravel笔记-中间件、路由中有介绍):

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

二是在控制器中绑定中间件:

class UserController extends Controller{    /**     * 实例化一个新的 UserController 实例     *     * @return void     */    public function __construct()    {        //全局        $this->middleware('auth');        //指定方法        $this->middleware('log')->only('index');        //排除方法        $this->middleware('subscribed')->except('store');    }}

注:你可以将中间件分配给多个控制器动作,不过,这意味着你的控制器会变得越来越臃肿,这种情况下,需要考虑将控制器分割成更多、更小的控制器。


特例?

单动作控制器

就是只有一个方法的控制器,laravel给出了方便的处理方式。
在控制器中定义__invoke方法

namespace App\Http\Controllers;use App\User;use App\Http\Controllers\Controller;class ShowProfile extends Controller{    /**     * Show the profile for the given user.     *     * @param  int  $id     * @return Response     */    public function __invoke($id)    {        return view('user.profile', ['user' => User::findOrFail($id)]);    }}

这样我们就可以在route文件里这么搞:

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

相对简单一点。

资源控制器

我理解是专门做资源处理的控制器。

例如一个专门做图片储存的控制器:

php artisan make:controller PhotoController --resource

生成|的控制器会自动创建如下方法:

方法 路径 动作 路由名称 GET /photos index photos.index GET /photos/create create photos.create POST /photos store photos.store GET /photos/{photo} show photos.show GET /photos/{photo}/edit edit photos.edit PUT/PATCH /photos/{photo} update photos.update DELETE /photos/{photo} destroy photos.destroy

然后他有专门的资源路由:

Route::resource('photos', 'PhotoController');//也可以指定一部分方法Route::resource('photo', 'PhotoController', ['only' =>     ['index', 'show']]);//当然也可以排除Route::resource('photo', 'PhotoController', ['except' =>     ['create', 'store', 'update', 'destroy']]);//或者说我们可以改一改名字Route::resource('photo', 'PhotoController', ['names' =>     ['create' => 'photo.build']]);//当然也可以加点参数Route::resource('user', 'PhotoController', ['parameters' => [    'user' => 'admin_user']]);

补充资源控制器

大多数时候对于一个请求只一个资源控制器是满足不了需求的,这样就可以添加额外的控制器:

//补充控制器路由务必在资源路由之前定义,防止被覆盖。Route::get('photos/popular', 'PhotoController@method');Route::resource('photos', 'PhotoController');

隐式控制器

隐式控制器允许你定义一个路由处理控制器中的每一个动作。

控制器的方法名应该是类似 GET或POST HTTP动词开头。如果以 get 开始,它只会处理 get 请求,如果它使用 post 开駋那么将处理post请求。在HTTP动词后,可以方法使用任何名称,但它应遵循 URI 的格式。

这样的:

route文件:

//绑定控制器Route::controller('my', 'MyController');

MyController.php

namespace App\Http\Controllers;use Illuminate\Http\Request;use App\Http\Requests;use App\Http\Controllers\Controller;class MyController extends Controller {   /**   * Responds to requests to GET /test   */   public function getIndex(){      echo 'index method';   }   /**   * Responds to requests to GET /test/show/1   */   public function getShow($id){      echo 'show method';   }   /**   * Responds to requests to GET /test/admin-profile   */   public function getAdminProfile(){      echo 'admin profile method';   }   /**   * Responds to requests to POST /test/profile   */   public function postProfile(){      echo 'profile method';   }}

关于参数

构造函数注入(依赖注入)

就是说在创建实例的时候就注入依赖,比如说:创建时注入了App\Repositories\UserRepository

方法注入

在方法中注入实例Illuminate\Http\Request

路由参数

Route::put('user/{id}', 'UserController@store');
namespace App\Http\Controllers;use Illuminate\Routing\Controller;use Illuminate\Http\Request;use App\Repositories\UserRepository;class UserController extends Controller{    //依赖注入    /**     * The user repository instance.     */    protected $users;    /**     * 创建新的控制器实例     *     * @param UserRepository $users     * @return void     */    public function __construct(UserRepository $users)    {        $this->users = $users;        ......    }    //方法注入    /**     * 存储新用户     *     * @param Request $request     * @return Response     */    public function store(Request $request ,$id)    {        $name = $request->input('name');        ......    }}

路由缓存

使用路由缓存将会极大减少注册所有应用路由所花费的时间开销。

# 每次修改路由都要重新生成# 生成缓存php artisan route:cache#清除缓存php artisan route:clear

注意:路由缓存不会作用于基于闭包的路由。要使用路由缓存,必须将闭包路由转化为控制器路由。

原创粉丝点击