最近我正在开发一个非常大的项目,代码主要用PHP编写。我正要重构一些代码。在我开始重构之前,我决定首先编写一些单元测试以确保不会破坏任何东西(尽管这可能会发生......)。当我试图建立PHPUnit时,我意识到我要测试的代码充满了在全局命名空间中注册的函数。我决定暂时忽略这一点,并考虑在此过程中模拟这些全局函数的解决方案。
由于这个项目在某些地方使用PSR-4而在其他地方没有名称空间使得很难绕过这些紧密耦合的全局功能。
我思考解决方案的时间越长,我意识到我需要将这些全局函数重写为更加面向对象的方式。我对现有的第三方库进行了一些研究,以取代这些全局函数提供的功能。
这些全球功能之一是某种翻译服务。我的想法是用Symfony的Translation组件替换它。我必须克服的主要问题是使这项服务在全球范围内可访问。我想出了将它作为Singleton实现的想法。这只是作为Symfony的Translation组件的包装器,返回Translator实例。我可以从代码中的任何地方轻松访问它,到目前为止我无法想出更好的主意。
我不相信这是否可行,所以我非常需要其他建议和想法。所以我的问题是:
如何在缺少一致命名空间的非Symfony项目中全局访问Symfony Translation组件,而不会产生太多开销?
答案 0 :(得分:1)
namespace App\Translation;
use Symfony\Component\Translation as Translation;
class Translate extends Translation\Translator implements TranslateInterface
{
private static $singleton;
public static function getInstance($locale = null): Translate
{
if (static::$singleton === null) {
static::$singleton = new static($locale ?: 'de');
}
return static::$singleton;
}
public function __construct($locale, Translation\Formatter\MessageFormatterInterface $formatter = null, $cacheDir = null, $debug = false)
{
$this->addLoader('json', new Translation\Loader\JsonFileLoader());
$this->addResource('json', 'translations\messages.de.json', 'de');
parent::__construct($locale, $formatter, $cacheDir, $debug);
}
然后像这样使用它:
\App\Translation\Translate::getInstance()->trans('msg');;