【问题标题】:How to resolve auto generated classes in Symfony3如何在 Symfony3 中解析自动生成的类
【发布时间】:2016-05-11 15:51:42
【问题描述】:

在一个使用 psr 4 的 Symfony3 项目中,我通过在 'var/cache/dev' 文件夹中自动生成一个 php 类来存储配置数据。

这是生成文件的简化副本:

<?php

use Project\Bundle\Metadata\AbstractMetadata;

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

我知道我可以includerequire 文件,但是'dev' 目录在开发和生产之间发生变化,我在几个地方使用了这个类。另外,我希望在其他项目中使用这个包,所以我不想在包之外对任何东西进行硬编码。这些文件通常是如何加载的? Symfony 核心中有什么可以帮助的吗?

【问题讨论】:

    标签: php symfony psr-4


    【解决方案1】:

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

    我还要注意,可以在缓存文件中使用命名空间。

    【讨论】:

      猜你喜欢
      • 2018-01-09
      • 2020-07-01
      • 2020-11-16
      • 1970-01-01
      • 2012-07-14
      • 1970-01-01
      • 2018-10-29
      • 2021-11-08
      • 1970-01-01
      相关资源
      最近更新 更多