Laravel 5.6 Facade/Alias 不是 registering/working
Laravel 5.6 Facade/Alias not registering/working
我正在尝试制作自己的自定义 Facade 并使用自定义服务容器进行注册,最后为该 Facade 创建自定义别名。
我不确定哪个部分不工作,也许服务容器注册有问题或者别名有问题?
让我们从我的外观开始:
/**
*
* @see \App\Library\Facades\ViewWrapper\CustomView
*/
class CustomViewFacade extends Facade
{
protected static function getFacadeAccessor()
{
return 'customview';
}
}
我的 CustomView class 具有逻辑和 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(...);
}
我在控制器中收到以下错误:
Class 'CustomView' not found
我做错了什么?
编辑
清除配置和作曲家自动加载转储后,我收到以下错误:
Call to undefined method App\Library\Facades\ViewWrapper\CustomViewFacade::show()
请运行下面的命令并检查:
php artisan config:cache
php artisan cache:clear
我认为您还没有十分清楚地了解 Facades 的工作原理。它们只是一种无需处理依赖注入即可访问服务的简单方法。我不喜欢这种方法,但这是正确的方法。
- 您需要将实际服务绑定到容器,而不是外观。外观几乎只是容器内服务的象征性 link。
- 您需要导入实际服务,而不是外观。 Laravel 将自动将您的依赖项绑定到类型提示变量中,这要归功于其幕后魔法。
使用:
use App\Library\Facades\ViewWrapper\CustomView;
(注意:这里你的命名空间应该是你服务的命名空间,注意不要混淆外观和服务之间的语义。服务包含逻辑,外观只是对已经注入的服务的访问器. 这很重要!!)
而不是:
use CustomView;
应该可以解决问题。
此外,我建议您通过在 bootstrap
函数中使用闭包来定义 class 应该如何构建并注入到服务容器中。
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 class 选择器而不是字符串。例如:CustomView::class
而不是 customview
。它使您的代码更整洁、更易于阅读。
我正在尝试制作自己的自定义 Facade 并使用自定义服务容器进行注册,最后为该 Facade 创建自定义别名。
我不确定哪个部分不工作,也许服务容器注册有问题或者别名有问题?
让我们从我的外观开始:
/**
*
* @see \App\Library\Facades\ViewWrapper\CustomView
*/
class CustomViewFacade extends Facade
{
protected static function getFacadeAccessor()
{
return 'customview';
}
}
我的 CustomView class 具有逻辑和 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(...);
}
我在控制器中收到以下错误:
Class 'CustomView' not found
我做错了什么?
编辑
清除配置和作曲家自动加载转储后,我收到以下错误:
Call to undefined method App\Library\Facades\ViewWrapper\CustomViewFacade::show()
请运行下面的命令并检查:
php artisan config:cache
php artisan cache:clear
我认为您还没有十分清楚地了解 Facades 的工作原理。它们只是一种无需处理依赖注入即可访问服务的简单方法。我不喜欢这种方法,但这是正确的方法。
- 您需要将实际服务绑定到容器,而不是外观。外观几乎只是容器内服务的象征性 link。
- 您需要导入实际服务,而不是外观。 Laravel 将自动将您的依赖项绑定到类型提示变量中,这要归功于其幕后魔法。
使用:
use App\Library\Facades\ViewWrapper\CustomView;
(注意:这里你的命名空间应该是你服务的命名空间,注意不要混淆外观和服务之间的语义。服务包含逻辑,外观只是对已经注入的服务的访问器. 这很重要!!)
而不是:
use CustomView;
应该可以解决问题。
此外,我建议您通过在 bootstrap
函数中使用闭包来定义 class 应该如何构建并注入到服务容器中。
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 class 选择器而不是字符串。例如:CustomView::class
而不是 customview
。它使您的代码更整洁、更易于阅读。