在“dev”目录中创建的任何类都不能自动加载,至少在不配置包之外的文件(例如 composer.yml)的情况下不能自动加载。
我研究了 Symfony 如何管理它的路由器文件,解决方案实际上非常简单。
我创建了一个可以从代码中的任何位置调用的管理器类。该类包含一个方法,该方法返回缓存文件夹中的类实例。
public function getLocalizedRoutes ()
{
if ( null !== $this->localizedRoutes ) {
return $this->localizedRoutes;
}
$cache = $this->getConfigCacheFactory()->cache(
$this->options['cache_dir'].'/'.CachingMetadata::CACHE_FILE,
function (ConfigCacheInterface $cache) {
$content = CachingMetadata::getInstance()->dump();
$cache->write($content);
}
);
require_once $cache->getPath();
return $this->localizedRoutes = LocalizedMetadata::getInstance();
}
它使用 Symfony 内置的 ConfigCache 类,仅仅是因为它处理文件写入和文件权限。此外,如果文件不存在,它将调用闭包。在这种情况下,闭包调用处理数据加载并将其转换为 PHP 代码的类。然后使用require_once 加载缓存文件,并返回LocalizedMetadata 的实例,这是缓存的类名。
上面的方法可以修改为也将资源文件传递给ConfigCache,这样如果你的一个文件被修改,缓存将被重写。在我的情况下,它不是必需的。
使用缓存预热器只需调用上述方法即可:
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();
}
}
我还要注意,可以在缓存文件中使用命名空间。