Laravel 5.6 Facade / Alias无法注册/工作

时间:2019-01-07 10:23:39

标签: php laravel laravel-5.6

我试图制作自己的自定义外观,并使用自定义服务容器注册,最后为该外观创建自定义别名。

我不确定哪个部分不起作用,也许服务容器注册有问题,或者别名有问题?

让我们从我的门面开始吧

/**
 *
 * @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()

2 个答案:

答案 0 :(得分:1)

请运行以下命令并检查:

php artisan config:cache

php artisan cache:clear

答案 1 :(得分:1)

我认为您还不太清楚Facades是如何工作的。它们只是访问服务而无需处理依赖注入的简便方法。我不喜欢这种方法,但是这是您正确执行方法的方法。

  1. 您需要将实际服务绑定到容器,而不是外观。外观几乎只是容器中您服务的符号链接。
  2. 您需要导入实际服务,而不是外观。 Laravel会自动将您的依赖项绑定到带类型提示的变量中,这要归功于它的幕后魔力。

使用:

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}}中间。它使您的代码更整洁,更易于阅读。