首页 > 解决方案 > Laravel 构造函数和方法注入

问题描述

我在控制器中的构造函数和方法上设置注入时遇到问题。

我需要实现的是能够设置全局控制器变量,而无需在控制器方法上注入相同的变量。

从下面的路线;

Route::group(['prefix' => 'test/{five}'], function(){
    Route::get('/index/{admin}', 'TestController@index');
});

我希望构造函数接收五个,而管理员对该方法可用。下面是我的控制器;

class TestController extends Controller
{
    private $five;

    public function __construct(PrimaryFive $five, Request $request)
    {
        $this->five = $five;
    }

    public function index(Admin $admin, Request $request)
    {
        dd($request->segments(), $admin);
        return 'We are here: ';
    }
...

当我运行我正在考虑使用的上述内容时,我在 index 方法上遇到错误:

Symfony\Component\Debug\Exception\FatalThrowableError 抛出消息“传递给 App\Http\Controllers\TestController::index() 的参数 1 必须是 App\Models\Admin 的实例,给定字符串”

下面的作品,但我不需要该方法的 PrimaryFive 注入。

class TestController extends Controller
{
    private $five;

    public function __construct(PrimaryFive $five, Request $request)
    {
        $this->five = $five;
    }

    public function index(PrimaryFive $five, Admin $admin, Request $request)
    {
        dd($request->segments(), $five, $admin);
        return 'We are here: ';
    }
...

有没有办法可以使用模型(有效)设置构造函数注入并设置方法注入,而无需在构造函数中注入模型集?

标签: phplaravellaravel-5

解决方案


一种方法是使用控制器中间件

public function __construct()
{
    $this->middleware(function (Request $request, $next) {

        $this->five = PrimaryFive::findOrFail($request->route('five'));

        $request->route()->forgetParameter('five');

        return $next($request);
    });
}

以上假设PrimaryFive是一个 Eloquent 模型。

这将意味着$this->five为控制器设置,但是,因为我们正在使用forgetParameter()它将不再传递给您的控制器方法。


如果您特定使用Route::model() 或 Route::bind()来解析您的five段,那么您可以直接从$request->route('five')即检索实例:

$this->five = $request->route('five');

推荐阅读