Laravel 5.2外观getFacadeAccessor返回的内容

Posted

技术标签:

【中文标题】Laravel 5.2外观getFacadeAccessor返回的内容【英文标题】:Laravel 5.2 What goes in facade getFacadeAccessor return 【发布时间】:2016-06-18 23:14:04 【问题描述】:

所以我正在尝试在 Laravel 中创建我的第一个服务提供者和免费的 Facade。

服务提供者:

<?php namespace Jbm\Providers;

use Illuminate\Contracts\Http\Kernel;
use Illuminate\Http\Request;
use Illuminate\Support\ServiceProvider as BaseServiceProvider;

use Jbm\Helpers\ReportGenerator;

class ReportGeneratorServiceProvider extends BaseServiceProvider

    /**
     * Indicates if loading of the provider is deferred.
     *
     * @var bool
     */
    protected $defer = true;

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    
        $this->app->bind('Jbm\Helpers\Contracts\ReportGeneratorContract', function($app)
            return new ReportGenerator();
        );
    

    /**
     * Add the Cors middleware to the router.
     *
     * @param Kernel $kernel
     */
    public function boot(Request $request, Kernel $kernel)
    
        //
    

    /**
     * Get the services provided by the provider.
     *
     * @return array
     */
    public function provides()
    
        return array('jbm.reportGenerator');
    


外观:

<?php

namespace Jbm\Facades;

use Illuminate\Support\Facades\Facade;

class ReportGenerator extends Facade 

    protected static function getFacadeAccessor() 
     
        return 'jbm.reportGenerator'; 
    

似乎我看到的每个包都以不同的方式处理事情。我感到困惑的一件事是在 Facade 中返回 getFacadeAccessor() 应该做什么。在我的服务提供商中,我说它提供jbm.reportGenerator,然后在 Facade 中使用它,但我不知道它如何与我注册的内容相关联。任何帮助将不胜感激。

更新:

我决定将我的服务提供者和我的外观添加到我的 config/app.php 中,然后尝试在控制器中使用它并显示“未找到报告生成器”。所以它显然不起作用......不知道为什么

更新 2:

删除名称中的点后,我现在得到Call to undefined method Jbm\Facades\ReportGenerator::parseConfig()

【问题讨论】:

您可以尝试将 jbm.reportGenerator 重命名为仅 reportGenerator 吗?我不确定你是否可以使用这样的点 【参考方案1】:

getFacadeAccessor 应该返回一个你的容器“知道”的字符串。这意味着通过提供者注册的东西。

您将外观和别名添加到 app.php 以便能够访问您静态注册的内容。

所以当你调用YourFacadeAlias::doSomething();时,laravel 会检测到 YourFacaseAlias,查看从 getFacadeAccessor 返回的内容,并使用该结果从容器中返回与之关联的对象。

由于您的外观和助手都被称为“ReportGenerator”,因此问题可能与它们都有关。但我认为您应该首先检查您的 app.php 以查看您是否设置正确。然后确保您的 getFacadeAccessor 和绑定的值匹配。

【讨论】:

除了那是我认为我正在做的事情。我有一个提供“reportGenerator”的服务提供商(根据@DenisMysenko 的请求删除了点),并且 getFacadeAccessor 返回相同的字符串。似乎仍然没有点击.....【参考方案2】:

首先,您的服务提供者应该在App\Providers 命名空间中,并且应该扩展ServiceProvider。所以它看起来像这样:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Jbm\Helpers\ReportGenerator;

class ReportGeneratorServiceProvider extends ServiceProvider

    public function register()
    
        $this->app->bind('Jbm\Helpers\Contracts\ReportGeneratorContract', function($app)
            return new ReportGenerator();
        );
        

之后,facade 应该在 App\Facades 命名空间中,getFacadeAccessor() 方法应该返回你的服务提供者的类名:

<?php

namespace App\Facades;

use Illuminate\Support\Facades\Facade;

class ReportGenerator extends Facade 

    protected static function getFacadeAccessor() 
     
        return App\Providers\ReportGeneratorServiceProvider::class;
    

现在,让我们将服务提供者和外观添加到应用程序中:

// config/app.php

'providers' => [
    App\Providers\ReportGeneratorServiceProvider::class,
]

'aliases' => [
    'ReportGenerator' => App\Facades\ReportGenerator::class,
]

【讨论】:

以上是关于Laravel 5.2外观getFacadeAccessor返回的内容的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.2 更改用户密码功能

试图获取非对象的属性 [laravel 5.2]

Laravel 5.2 无法打开 laravel.log

在laravel 5.2中,Laravel手动登录始终不匹配

未找到 Laravel 5.2 自定义包路径

改变资源动词laravel 5.2