Я использовал sfDoctrineGuard и пользовательскую таблицу MyProfile для управления пользователями в моем проекте Symfony.Желая реализовать функцию сброса пароля в моем проекте, я решил установить sfForkedDoctrineApply.Я отредактировал схему для MyProfile следующим образом:
MyProfile:
...
inheritance:
type: column_aggregation
extends: sfGuardUserProfile
Однако я с ужасом обнаружил, что таблица sfGuardUserProfile, созданная sfForkedDoctrineApply, разделяет столбцы с таблицей sfGuardUser, созданной sfDoctrineGuard (а именно столбцы для имени и фамилии).
Насколько я понимаю, изменение схемы с помощью плагинов является плохим тоном, поскольку будущие обновления плагинов могут перезаписать эти изменения.Следовательно, хорошей практикой является создание таблицы MyProfile и отношения 1: 1 с sfGuardUser.
Могу ли я удалить избыточность этого столбца, не изменяя схему плагинов и, таким образом, предотвращая разрушение моего проекта будущими обновлениями?Черт возьми, я думаю, что было бы лучше иметь в MyProfile столбцы first_name и last_name вместо sfGuardUser!
Если у кого-то есть идея получше, или если я что-то сформулировал неправильно, пожалуйста, дайте мне знать!
Спасибо всем.
Вот три файла схемы yml для справки:
MyProfile:
columns:
...
relations:
User:
class: sfGuardUser
local: user_id
foreign: id
type: one
foreignType: one
foreignAlias: Profile
inheritance:
type: column_aggregation
extends: sfGuardUserProfile
sfGuardUserProfile:
actAs:
Timestampable: ~
columns:
user_id:
type: integer
notnull: true
unique: true
email_new:
type: string(255)
unique: true
firstname:
type: string(255)
lastname:
type: string(255)
validate_at:
type: timestamp
validate:
type: string(33)
relations:
User:
class: sfGuardUser
foreign: id
local: user_id
type: one
onDelete: cascade
foreignType: one
foreignAlias: Profile
indexes:
validate:
fields: [validate]
sfGuardUser:
actAs: [Timestampable]
columns:
first_name: string(255)
last_name: string(255)
email_address:
type: string(255)
notnull: true
unique: true
username:
type: string(128)
notnull: true
unique: true
algorithm:
type: string(128)
default: sha1
notnull: true
salt: string(128)
password: string(128)
is_active:
type: boolean
default: 1
is_super_admin:
type: boolean
default: false
last_login:
type: timestamp
indexes:
is_active_idx:
fields: [is_active]
relations:
...