2014-11-23 253 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