Visão Geral
Com o symfony 1.1, você pode escolher descrever a sua estrutura do modelo relacional em uma nova sintaxe YAML. O symfony reconhece os arquivos schema.yml escritos tanto com a sintaxe descrita no Capítulo 8 do livro do symfony, como os escritos com a sintaxe descrita abaixo. A sintaxe alternativa é mais orientada à objeto e torna o processo da fusão de vários esquemas mais fácil de entender.
Exemplo Base
Considere o seguinte schema, usando a sintaxe atual:
propel:
_attributes: { noXsd: false, defaultIdMethod: none, package: lib.model }
ab_group:
_attributes: { phpName: Group, package: foo.bar.lib.model }
id:
name: varchar(50)
cd_user:
_attributes: { phpName: User, isI18N: true, i18nTable: cd_user_i18n }
first_name: { type: varchar, size: 255, default: "Anonymous" }
last_name: varchar(50)
age: { type: integer, required: true, index: true }
ab_group_id:
created_at:
cd_user_i18n:
description: longvarchar
ef_article:
title: { type: longvarchar, required: true, index: unique }
stripped_title: { type: longvarchar, required: true, primaryKey: true, sequence: my_custom_sequence_name }
user_id:
my_group: { type: integer, foreignTable: ab_group, foreignReference: id, onDelete: setnull }
created_at: timestamp
updated_at:
ij_article:
_attributes: { phpName: Article }
title: varchar(50)
user_id: { type: integer }
_foreignKeys:
-
foreignTable: cd_user
onDelete: cascade
references:
- { local: user_id, foreign: id }
created_at:
_indexes:
my_index: [title, user_id]
_uniques:
my_other_index: [created_at]
_behaviors:
paranoid: { column: deleted_at }
ab_group_i18n:
motto: longvarchar
Sintaxe alternativa
Exemplo base, com a sintaxe alternativa
Aqui está como escrever exatamente a mesma estrutura como a listada acima, com a sintaxe alternativa:
connection: propel
noXsd: false
defaultIdMethod: none
package: lib.model
classes:
Group:
tableName: ab_group
package: foo.bar.lib.model
columns:
id:
name: varchar(50)
User:
tableName: cd_user
isI18N: true
i18nTable: cd_user_i18n
columns:
first_name: { type: varchar, size: 255, default: "Anonymous" }
last_name: varchar(50)
age: { type: integer, required: true, index: true }
ab_group_id:
created_at:
CdUserI18n:
columns:
description: longvarchar
EfArticle:
columns:
title: { type: longvarchar, required: true, index: unique }
stripped_title: { type: longvarchar, required: true, primaryKey: true, sequence: my_custom_sequence_name }
user_id:
my_group: { type: integer, foreignClass: Group, foreignReference: id, onDelete: setnull }
created_at: timestamp
updated_at:
Article:
tableName: ij_article
columns:
title: varchar(50)
user_id: { type: integer }
created_at:
foreignKeys:
-
foreignTable: cd_user
onDelete: cascade
references:
- { local: user_id, foreign: id }
indexes:
my_index: [title, user_id]
uniques:
my_other_index: [created_at]
behaviors:
paranoid: { column: deleted_at }
AbGroupI18n:
columns:
motto: longvarchar
A principal diferença é que você declara classes, não tabelas, usando a tabela phpName como a chave.
Esta sintaxe alternativa também é mais explícita, uma vez que você deve criar entradas para classes e colunas. Mas torna-se livre do hack feio _attributes da sintaxe atual, desta forma, o schema.yml não tenta imitar uma sintaxe XML.
Por último mas não menos importante, todas as "mágicas" da sintaxe clássica continuam lá (auto definição das chaves primárias, chaves estrangeiras, tabelas i18n, etc.)
Configurações de conexão
Ao invés de serem definidas como _attributes da conexão, as configurações da conexão, juntamente com o nome da conexão, são todas chaves no nível-1:
connection: propel noXsd: false defaultIdMethod: none package: lib.model
Todas estas chaves são opcionais, incluindo a chave connection. Se ela não for informada, o symfony utilizará como valor default o propel.
Classes
Uma definição de classe lista o nome da tabela no banco de dados, as colunas, chaves estrangeiras, índices e behaviours em uma sintaxe natural chave/valores:
Article:
tableName: ij_article
columns:
title: varchar(50)
user_id: { type: integer }
created_at:
foreignKeys:
-
foreignTable: cd_user
onDelete: cascade
references:
- { local: user_id, foreign: id }
indexes:
my_index: [title, user_id]
uniques:
my_other_index: [created_at]
behaviors:
paranoid: { column: deleted_at }
Note que você pode definir chaves estrangeiras tanto com o atributo usual foreignTable, que espera o nome da tabela, ou através do novo atributo foreignClass, que espera o nome da classe.
Schemas mistos
Você pode ter, em um projeto, schemas mistos com a sintaxe atual e a sintaxe alternativa.
O sistema de extensão de schema, descrito no Capítulo 17 do livro do symfony, funciona seja qual for a sintaxe do schema original e qualquer que seja a sintaxe personalizada do schema. Isto significa que você pode personalizar um schema já existente com a sintaxe clássica usando um esquema personalizado com a sintaxe alternativa, e vice-versa. O symfony irá fazer a conversão internamente tornando a fusão sempre possível.
Note que a fusão de schema é fácil de entender quando considerada a sintaxe alternativa para ambos os schemas original e personalizado. De fato, este é um formato interno utilizado pelo symfony para a fusão. A listagem seguinte mostra a fusão dos schemas:
# Schema original, em plugins/myPlugin/config/schema.yml
classes:
User:
tableName: cd_user
columns:
first_name: { type: varchar, size: 255, default: "Anonymous" }
last_name: varchar(50)
age: { type: integer, required: true, index: true }
created_at:
Article:
tableName: ij_article
columns:
title: varchar(50)
user_id: { type: integer }
created_at:
foreignKeys:
-
foreignTable: cd_user
onDelete: cascade
references:
- { local: user_id, foreign: id }
# Schema personalizado, em myPlugin_schema.custom.yml
connection: myConnection
classes:
Group:
tableName: ab_group
package: foo.bar.lib.model
behaviors: [paranoid]
columns:
id:
name: varchar(50)
User:
tableName: ef_user
isI18N: true
i18nTable: cd_user_i18n
columns:
ab_group_id:
Article:
columns:
updated_at:
# Schema resultante, realizada a fusão interna e utilizado para o modelo e a geração de sql
connection: myConnection
classes:
Group:
tableName: ab_group
package: foo.bar.lib.model
behaviors: [paranoid]
columns:
id:
name: varchar(50)
User:
tableName: cd_user
isI18N: true
i18nTable: cd_user_i18n
columns:
first_name: { type: varchar, size: 255, default: "Anonymous" }
last_name: varchar(50)
age: { type: integer, required: true, index: true }
ab_group_id:
created_at:
Article:
tableName: ij_article
columns:
title: varchar(50)
user_id: { type: integer }
created_at:
updated_at:
foreignKeys:
-
foreignTable: cd_user
onDelete: cascade
references:
- { local: user_id, foreign: id }
Para maior clareza, recomenda-se o uso da sintaxe alternativa para os schemas, tanto quanto possível.
This work is licensed under the Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License license.