我正在尝试制作自己的自定义外观,并使用自定义服务容器进行注册,最后为此外观创建自定义别名。
我不确定哪个部分不起作用,也许服务容器注册有问题,或者别名有问题?
让我们从我的外观开始:
/**
*
* @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
在我的 Controller 中,我使用这样的外观:
use CustomView;
...
public function show(ImageRequest $imagerequest)
{
return CustomView::show(...);
}
我在 Controller 中收到以下错误:
Class 'CustomView' not found
我在这里做错了什么?
编辑
清除配置和 Composer 自动加载转储后,出现以下错误:
Call to undefined method App\Library\Facades\ViewWrapper\CustomViewFacade::show()
最佳答案
我认为您还不太清楚 Facades 的工作原理。它们只是访问服务的一种简单方法,而无需处理依赖注入(inject)。我不喜欢这种方法,但以下是正确的做法。
- 您需要将实际服务绑定(bind)到容器,而不是外观。外观几乎只是容器内服务的符号链接(symbolic link)。
- 您需要导入实际的服务,而不是外观。 Laravel 会自动将您的依赖项绑定(bind)到类型提示变量中,这要归功于它的幕后魔力。
用途:
use App\Library\Facades\ViewWrapper\CustomView;
(小注意:这里的命名空间应该是服务的命名空间,注意不要混淆外观和服务之间的语义。服务包含逻辑,外观只是已经注入(inject)的服务的访问器。这很重要!!)
而不是:
use CustomView;
应该可以解决问题。
此外,我建议您通过在 bootstrap
函数中使用闭包来定义如何构造该类并将其注入(inject)到服务容器中。
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 文件中定义 Facade。
另一个小建议:在外观访问器定义中使用 PHP 7 类选择器而不是字符串。例如:CustomView::class
而不是 customview
。它使您的代码更整洁、更易于阅读。
关于php - Laravel 5.6 Facade/Alias 未注册/工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54072488/