在使用psr 4的Symfony3项目中,我通过在'var / cache / dev'文件夹中自动生成php类来存储配置数据。
以下是生成文件的简化副本:
<?php
use Project\Bundle\Metadata\AbstractMetadata;
class LocalizedMetadata extends AbstractMetadata
{
protected function populate ()
{
}
}
我知道我可以include
或require
文件,但'dev'目录在开发和生产之间发生变化,我在几个地方使用该类。此外,我希望在其他项目中使用此捆绑包,因此我不想硬编码捆绑包之外的任何内容。这些文件通常如何加载? Symfony核心内有什么可以帮助吗?
答案 0 :(得分:0)
在&#39; dev&#39;中创建的任何课程目录无法自动加载,至少没有配置捆绑包外的文件(例如composer.yml)。
我看了一下Symfony如何管理它的路由器文件,解决方案实际上非常简单。
我创建了一个可以从代码中的任何位置调用的管理器类。该类包含一个方法,该方法返回缓存文件夹中的类的实例。
ConfigCache
它使用内置于require_once
类的Symfony,因为它处理文件写入和文件权限。此外,如果文件不存在,它将调用闭包。在这种情况下,闭包调用处理数据加载并将其转换为PHP代码的类。然后使用LocalizedMetadata
加载缓存文件,并返回一个class RouteCacheWarmer implements CacheWarmerInterface
{
private $_manager;
public function __construct ( LocaleManager $manager )
{
$this->_manager = $manager;
}
public function isOptional ()
{
return true;
}
public function warmUp ( $cacheDir )
{
$this->_manager->getLocalizedRoutes();
}
}
实例,它是缓存的类名。
可以修改上述方法以将资源文件传递给ConfigCache,这样如果修改了其中一个文件,缓存就会被重写。在我的情况下,它不是必需的。
使用缓存加热器进行此操作只需要调用上述方法:
{{1}}
我还想注意,可以在缓存文件中使用名称空间。