繁体   English   中英

Laravel构造函数和方法注入

[英]Laravel constructor and method injection

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

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

从下面的路线;

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

我希望构造函数可以接收到五个,而该方法可以使用admin。 下面是我的控制器;

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方法上出现错误:

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

下面的作品,但我不需要在该方法的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: ';
    }
...

有没有一种方法可以设置模型的构造函数注入(有效)并设置方法注入,而不必注入构造函数中的模型集?

您可以执行此操作的一种方法是使用控制器中间件

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');

该错误是因为您无法通过路径传递模型。 它应该像/index/abc/index/123

您可以如下使用索引函数

public function index($admin,Request $request){}

这一定会对您有所帮助。

Route::group(['prefix' => 'test/{five}'], function () {
    Route::get('/index/{admin}', function ($five, $admin) {
        $app = app();
        $ctr = $app->make('\App\Http\Controllers\TestController');
        return $ctr->callAction("index", [$admin]);
    });
});

从路由调用控制器的另一种方法。 您可以控制要从路由传递到控制器的内容

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM