如何在Symfony2中使用命名常量?

时间:2016-05-26 10:25:49

标签: php symfony constants

我试图在Symfony2项目中使用named constants,这是我内部第三方代码所要求的。有没有办法使用Symfony2 ymls管理这样的配置参数?

3 个答案:

答案 0 :(得分:1)

我发现了这个,这是官方Symfony 2文档的一部分,看起来很有趣:

How to Set External Parameters in the Service Container

文档的最后一节很有意思,因为它描述了如何使用PHP include语句在应用程序配置中运行任何PHP脚本文件。

文件:

杂项配置

imports指令可用于引入存储在别处的参数。导入PHP文件使您可以灵活地添加容器中所需的任何内容。以下导入名为parameters.php。

的文件
YAML

# app/config/config.yml
imports:
    - { resource: parameters.php }

XML

<!-- app/config/config.xml -->
<imports>
    <import resource="parameters.php" />
</imports>

PHP

// app/config/config.php
// $loader->import('parameters.php');

// our third party config
$loader->import('ThirdPartyDefines.php');

现在,只需创建一个名为:

的脚本即可

ThirdPartyDefines.php

在该文件中有所需的定义:即。

define('THIRD_PARTY_V1', 'ACME_value1');
define('THIRD_PARTY_V2', 'ACME_value12');

答案 1 :(得分:0)

您可以使用parameters

$container->hasParameter('namedConstant');
$container->getParameter('namedConstant');
$container->setParameter('namedConstant', 'a new value');

答案 2 :(得分:0)

您可以创建一个捆绑包,将您的内部代码集成到Symfony中。您可以使用参数或the bundle’s configuration来提供捆绑包随后将定义为常量的值。

想象一下,您生成了一个包GreatInHouseProjectBundle。您还会获得一个扩展程序GreatInHouseProjectBundle\DependencyInjection\GreatInHouseProjectExtension。然后你可以在那里定义你的常量。

使用参数:

class GreatInHouseProjectExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        # ...

        if( ! defined('THIRD_PARTY_V1') ) {
            define(
                'THIRD_PARTY_V1',
                $container->getParameter('third_party.version')
            );
        }
    }
}

使用捆绑配置:

class GreatInHouseProjectExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);

        if( ! defined('THIRD_PARTY_V1') ) {
            define(
                'THIRD_PARTY_V1',
                $config['third_party_version']
            );
        }
    }
}