Kakashi
Kakashi

Reputation: 3549

how to define variable in yaml symfony2

I'm not really familiar with YAML so I open parameters.yml and config.yml files to see example how to use parameters or variable in YAML.

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%"

But when I tried it with doctrine mapping yaml file like this:

parameters:
   table_name: test

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

it's error like this:

An exception occurred while executing 'SELECT count(DISTINCT %0_.id) AS sclr0 FROM %table_name% %0_':

this is my mapping file 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:

How to define variable in yaml symfony2 ?

Upvotes: 0

Views: 2364

Answers (1)

zuzuleinen
zuzuleinen

Reputation: 2634

The way of defining parameters it's correct, however I see from comments that your purpose is to configure the class used for User object:

As Cerad said you can't do that. But if you want to configure the class you use for the User, you can have a manager service class.

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

}

And the services definitions will be like this:

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

In your controller you can use this manager class like this:

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

$user = $userManager->createInstance();

I think this is a good way to have a central point when dealing with user object. And if someday for whatever reason you decide to use a different class for user you just modify the argument 'YourNamespace\UserBundle\Entity\User'.

Also in this way you can use 'YourNamespace\UserBundle\Entity\User' argument as parameter, so the definition will change to:

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

and in you parameters.yml you can have:

parameters:
    user_class: YouNamespace\UserBundle\Entity\User

I really like working this way, you can create save(), remove() methods on manager class and so on. Also later on when creating new services you can inject this manager like a regular service if it's a dependency.

And if you want a new manager for a different entity, you can create a new service definition with different construct arguments, but with the same service class.

Upvotes: 1

Related Questions