2016-02-02 18 views
1

在使用psr 4的Symfony3項目中,我通過在'var/cache/dev'文件夾中自動生成一個php類來存儲配置數據。如何解決在Symfony3中自動生成的類

下面是生成的文件的簡化副本:

<?php 

use Project\Bundle\Metadata\AbstractMetadata; 

class LocalizedMetadata extends AbstractMetadata 
{ 
    protected function populate() 
    { 
    } 
} 

我知道我可以includerequire文件,但研發和生產之間的「開發」目錄的變化,我用的是類數地方。另外,我希望在其他項目中使用這個包,所以我不想在包之外硬編碼任何東西。這些文件通常如何加載? Symfony內核中有什麼可以提供幫助?

回答

0

在'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(); 
    } 
} 

我也想指出,這是可能的緩存文件中使用的命名空間。

相關問題