Laravel 5.2 facade getFacadeAccessor 中的内容 return
Laravel 5.2 What goes in facade getFacadeAccessor return
所以我正在尝试在 Laravel 中创建我的第一个服务提供者和免费外观。
服务提供商:
<?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()
的 return 中应该包含什么。在我的服务提供商中,我说它提供 jbm.reportGenerator
,然后在 Facade 中使用它,但我不知道它如何连接到我注册的内容。任何帮助将不胜感激。
更新:
我决定将我的服务提供商和外观添加到我的 config/app。php,然后尝试在控制器中使用它,它显示 "Report Generator not found"。所以它显然不起作用...不知道为什么
更新二:
删除名称中的点后,我现在得到 Call to undefined method Jbm\Facades\ReportGenerator::parseConfig()
。
getFacadeAccessor 应该 return 您的容器 "knows about" 的字符串。这意味着通过提供商注册的东西。
您将外观和别名添加到 app.php 以便能够访问您静态注册的内容。
因此,当您调用 YourFacadeAlias::doSomething();
时,laravel 会检测 YourFacaseAlias,查看从 getFacadeAccessor return 编辑的内容,并将该结果用于 return 容器中与其关联的对象.
由于您的 facade 和 helper 都被称为 "ReportGenerator",所以问题可能与它们都有关。但我认为你应该首先检查你的 app.php 看看你是否设置正确。然后确保您的 getFacadeAccessor 和绑定值匹配。
首先,您的服务提供商应该在 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();
});
}
}
在那之后,外观应该在 App\Facades
命名空间中,getFacadeAccessor()
方法应该 return 您的服务提供商的 class 名称:
<?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 中创建我的第一个服务提供者和免费外观。
服务提供商:
<?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()
的 return 中应该包含什么。在我的服务提供商中,我说它提供 jbm.reportGenerator
,然后在 Facade 中使用它,但我不知道它如何连接到我注册的内容。任何帮助将不胜感激。
更新:
我决定将我的服务提供商和外观添加到我的 config/app。php,然后尝试在控制器中使用它,它显示 "Report Generator not found"。所以它显然不起作用...不知道为什么
更新二:
删除名称中的点后,我现在得到 Call to undefined method Jbm\Facades\ReportGenerator::parseConfig()
。
getFacadeAccessor 应该 return 您的容器 "knows about" 的字符串。这意味着通过提供商注册的东西。
您将外观和别名添加到 app.php 以便能够访问您静态注册的内容。
因此,当您调用 YourFacadeAlias::doSomething();
时,laravel 会检测 YourFacaseAlias,查看从 getFacadeAccessor return 编辑的内容,并将该结果用于 return 容器中与其关联的对象.
由于您的 facade 和 helper 都被称为 "ReportGenerator",所以问题可能与它们都有关。但我认为你应该首先检查你的 app.php 看看你是否设置正确。然后确保您的 getFacadeAccessor 和绑定值匹配。
首先,您的服务提供商应该在 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();
});
}
}
在那之后,外观应该在 App\Facades
命名空间中,getFacadeAccessor()
方法应该 return 您的服务提供商的 class 名称:
<?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,
]