Laravel构造函数和方法注入

麦当古

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

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

从下面的路线;

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是一个雄辩的模型。

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


如果您专门使用Route :: model()或Route :: bind()来解析您的five细分,则可以直接从$request->route('five')即以下例检索实例

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章