如何在 Laravel 和 Lumen 的控制器构造函数中的中间件之后调用方法、函数或初始化类?

Posted

技术标签:

【中文标题】如何在 Laravel 和 Lumen 的控制器构造函数中的中间件之后调用方法、函数或初始化类?【英文标题】:How to call a method, function or initialize class after an middleware in a controller constructor in Laravel and Lumen? 【发布时间】:2022-01-14 06:04:16 【问题描述】:

如何在 Laravel 和 Lumen 的控制器构造函数中调用中间件后的方法、函数或初始化类?

我尝试在middleware('lang') 之后初始化类Translator,但在执行middleware('lang') 之前初始化类Translator

控制器/IndexController.php

<?php

namespace App\Http\Controllers;

use Laravel\Lumen\Routing\Controller;
use App\Helpers\Translator;

class IndexController extends Controller


    private $transhome;

  
    public function __construct()
    
        $this->middleware('lang');
        $this->transhome = new Translator('home'); 
    


    public function home()
    
        return view('home', [
            'transhome' => $this->transhome,
        ]);
    


中间件/LangMiddleware.php

use Closure;

class LangMiddleware

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    
        config(['app.lang' => 'fr']);

        return $next($request);
    

另一个例子

执行后我们会看到:132

$this-&gt;middleware('lang');最后一个会被调用

控制器/IndexController.php

<?php

namespace App\Http\Controllers;

use Laravel\Lumen\Routing\Controller;

class IndexController extends Controller


    public function __construct()
    
        echo '1';
        $this->middleware('lang');
        echo '3';
    


    public function home()
    
        return view('home');
    


中间件/LangMiddleware.php

use Closure;

class LangMiddleware

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    
        echo '2';

        return $next($request);
    

【问题讨论】:

您没有使用middleware 方法运行中间件,您只是在控制器上设置了一个数组索引......控制器被实例化并且路由器询问它定义的中间件但是它还没有运行它们......你会想要注册一个“控制器中间件”(匿名函数),以便它在堆栈中作为中间件运行在另一个之后......至少在 Laravel 中 @lagbox 你的意思是? -Controllers also allow you to register middleware using a closure.?无效:$this-&gt;middleware(function ($request, $next) return $next($request); ); 我收到错误 - 非法偏移类型 在 Laravel 中你绝对可以,我没有 Lumen 项目设置来试用它 @lagbox 谢谢。 另一种方法是创建一个中间件,将此变量分配给您的控制器,在 Laravel 中,您可以从当前路由、请求中获取控制器,然后您可以将变量分配给中间件中的控制器......我没有要测试的 Lumen 项目,因为它做一些不同的事情(例如使用不同的路由器) 【参考方案1】:

实际上,这应该可以工作,因为您将 $transhome 作为上面的private。试试这个public

它应该可以工作,因为在构造函数中你告诉它把它设置为翻译器。

如果transhome返回null,你有没有看过dd()

【讨论】:

谢谢,但$this-&gt;middleware('lang')Translator 之后调用。如果我将 Translator 替换为 var_dump("222"); ,则第一个执行是 var_dump ("222"); 我又加了一个例子。

以上是关于如何在 Laravel 和 Lumen 的控制器构造函数中的中间件之后调用方法、函数或初始化类?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 Lumen/Laravel 中的单例?

Laravel/Lumen - Artisan 控制台中缺少命令

如何在 LUMEN 中使用 GATE 立面(Laravel 6.2)

LUMEN:如何修复 SQLSTATE [42000]:语法错误或访问冲突:laravel 流明上的 1071

Laravel源码解析--看看Lumen到底比Laravel轻在哪里

如何在 Docker 上运行 Laravel (Lumen) 调度程序