我试图制作自己的自定义外观,并使用自定义服务容器注册,最后为该外观创建自定义别名。
我不确定哪个部分不起作用,也许服务容器注册有问题,或者别名有问题?
让我们从我的门面开始吧
/**
*
* @see \App\Library\Facades\ViewWrapper\CustomView
*/
class CustomViewFacade extends Facade
{
protected static function getFacadeAccessor()
{
return 'customview';
}
}
我的CustomView类具有逻辑和show
函数
namespace App\Library\Facades\ViewWrapper;
...
class CustomView
{
public function show(...) { ... }
...
}
我的CustomViewServiceProvider
namespace App\Providers;
...
class CustomViewServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
$this->app->singleton(CustomViewFacade::class);
$this->app->alias(CustomViewFacade::class, 'customview');
}
}
我如何在config\app.php
App\Providers\CustomViewServiceProvider::class,
我如何在config\app.php
'CustomView' => App\Library\Facades\ViewWrapper\CustomViewFacade::class
在我的控制器中,我使用这样的外观:
use CustomView;
...
public function show(ImageRequest $imagerequest)
{
return CustomView::show(...);
}
我在控制器中收到以下错误:
找不到“ CustomView”类
我在这里做什么错了?
清除配置和作曲家自动加载转储后,出现以下错误:
调用未定义的方法App \ Library \ Facades \ ViewWrapper \ CustomViewFacade :: show()
答案 0 :(得分:1)
请运行以下命令并检查:
php artisan config:cache
php artisan cache:clear
答案 1 :(得分:1)
我认为您还不太清楚Facades是如何工作的。它们只是访问服务而无需处理依赖注入的简便方法。我不喜欢这种方法,但是这是您正确执行方法的方法。
使用:
use App\Library\Facades\ViewWrapper\CustomView;
(小注:这里的名称空间应该是服务的名称空间,请注意不要混淆Facade和Service之间的语义。该服务包含逻辑,Facade只是对已注入的服务的访问器。很重要!)
代替:
use CustomView;
应该可以解决问题。
此外,我建议您通过使用bootstrap
函数中的闭包来定义应如何构造类并将其注入服务容器中。
class CustomViewServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
$this->app->singleton(CustomView::class, function () {
return new CustomView(...);
);
}
}
另外,在您的情况下,别名功能不是必需的。它只是允许您使用服务容器中的customview
键来访问服务。
只需在config / app.php文件中定义外观。
另一个小建议:在外观访问器定义中使用PHP 7类选择器代替字符串。例如:CustomView::class
的{{1}}中间。它使您的代码更整洁,更易于阅读。