【问题标题】:Add middleware to controller in __construct in Laravel在 Laravel 的 __construct 中添加中间件到控制器
【发布时间】:2020-03-26 23:06:35
【问题描述】:

我正在尝试在基于Laravel docs 的控制器的 __construct 中分配一个中间件,但它会引发以下错误:

BadMethodCallException
Method App\Http\Controllers\MyController::middlware does not exist.

那是我的控制器类:

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class MyController extends Controller
{

    public function __construct()
    {
        $this->middleware('myauth');
    }

    /** something */
    public function index()
    {
        return view('test.hi', ['name' => 'Moh']);
    }
}

这里是中间件代码:

<?php

namespace App\Http\Middleware;

use Closure;

class myauth
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {

        echo time().'<br>';
        return $next($request);
    }
}

Laravel 版本:6.5.2

我哪里做错了?

【问题讨论】:

    标签: php laravel laravel-6 laravel-middleware


    【解决方案1】:

    首先问你,你的错误是middlware name is incoorect 你错过了e 之后检查下面的中间件进程。

    Laravel 中间件 - 中间件充当请求和响应之间的中间人。

    首先转到项目文件夹并打开cmd并使用此命令

    php artisan make:middleware MiddlewareName
    

    然后转到 App\Http\kernel.php 并在 $routeMiddleware 上添加一行

    'user_block' => \App\Http\Middleware\MiddlewareName::class
    

    之后转到您的中间件 在handle函数中(自己写中间件代码)

    在路由中使用你的中间件 -

    Route::group(['middleware' => ['user_block']],
        function () {
    Route::get('/logout', array('uses' => 'Auth\LoginController@logout'));
    });
    

    如果您在任何控制器的 __construct 中的特定控制器中使用此中间件,只需写一行

    namespace App\Http\Controllers;
    use App\User;
    
    class UserController extends Controller {
    
     public function __construct() {
    
        $this->middleware('user_block');
     }
    }
    

    如果您希望这个中间件仅用于控制器中的一个操作,您可以将此中间件添加到路由中:

    Route::get('/login', 'LoginController@login')->middleware('user_block');
    

    如果您在特定 1-2 函数中的特定控制器中使用此中间件,只需在控制器中的 __construct functiono 中写入这一行

    public function __construct()
    {
       $this->middleware('user_block')->only(['login','register']);
    }
    

    【讨论】:

      【解决方案2】:

      可以在控制器的构造函数中指定中间件

      public function __construct() {
          $this->middleware('auth');
      }
      

      对于整个控制器:

      $this->middleware('auth');
      

      仅针对特定操作:

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

      对于除特定动作之外的整个控制器:

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

      【讨论】:

        【解决方案3】:

        函数是middleware,你打错了,漏掉了e

        【讨论】:

        • 谢谢,我不知道为什么我没有意识到这一点
        猜你喜欢
        • 2017-11-28
        • 2017-12-11
        • 1970-01-01
        • 1970-01-01
        • 2019-07-13
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多