php - Laravel 5.6 Facade/Alias 未注册/工作

标签 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

在我的 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)。我不喜欢这种方法,但以下是正确的做法。

  1. 您需要将实际服务绑定(bind)到容器,而不是外观。外观几乎只是容器内服务的符号链接(symbolic link)。
  2. 您需要导入实际的服务,而不是外观。 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/

相关文章:

node.js - 模块构建失败: Error: read ECONNRESET

mysql - 查询多个位置和同一行

php - 为什么在 Laravel 中对 Request 对象和 request() 助手使用依赖注入(inject)?

php - S3 Bucket 给出 InvalidArgument(客户端): Unsupported value for canned acl 'private' - for put file operation with laravel

php - Laravel belongsTo 在使用 'with' 时返回 null

php - Laravel - 注册不在数据库中保存表单响应

php - laravel 5.6 多个表上 Eloquent 一对多关系

javascript - 如何使用模态框单独加载文本?

php - REQUEST 查询包含多个字段

php - mysql php 无法获取外键值