zoukankan      html  css  js  c++  java
  • Laravel5.1学习笔记4 控制器

    HTTP 控制器

    简介

    除了在单一的 routes.php 文件中定义所有的请求处理逻辑之外,你可能希望使用控制器类来组织此行为。控制器可将相关的 HTTP 请求处理逻辑组成一个类。控制器通常存放在app/Http/Controllers 目录中。

    #基础控制器

    这里是一个基础控制器类的例子:

    <?php

    namespace AppHttpControllers;

    use AppHttpControllersController;

    class UserController extends Controller
    {
    /**
    * Show the profile for the given user.
    *
    * @param int $id
    * @return Response
    */
    public function showProfile($id)
    {
    return view('user.profile', ['user' => User::findOrFail($id)]);
    }
    }

    我们可以通过如下方式引导路由至对应的控制器动作:

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

    注意: 所有的控制器都应该扩展基础控制器类。

    现在,当一个请求地址匹配特定路由时,UserController 类中的 showProfile 方法就会得到执行, 当然,路由的参数也会传递到方法中。

    控制器和命名空间

    有一点非常重要,那就是我们无需指明完整的控制器命名空间,在类名称中 AppHttpControllers之后的部分即可用于表示「根」命名空间。 RouteServiceProvider 默认会在包含根控制器命名空间的路由群组中,加载 routes.php 文件。

    若你要在 AppHttpControllers 此目录深层使用 PHP 命名空间以嵌套化或组织你的控制器,只要使用相对于 AppHttpControllers 根命名空间的特定类名称即可。因此,若你的控制器类全名为AppHttpControllersPhotosAdminController,你可以像这样注册一个路由:

    Route::get('foo', 'PhotosAdminController@method');

    命名控制器路由

    和闭包路由一样,你也可以指定控制器路由的名称。

    Route::get('foo', ['uses' => 'FooController@method', 'as' => 'name']);

    指向控制器行为的 URL

    Once you have assigned a name to the controller route, you can easily generate URLs to the action. To generate a URL to a controller action, use the action helper method. Again, we only need to specify the part of the controller class name that comes after the base AppHttpControllersnamespace:

    $url = action('FooController@method');

    也可以用 route 辅助方法来产生命名控制器路由的URL

    $url = route('name');

    #控制器中间件

    中间件 可在控制器路由中指定,例如:

    Route::get('profile', [
    'middleware' => 'auth',
    'uses' => 'UserController@showProfile'
    ]);

    然而,更方便的是在控制器构造器中指定中间件, 在构造器中使用middleware 方法,你就可以给控制器指定中间件,你还可以限制中间件使用于控制器类的特定方法。

    class UserController extends Controller
    {
    /**
    * Instantiate a new UserController instance.
    *
    * @return void
    */
    public function __construct()
    {
    $this->middleware('auth');

    $this->middleware('log', ['only' => ['fooAction', 'barAction']]);

    $this->middleware('subscribed', ['except' => ['fooAction', 'barAction']]);
    }
    }
     

    #RESTful 资源控制器

    资源控制器可让你无痛建立和资源相关的 RESTful 控制器。例如,你可能希望创建一个控制器,它可用来处理针对你的应用程序所保存相片的 HTTP 请求。我们可以使用 make:controller Artisan 命令,快速创建这样的控制器:

    php artisan make:controller PhotoController
    这个Artisan命令会在 app/Http/Controllers/PhotoController.php 生成控制器文件, 这个控制器会对每个资源操作类型产生一个方法。 接着,我们注册一个指向此控制器的资源路由:
    Route::resource('photo', 'PhotoController');
    此单一路由声明创建了多个路由,用来处理各式各样和相片资源相关的 RESTful 行为。同样地,产生的控制器已有各种和这些行为绑定的方法,包含了提醒你它们处理了那些 URI 及动词的说明注释。
     
     

    由资源控制器处理的行为

    Verb Path Action Route Name
    GET /photo index photo.index
    GET /photo/create create photo.create
    POST /photo store photo.store
    GET /photo/{photo} show photo.show
    GET /photo/{photo}/edit edit photo.edit
    PUT/PATCH /photo/{photo} update photo.update
    DELETE /photo/{photo} destroy photo.destroy
     
     

    部分资源路由

    当声明资源路由时,你也可以指定动作actions的一个子集来处理路由:

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

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

    命名资源路由


    所有的资源控制器行为默认都有个路由名称。然而你可在选项中传递一个 names 数组来重载这些名称:

    Route::resource('photo', 'PhotoController',
    ['names' => ['create' => 'photo.build']]);

    处理嵌套资源控制器

    在你的路由声明中使用「点」号来「嵌套化」资源控制器:

    Route::resource('photos.comments', 'PhotoCommentController');

    此路由会注册一个「嵌套的」资源,可透过像 photos/{photos}/comments/{comments} 这样的 URL 来访问。

    <?php

    namespace AppHttpControllers;

    use AppHttpControllersController;

    class PhotoCommentController extends Controller
    {
    /**
    * Show the specified photo comment.
    *
    * @param int $photoId
    * @param int $commentId
    * @return Response
    */
    public function show($photoId, $commentId)
    {
    //
    }
    }

    在资源控制器中加入其他的路由

    If it becomes necessary to add additional routes to a resource controller beyond the default resource routes, you should define those routes before your call to Route::resource; otherwise, the routes defined by the resource method may unintentionally take precedence over your supplemental routes:

    在资源控制器之外添加额外路由已成为必要, 你应该在资源控制器之前就定义那些路由, 否则,资源方法定义的路由会不小心优先于附加的路由。

    Route::get('photos/popular', 'PhotoController@method');

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

     

    #隐式控制器

    Laravel 让你能轻易地定义单一路由来处理控制器中的每一项行为。首先,用 Route::controller 方法定义一个路由,Controller 方法接受两个参数。第一个参数是控制器欲处理的 base URI,第二个是控制器的类名称。接着只要在你的控制器中加入方法,并在名称前加上它们所对应的 HTTP 请求。

    Route::controller('users', 'UserController');

    <?php

    namespace AppHttpControllers;

    class UserController extends Controller
    {
    /**
    * Responds to requests to GET /users
    */
    public function getIndex()
    {
    //
    }

    /**
    * Responds to requests to GET /users/show/1
    */
    public function getShow($id)
    {
    //
    }

    /**
    * Responds to requests to GET /users/admin-profile
    */
    public function getAdminProfile()
    {
    //
    }

    /**
    * Responds to requests to POST /users/profile
    */
    public function postProfile()
    {
    //
    }
    }

    index 方法会响应控制器处理的根 URI ,在这个例子中是 users

    如果你的控制器行为包含多个字词,你可以在 URI 中使用「破折号」语法来访问此行为。例如,下面这个在 UserController 中的控制器动作会响应 users/admin-profile 此一 URI :

    public function getAdminProfile() {}

    设定路由名字

    如果你想“命名”一些控制器的路由,你可以给 controller 方法传入第三个参数:

    Route::controller('users', 'UserController', [
    'anyLogin' => 'user.login',
    ]);

     

    依赖注入和控制器

    构造器注入

    Laravel 服务容器 用于解析所有的 Laravel 控制器。因此,你可以在控制器所需要的构造器中,对依赖作任何的类型限制。依赖会自动绑定,并注入到controller实例中。

    <?php

    namespace AppHttpControllers;

    use IlluminateRoutingController;
    use AppRepositoriesUserRepository;

    class UserController extends Controller
    {
    /**
    * The user repository instance.
    */
    protected $users;

    /**
    * Create a new controller instance.
    *
    * @param UserRepository $users
    * @return void
    */
    public function __construct(UserRepository $users)
    {
    $this->users = $users;
    }
    }

    当然了,你也可以对任何的 Laravel contract 作类型限制。只要容器能解析它,你就可以对它作类型限制。

    方法注入

    除了建构器注入外,你也可以对控制器方法的依赖作类型限制。例如,让我们对某个方法的Request 实例作类型限制:

    <?php

    namespace AppHttpControllers;

    use IlluminateHttpRequest;
    use IlluminateRoutingController;

    class UserController extends Controller
    {
    /**
    * Store a new user.
    *
    * @param Request $request
    * @return Response
    */
    public function store(Request $request)
    {
    $name = $request->input('name');

    //
    }
    }

    如果你的控制器方法预期由路由参数取得输入,只要在其他的依赖之后列出路由参数即可:

    Route::put('user/{id}', 'UserController@update');
     
    <?php

    namespace AppHttpControllers;

    use IlluminateHttpRequest;
    use IlluminateRoutingController;

    class UserController extends Controller
    {
    /**
    * Update the specified user.
    *
    * @param Request $request
    * @param int $id
    * @return Response
    */
    public function update(Request $request, $id)
    {
    //
    }
    }


    注意: 方法注入和 模型绑定 是完全兼容的。容器可智能地判断那些参数和模型相关以及那些参数应该被注入。他妈也神奇了。

    路由缓存

    若您的应用只使用了控制器路由,你可利用 Laravel 的路由缓存。使用路由缓存,将大幅降低注册应用程序所有路由所需要的时间。某些情况下,路由注册甚至可以快上 100 倍。要产生路由缓存,只要执行 route:cache Artisan 命令:

    php artisan route:cache

    就是这样!你的缓存路由文件将会被用来代替 app/Http/routes.php 此一文件。记住,若你增加了任何新的路由,你就 必须产生一个新的路由缓存。因此在应用部署时,你可能会希望只要执行route:cache 命令:

    要移除路由缓存文件,但不希望产生新的缓存,可使用 route:clear 命令:

    php artisan route:clear

  • 相关阅读:
    单用户模式启动SQL Server实例总结
    MySQL下perror工具查看System Error Code信息
    ERROR 1050 (42S01): Table xxx already exists
    RMAN-06172 Troubleshooting
    [翻译]LVM中逻辑卷的最大大小限制
    如何定位那些SQL产生了大量的redo日志
    MySQL的自动提交模式
    MySQL服务读取参数文件my.cnf的规律研究探索
    SQL Server等待事件—RESOURCE_SEMAPHORE_QUERY_COMPILE
    Azure SQL Virtual Machine报Login failed for user 'NT ServiceSqlIaaSExtension'. Reason: Could not find a login matching the name provided
  • 原文地址:https://www.cnblogs.com/grkin/p/4606759.html
Copyright © 2011-2022 走看看