2014-11-23 252 views
0

我对YAML并不熟悉,所以我打开parameters.yml和config.yml文件以查看如何在YAML中使用参数或变量的示例。如何在yaml中定义变量symfony2

parameters.yml:

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

config.yml:

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

但是,当我与教义映射YAML文件中像这样试了一下:

parameters: 
    table_name: test 

Mockizart\Bundle\BlogBundle\Entity\MockblogTag: 
type: entity 
table: "%table_name%" 

这是这样的错误:在执行时发生

例外 'SELECT COUNT(DISTINCT%0_.id)AS sclr0 FROM%TABLE_NAME%%0_':

这是我的映射文件Resources\Config\Entity\MockblogTag

Mockizart\Bundle\BlogBundle\Entity\MockblogTag: 
type: entity 
table: mockblog_tag 
indexes: 
    user_id: 
     columns: 
      - user_id 
    name: 
     columns: 
      - name 
    slug: 
     columns: 
      - slug 
id: 
    id: 
     type: integer 
     nullable: false 
     unsigned: false 
     comment: '' 
     id: true 
     generator: 
      strategy: IDENTITY 
fields: 
    dateCreated: 
     type: integer 
     nullable: false 
     unsigned: false 
     comment: '' 
     column: date_created 
    name: 
     type: string 
     nullable: false 
     length: 60 
     fixed: false 
     comment: '' 
    slug: 
     type: string 
     nullable: false 
     length: 100 
     fixed: false 
     comment: '' 
    totalPost: 
     type: integer 
     nullable: false 
     unsigned: false 
     comment: '' 
     column: total_post 
manyToOne: 
    user: 
     targetEntity: ORD\UserBundle\Entity\User 
     joinColumn: 
      referencedColumnName: id 
     type: integer 
     nullable: false 
     unsigned: false 
lifecycleCallbacks: 

如何在yaml symfony2中定义变量?

正如CERAD说你不能这样做:

+0

您是否尝试过在parameters.yml文件中定义表名? – 2014-11-23 14:19:16

+0

@ A.L通过如何将'app/config/parameters.yml'导入到MyVendor/Bundle/BlogBu​​ndle/Entity/Tag.orm.yml中的实体中? – Kakashi 2014-11-23 15:26:12

+0

似乎映射文件被Doctrine读取,并且Symfony2配置不能被Doctrine访问。我无法帮助你,对不起。有没有理由让表名称可配置? – 2014-11-23 15:36:28

回答

1

定义参数的方式,它是正确的,但是我从评论说,你的目的是用来配置用户对象的类看。但是,如果您想要配置用于该用户的类,则可以拥有一个经理服务类。

<?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(); 

我认为这是一个好办法在处理用户对象时有一个中心点。如果有一天,无论出于何种原因,您决定为用户使用不同的类,则只需修改参数'YourNamespace \ UserBundle \ Entity \ User'。

这样你可以使用“YourNamespace \ UserBundle \实体\用户”的说法作为参数

而且,这样的定义将改变为:

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 

我真的很喜欢这种方式,你可以在经理类上创建save(),remove()方法等等。在稍后创建新服务时,如果它是依赖项,则可以像经常服务那样注入此管理器。

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

+0

我没有使用注释映射的教条,所以我需要'ORD \ UserBundle \ Entity \ User'来定义关系manyToOne映射文件'Resources \ Entity \ Tag.orm。 yml'。据我所知上面的代码是创建服务,并没有解决我的问题。 – Kakashi 2014-11-23 21:37:09

+0

顺便说一句谢谢@zuzuleinen :) – Kakashi 2014-11-23 21:41:44

+0

@zuzuleinen - 只需将用户存储库定义为服务,并节省大量的人力。 – Cerad 2014-11-23 22:20:24