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 的工作原理。它们只是一种无需处理依赖注入即可访问服务的简单方法。我不喜欢这种方法,但这是正确的方法。

  1. 您需要将实际服务绑定到容器,而不是外观。外观几乎只是容器内服务的象征性 link。
  2. 您需要导入实际服务,而不是外观。 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。它使您的代码更整洁、更易于阅读。