如何在yaml symfony2中定义变量

时间:2014-11-23 13:59:16

标签: symfony doctrine-orm yaml

我对[{1}}并不熟悉,所以我打开参数.yml和config.yml文件,看看如何在YAML中使用参数或变量的示例。

parameters.yml:

YAML

config.yml:

parameters:
   database_driver: pdo_mysql
   database_host: 127.0.0.1
   database_port: 3306
   database_name: homlist

但是当我尝试使用doctrine映射yaml文件时,就像这样:

doctrine:
  dbal:
    driver:   "%database_driver%"
    host:     "%database_host%"
    port:     "%database_port%"
    dbname:   "%database_name%"

这样的错误:

  

执行' SELECT计数时发生异常(DISTINCT%0_.id)AS sclr0 FROM%table_name %% 0 _':

这是我的映射文件parameters: table_name: test Mockizart\Bundle\BlogBundle\Entity\MockblogTag: type: entity table: "%table_name%"

Resources\Config\Entity\MockblogTag

如何在yaml symfony2中定义变量?

1 个答案:

答案 0 :(得分:1)

定义参数的方法是正确的,但是我从评论中看到你的目的是配置用于User对象的类:

正如塞拉德所说,你无法做到这一点。但是,如果要配置用于用户的类,则可以使用管理器服务类。

<?php

namespace YourNamespace\UserBundle\Manager;

use Doctrine\Common\Persistence\ObjectManager;

class UserManager
{

    /**
     * @var ObjectManager 
     */
    protected $em;

    /**
     * Your user class
     * 
     * @var string 
     */
    protected $className;

    public function __construct(ObjectManager $em, $class)
    {
        $this->em = $em;
        $this->className = $class;
    }

    public function createInstance()
    {
        return new $this->className;
    }

    public function getRepository()
    {
        return $this->em->getRepository($this->className);
    }

}

服务定义如下:

services:
    your_user.manager:
        class: YourNamespace\UserBundle\Manager\UserManager
        arguments: ['@doctrine.orm.entity_manager', 'YourNamespace\UserBundle\Entity\User']

在您的控制器中,您可以使用此管理器类:

$userManager = $this->get('your_user.manager');

$user = $userManager->createInstance();

我认为这是处理用户对象时有一个中心点的好方法。如果某天由于某种原因您决定为用户使用不同的类,您只需修改参数&#39; YourNamespace \ UserBundle \ Entity \ User&#39;。

同样通过这种方式,您可以使用&#39; YourNamespace \ UserBundle \ Entity \ User&#39;参数作为参数,因此定义将更改为:

services:
    your_user.manager:
        class: Moneytablet\UserBundle\Manager\UserManager
        arguments: ['@doctrine.orm.entity_manager', '%user_class%']

并在你的parameters.yml中你可以:

parameters:
    user_class: YouNamespace\UserBundle\Entity\User

我非常喜欢这样工作,你可以在manager类上创建save(),remove()方法,等等。稍后在创建新服务时,如果它是一个依赖项,您可以像常规服务一样注入该管理器。

如果您想要一个不同实体的新管理器,您可以使用不同的构造参数创建一个新的服务定义,但具有相同的服务类。