【发布时间】: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->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->middleware(function ($request, $next) { return $next($request); });我收到错误 - 非法偏移类型 -
在 Laravel 中你绝对可以,我没有 Lumen 项目设置来试用它
-
@lagbox 谢谢。
-
另一种方法是创建一个中间件,将此变量分配给您的控制器,在 Laravel 中,您可以从当前路由、请求中获取控制器,然后您可以将变量分配给中间件中的控制器......我没有要测试的 Lumen 项目,因为它做一些不同的事情(例如使用不同的路由器)