你可以从
Laravel框架本身中获取灵感。
我将以Laravel框架中的
url
助手为例,参考您的格式化器示例。
首先创建自己的
helpers.php
文件:
<?php
if (! function_exists('format_that')) {
function format_that($text)
{
return app('formatter')->format_that($text);
}
}
将add it添加到你的composer.json
文件中:
"autoload": {
"files": [
"app/helpers/helpers.php"
]
}
运行以下命令以重新创建自动加载PHP文件:
$ composer dumpautoload
创建您的
服务提供商app/Providers/FormatterServiceProvider.php
:
<?php
namespace Illuminate\Routing;
use Illuminate\Support\ServiceProvider;
use App\Helpers\FormatGenerator;
class FormatterServiceProvider extends ServiceProvider
{
public function register()
{
$this->app['formatter'] = $this->app->share(function ($app) {
return new FormatGenerator($app['request']);
});
}
}
注册你的服务提供者。Laravel框架会调用register
方法,但你只需要将它添加到应用程序配置文件config/app.php
中:
'providers' => [
/*
* Application Service Providers...
*/
App\Providers\AppServiceProvider::class,
App\Providers\FormatterServiceProvider::class,
]
最后,创建您的
实际生成器类 app/Helpers/FormatGenerator.php
。
<?php
namespace App\Helpers;
use Illuminate\Http\Request;
class FormatGenerator
{
protected $request;
public function __construct(Request $request)
{
$this->request = $request;
}
public function format_that($text){
if ($request->path() == "home"){
return mb_strtoupper($text);
}
else{
return $text;
}
}
}
你可以选择创建
门面app/Facade/Formatter.php
,以便能够执行
Formatter::format_that($text)
:
<?php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class Formatter extends Facade
{
protected static function getFacadeAccessor() { return 'formatter'; }
}
你可以问自己:
- 为什么需要外观模式? 通过简单调用
Formatter::format_that($text)
而不是 app('formatter')->format_that($text)
,你可以在其他地方重复使用组件。这真的很方便。
- 为什么需要服务提供者? 依赖注入。如果你需要使用
Request
或想要构建一个复杂的对象,服务提供者会为你处理并在 $app
对象中使其可用。