所以我有以下类别的门面:
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个
我想避免不得不将请求输入手动传递到类中,而只是将其自动注入构造函数中。你们能提供的任何帮助将不胜感激!
答案 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。