• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Laravel5.1框架注册中间件的三种场景详解

    本文实例讲述了Laravel5.1框架注册中间件的三种场景。分享给大家供大家参考,具体如下:

    在Laravel中注册中间件主要有三种场景,一种给控制器中的方法进行注册,一种是给整个控制器进行注册,最后一种是给全局注册中间件。

    这种需求是最为常见,这个例子是给IndexController中的index方法添加中间件。

    Route::get('/', ['middleware'=>['App\Http\Middleware\EmailMiddleware'],'uses'=>'IndexController@index']);
    
    

    这种需求有的时候也会出现,如果给整个控制器中注册中间件,那么这个控制器中的所有方法都注册了该中间件。跟我一起来找到答案!

    控制器基类(Controller.php)

    首先来看一下控制器基类,可以看到Controller类继承了BaseController类,而BaseController的路径是Illuminate\Routing\Controller,然后我们来看看Laravel的源码。

    ?php
    namespace App\Http\Controllers;
    use Illuminate\Foundation\Bus\DispatchesJobs;
    use Illuminate\Routing\Controller as BaseController;
    use Illuminate\Foundation\Validation\ValidatesRequests;
    use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
    abstract class Controller extends BaseController
    {
      use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
    }
    
    

    BaseController类

    从源码中我们可以看到有一个属性为middleware,这个middleware属性就是我们要找的,所以只要在需要注册的控制器下使用这个属性即可完成注册。

    protected $middleware = [];
    
    
    ?php
    namespace Illuminate\Routing;
    use BadMethodCallException;
    use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
    abstract class Controller
    {
      /**
       * The middleware registered on the controller.
       *
       * @var array
       */
      protected $middleware = [];
      /**
       * Register middleware on the controller.
       *
       * @param array|string|\Closure $middleware
       * @param array  $options
       * @return \Illuminate\Routing\ControllerMiddlewareOptions
       */
      public function middleware($middleware, array $options = [])
      {
        foreach ((array) $middleware as $m) {
          $this->middleware[] = [
            'middleware' => $m,
            'options' => $options,
          ];
        }
        return new ControllerMiddlewareOptions($options);
      }
      /**
       * Get the middleware assigned to the controller.
       *
       * @return array
       */
      public function getMiddleware()
      {
        return $this->middleware;
      }
      /**
       * Execute an action on the controller.
       *
       * @param string $method
       * @param array  $parameters
       * @return \Symfony\Component\HttpFoundation\Response
       */
      public function callAction($method, $parameters)
      {
        return call_user_func_array([$this, $method], $parameters);
      }
      /**
       * Handle calls to missing methods on the controller.
       *
       * @param array  $parameters
       * @return mixed
       *
       * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
       */
      public function missingMethod($parameters = [])
      {
        throw new NotFoundHttpException('Controller method not found.');
      }
      /**
       * Handle calls to missing methods on the controller.
       *
       * @param string $method
       * @param array  $parameters
       * @return mixed
       *
       * @throws \BadMethodCallException
       */
      public function __call($method, $parameters)
      {
        throw new BadMethodCallException("Method [{$method}] does not exist.");
      }
    
    

    给整个控制器注册中间件

    我们选用系统的Authenticate中间件来举例,这个中间件是用于检测用户是否登录。

    注意:中间件的名称为键,值可以是一个空数组

    protected $middleware = ['\App\Http\Middleware\Authenticate'=>[]];
    
    

    打开app/Http/Kernel.php,这是一个内核文件,可以看到一个属性$middleware,我们只需要将我们自定义的中间件的路径添加到这个$middleware 这个属性中即可。

    此外还有一个$routeMiddleware属性,使用这个属性可以根据路由来注册中间件。
    我们的路由有:goods/infogoods/detail两个路由器
    我们可以将$routeMiddleware属性添加一行

    'goods.*' => \App\Http\Middleware\GoodsMiddleware::class,
    
    
    ?php
    namespace App\Http;
    use Illuminate\Foundation\Http\Kernel as HttpKernel;
    class Kernel extends HttpKernel
    {
      /**
       * The application's global HTTP middleware stack.
       *
       * @var array
       */
      protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
      ];
      /**
       * The application's route middleware.
       *
       * @var array
       */
      protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
      ];
    }
    
    

    更多关于Laravel相关内容感兴趣的读者可查看本站专题:《Laravel框架入门与进阶教程》、《php优秀开发框架总结》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

    希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

    您可能感兴趣的文章:
    • laravel利用中间件做防非法登录和权限控制示例
    • laravel在中间件内生成参数并且传递到控制器中的2种姿势
    • 浅谈Laravel中的三种中间件的作用
    • Laravel获取当前请求的控制器和方法以及中间件的例子
    • Laravel框架控制器的middleware中间件用法分析
    • laravel利用中间件防止未登录用户直接访问后台的方法
    • Laravel 6 将新增为指定队列任务设置中间件的功能
    • laravel框架中间件 except 和 only 的用法示例
    • 浅谈laravel中间件的创建思路
    上一篇:PHP使用 Pear 进行安装和卸载包的方法详解
    下一篇:Laravel框架实现多个视图共享相同数据的方法详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    Laravel5.1框架注册中间件的三种场景详解 Laravel5.1,框架,注册,中间件,