Php Laravel 5.6外观/别名未注册/工作
我正在尝试创建自己的自定义Facade,并使用自定义服务容器注册is,最后为该Facade创建自定义别名 我不确定哪个部分不工作,可能是服务容器注册或别名有问题 让我们从我的外观开始:Php Laravel 5.6外观/别名未注册/工作,php,laravel,laravel-5.6,Php,Laravel,Laravel 5.6,我正在尝试创建自己的自定义Facade,并使用自定义服务容器注册is,最后为该Facade创建自定义别名 我不确定哪个部分不工作,可能是服务容器注册或别名有问题 让我们从我的外观开始: /** * * @see \App\Library\Facades\ViewWrapper\CustomView */ class CustomViewFacade extends Facade { protected static function getFacadeAccessor() {
/**
*
* @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,
'CustomView' => App\Library\Facades\ViewWrapper\CustomViewFacade::class
如何在config\app.php
App\Providers\CustomViewServiceProvider::class,
'CustomView' => App\Library\Facades\ViewWrapper\CustomViewFacade::class
在我的控制器中,我使用如下外观:
use CustomView;
...
public function show(ImageRequest $imagerequest)
{
return CustomView::show(...);
}
我在控制器中发现以下错误:
找不到类“CustomView”
我做错了什么
编辑
清除config和composer自动加载转储后,出现以下错误:
调用未定义的方法App\Library\Facades\ViewWrapper\CustomViewFacade::show()
请运行下面的命令并检查:
php artisan config:cache
php artisan cache:clear
请运行下面的命令并检查:
php artisan config:cache
php artisan cache:clear
我想你还不太清楚外墙是怎么工作的。它们只是访问您的服务的一种简单方法,无需处理依赖注入。我不喜欢这种方法,但下面是如何正确使用它的
使用App\Library\Facades\ViewWrapper\CustomView;
(小提示:此处的名称空间应该是服务的名称空间,注意不要混淆facade和服务之间的语义。服务包含逻辑,facade只是已注入服务的访问器。这很重要!!)
而不是:
使用CustomView;
它应该解决这个问题
另外,我建议您通过在引导
函数中使用闭包来定义类应该如何构造并注入到服务容器中
类CustomViewServiceProvider扩展了ServiceProvider
{
/**
*注册任何应用程序服务。
*
*@返回无效
*/
公共职能登记册()
{
$this->app->singleton(CustomView::类,函数(){
返回新的CustomView(…);
);
}
}
此外,别名功能在您的情况下是不必要的。它只允许您使用服务容器中的customview
键访问服务
只需在config/app.php文件中定义外观
另一个小建议:在facade访问器定义中使用PHP7类选择器,而不是字符串。例如:
CustomView::class
intead ofCustomView
。它使代码更整洁、更易于阅读。我想你还没有完全理解facade是如何工作的。它们只是访问服务的一种简单方式不必处理依赖注入的ICE。我不喜欢这种方法,但这里有一些正确的方法
使用App\Library\Facades\ViewWrapper\CustomView;
(小提示:此处的名称空间应该是服务的名称空间,注意不要混淆facade和服务之间的语义。服务包含逻辑,facade只是已注入服务的访问器。这很重要!!)
而不是:
使用CustomView;
它应该解决这个问题
另外,我建议您通过在引导
函数中使用闭包来定义类应该如何构造并注入到服务容器中
类CustomViewServiceProvider扩展了ServiceProvider
{
/**
*注册任何应用程序服务。
*
*@返回无效
*/
公共职能登记册()
{
$this->app->singleton(CustomView::类,函数(){
返回新的CustomView(…);
);
}
}
此外,别名功能在您的情况下是不必要的。它只允许您使用服务容器中的customview
键访问服务
只需在config/app.php文件中定义外观
另一个小建议是:在facade访问器定义中使用PHP7类选择器,而不是字符串。例如:
CustomView::class
intead ofCustomView
。这样可以使代码更整洁、更易于阅读。请尝试PHP artisan缓存:清除和编写器转储自动加载-请尝试PHP artisan缓存:清除和编写r dumpautoload-oI现在得到这个错误调用未定义的方法App\Library\Facades\ViewWrapper\CustomViewFacade::show()
我现在得到这个错误调用未定义的方法App\Library\Facades\ViewWrapper\CustomViewFacade::show()
你的确切意思是“只在boostrap文件中定义外观”?我的不好。请查看config/app.php
。那么我是否应该使用CustomViewFacade?我有点困惑是的,在别名数组中添加一行,就像默认情况一样。例如:'CustomView'=>命名空间\ To\CustomView\Facade\CustomViewFacade::class
…我删除了Facade,现在它可以工作了,为什么我应该添加facade?你到底是什么意思“只在boostrap文件中定义外观”?我的错。请查看config/app.php
。那么我是否应该使用CustomViewFacade?我有点困惑是的,在别名数组中添加一行,就像它已经完成一样