如何在Laravel的Facade类中注入请求?

时间:2019-04-30 00:34:22

标签: php laravel

所以我有以下类别的门面:

namespace App\Helpers;

use App\Http\Requests\HomepageRequest;

class Params {

    public function __construct(HomepageRequest $request) {

    }

然后我有ParamsServiceProvider类,该类可在脚本启动时实例化Facade类:

public function register()
{
    //
    App::bind('params', function() {
        return new Params();
    });
}

编辑:这是Params类的实际外观

use Illuminate\Support\Facades\Facade;

class Params extends Facade {
    protected static function getFacadeAccessor() {
        return 'params';
    }
}

这一切工作正常,该类已正确实例化,但是,它似乎没有像在控制器类中那样将请求对象注入构造函数中。有没有办法像在控制器中那样将请求注入到Facade类中?使用当前代码,我得到以下错误:

  

函数App \ Helpers \ Params :: __ construct()的参数太少,0   在/var/www/v4api/html/app/Providers/ParamsServiceProvider.php中传递   在第21行,正好是1个

我想避免不得不将请求输入手动传递到类中,而只是将其自动注入构造函数中。你们能提供的任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:0)

看起来像这样:

在ParamsServiceProvider中,不要使用App :: bind实例化Params类,而是这样做:

public function register()
{
    App::alias(Params::class, 'params');
}

然后将请求对象正确注入到外观中。

答案 1 :(得分:0)

您发布的课程不是实际上是一个Facade,它只是常规课程。

因为您已经暗示了它的依赖性,所以您无需告诉Laravel如何创建它的实例-它可以自己解决所有问题。

您可以将该类注入到控制器方法中(Laravel将在其中为您添加新方法),也可以调用app(App\Helpers\Params::class)并返回该类的新实例为你。

如果要创建实际的外观,请阅读有关创建外观类的更多信息。另外,您可以创建一个实时门面-您可以在其中引用Facades\App\Helpers\Params::foo(),Laravel可以像使用该类的实例一样使用该方法。

答案 2 :(得分:0)

您在这里有很多选择-将外观直接指向基础类,然后让Laravel找出如何构建外观,将其显式绑定到容器或使用实时外观。让我们逐一检查。

class Params extends Facade 
{
    protected static function getFacadeAccessor() 
    {
        return \App\Helpers\Params::class;
    }
}

此选项将外墙直接指向您要用作外墙的类,Laravel将解决其余问题。

或者,您可以将其保留为params,而是将绑定固定在容器中。

第一个示例使用Laravel的容器创建该类的实例并返回它。 Laravel可以自动反映该类并注入其依赖项。

App::bind('params', function ($app) {
    return $app->make(Params::class);
});

第二个示例以所需的方式显式构建实例,这只是您要维护的其他代码。

App::bind('params', function() {
    return new Params(new HomepageRequest);
});

最后一个选项-如前面的答案中所述-是使用实时外观,并完全跳过手动绑定。 You can learn more about realtime facades in the docs