在'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();
}
}
我也想指出,這是可能的緩存文件中使用的命名空間。