![]() |
|
The symfony and Doctrine bookCapítulo 3 - Configuración |
|
You are currently reading "The symfony and Doctrine book" which is licensed under the GFDL license.

Doctrine controla las características y configuraciones con atributos. Los atributos puede ser definidos a diferentes niveles de una jerarquía. Algunos atributos pueden ser especificados para todos los niveles y otros no. Debajo se explica como puedes especificar atributos para cada nivel. Los atributos pueden ser especificados globalmente, sobre cada conexión, o sobre cada modelo individual.
En symfony puedes controlar la configuración de Doctrine en tu config/ProjectConfiguration.class.php o en tu apps/appname/config/appnameConfiguration.class.php
Puedes controlar atributos globales creando un configureDoctrine() en tu configuración. Todos los atributos globales son configurados sobre una instancia singleton Doctrine_Manager. Este método es invocado cuando el sfDoctrinePlugin config.php es cargado. Esto es antes de cualquier conexion exista por eso solo el atributo Doctrine_Manager puede ser controlado en este punto.
public function configureDoctrine(Doctrine_Manager $manager) { $manager->setAttribute('use_dql_callbacks', true); $manager->setAttribute('use_native_enum', true); }
Puedes controlar atributos por conecxión creando un configureDoctrineConnection() en tu clase de configuración. Este método es invocado en sfDoctrineDatabase con cada conexión sea instanciada por Symfony en el orden que ellas estén en config/databases.yml.
public function configureDoctrineConnection(Doctrine_Connection $connection) { $connection->setAttribute('use_dql_callbacks', true); $connection->setAttribute('use_native_enum', true); }
Puedes también opcionalmente especificar los atributos de la conexión directamente en la definición de la conexión en config/doctrine/databases.yml de esta manera:
doctrine:
class: sfDoctrineDatabase
param:
dsn: 'mysql:host=localhost;dbname=dbname'
username: user
password: secret
attributes:
use_dql_callbacks: true
use_native_enum: true
Puedes querer tener una diferente configuración por cada conexión por lo que puedes crear una función específica que también sea invocada en cada conexión individual. Si tienes una conexión denominada master entonces necesitaras crear una función de nombre configureDoctrineConnectionMaster() en tu archivo config/ProjectConfiguration.class.php.
public function configureDoctrineConnectionMaster(Doctrine_Connection $connection) { $connection->setAttribute('use_dql_callbacks', false); $connection->setAttribute('use_native_enum', false); }
En el anterior ejemplo tenemos habilitado use_dql_callbacks y use_native_enum para cada conexión excepto la conexión denominada master habilitandola para todas las conexiones y deshabilitando los atributos especificamente para esa conexión.
El último nivel de la jerarquía para Doctrine son los modelos. Los atributos pueden ser especificados directamente en la definición YAML del modelo.
Store:
connection: client
attributes:
export: tables
columns:
name: string(255)
description: string(500)
Puedes también establecer atributos usando código php en la clase generadad del modelo en lib/model/doctrine. Revisa lib/model/doctrine/Store.class.php y sobre-escribe setTableDefinition() para especificar algunos atributos adicionales.
public function setTableDefinition() { parent::setTableDefinition(); $this->setAttribute('export', 'tables'); }
sfDoctrinePlugin ofrece la capacidad de sobre-escribir algunos opciones de la contrucción del modelo. Estas configuraciones pueden ser controladas usando la clase sfConfig empleando el parámetro denominado doctrine_model_builder_options.
Aquí un ejemplo de como puedes cambiar la clase base usada cuando generas los modelos. Puedes establecerla usando la clase denominada myDoctrineRecord o la que quieras. Solo asegúrate de que la clase exista en algún lugar en tu proyecto para que la autocarga de Symfony la encuentre.
public function configureDoctrine(Doctrine_Manager $manager) { $options = array('baseClassName' => 'myDoctrineRecord'); sfConfig::set('doctrine_model_builder_options', $options); }
Asegúrate de crear la clase. Por ejemplo, sfproject/lib/myDoctrineRecord.class.php con el siguiente código php.
class myDoctrineRecord extends sfDoctrineRecord { }
Ahora cuando generes tus modelos, todas las clases extenderan de myDoctrineRecord en lugar de sfDoctrineRecord por eso puedes agregar funcionalidades propias para todos tus modelos.
Aquí esta una lista de todas las otras opciones que pueden ser modificadas para diferentes valores del proceso de construcción del modelo.
| Name | Description | Por Defecto |
|---|---|---|
| suffix | Sufijo a usar para las clases generadas | .class.php |
| generateBaseClasses | Si o no para generar las clases bases | true |
| generateTableClasses | Si o no para generar las clases *Table | true |
| baseClassPrefix | Word to prefix base classes with | Base |
| baseClassesDirectory | Directorio para generar las clases bases | base |
| baseClassName | Super parent para extender los modelos | sfDoctrineRecord |
Con sfDoctrinePlugin es fácil cambiar la versión de Doctrine usada simplemente cambiando uno de los valores de configuración.
Debajo encontrarás un ejemplo de como puedes configurar sfDoctrinePlugin para usar una versión distinta de Doctrine, por ejemplo 1.0.10.
Primero necesitas verificar la versión de Doctrine que quieres usar en lib/vendor/doctrine:
$ mkdir lib/vendor
$ cd lib/vendor
$ svn co http://svn.doctrine-project.org/tags/1.0.10/lib doctrine
Ahora puedes configurar el sfDoctrinePlugin para usar esa versión de Doctrine en lugar de una que venga incluída en el plugin. En tu método ProjectConfiguration::setup() nececitarás cambiar el valor de sfDoctrinePlugin_doctrine_lib_path con sfConfig, como sigue:
public function setup() { sfConfig::set('sfDoctrinePlugin_doctrine_lib_path', sfConfig::get('sf_lib_dir') . '/vendor/doctrine/Doctrine.php'); }
No todas las versiones de Doctrine son compatibles con el
sfDoctrinePluginde Symfony. Por ejemplo usando una versión mayor de Doctrine que la incluída consfDoctrinePluginno se garantiza que funcione muy bien.TIP Puedes leer más acerca de conexiones en el Manual Doctrine aquí.
If you find a typo or an error, please register and open a ticket.
If you need support or have a technical question, please post to the official user mailing-list.