@xbox

Как правильно добавить поля и таблицы БД в рабочий проект на Symfony 1.2, чтобы ничего не поломать?

Добрый день.

Небольшое вступление.
Есть рабочий сайт на Symfony 1.2, который создавала одна хорошая Веб-студия. (Это к тому, что качество кода нормальное и проект изначально заточен для совместной работы нескольких программистов). Услугами веб-студии последние пару лет больше не пользуемся, потому что даже на небольшие изменения уходит много времени и финансов. Обычно быстрее и легче сделать все самому.

Я немного владею навыками программирования на php и вношу изменения своими силами, но с Symfony знаком очень поверхностно. За время, которое я занимаюсь правками сайта, я разобрался со структурой папок в проекте. Модули, темплейты, лайауты, акшены, роутинг в сифони, - это то, что я осилил. С классами работать не умею. Изменить что-то существующее в проекте для меня обычно не проблема, а вот создать что-то новое я во многих случаях сам не могу.


Часто возникает необходимость добавить поле в существующую таблицу Базы Данных или даже создать новую таблицу. Сделать изменения в Mysql базе данных (через phpmyadmin итп) это не проблема.
А как добавить поле в таблицу БД или создать новую таблицу в БД, чтобы во всех местах, где это необходимо, симфони все прописала, и чтобы не поломался рабочий проект, а данные в БД сайта сохранились?

Если я к существующему полю таблицы обращаюсь, например, $item->getTitle(), то после добавления нового поля в БД, я смогу к нему обращаться так $item->getNewfield() ? При правильном добавлении поля Симфони попишет все, что для этого нужно?

P.S. Symfony исопользует Propel.
И еще один момент, на всякий случай. Я вручную создавал/менял индексы таблиц в рабочей базе данных Mysql. Индексы работают правильно. Но в каких-либо конфигах симфони ничего не прописывал. При изменении структуры БД командами симфони, не хотелось бы чтобы эти индексы слетели.
  • Вопрос задан
  • 4366 просмотров
Решения вопроса 1
silentvick
@silentvick
Обязательно перед изменениями сделайте бэкап

Начать стоит со схемы в файле config/schema.yml , которая хранит описание структуры БД. Для новой таблицы надо будет описать ее схему в этом файле. Новое поле добавить проще: надо просто дописать его объявление к уже существующей схеме таблицы. Делайте по примеру уже написанных схем. Если задуманная структура не очень сложная, то это не должно составить труда. Также советую заглянуть в пример из документации.

Далее можно обновить саму БД. Сделать это можно вручную (например, через phpmyadmin). Также можно выполнить команду:
$ php symfony propel:build-sql
Это создаст sql-файл в data/sql директории, содержащий запросы для создания описанной структуры БД. Оттуда можно взять запрос для новой таблицы. Это исключит возможность несоответствия таблицы, созданной "вручную" от описанной в schema.yml.

Возможно, программисты из веб-студии использовали какой-нибудь плагин для реализации механизма миграций. Например: sfPropelMigrationsLightPlugin . Тогда, если хотите сохранить хорошее качество кода, стоит почитать документацию плагина и обновлять базу с помощью миграций, а не вручную.

Дальше следует обновить модели, формы и фильтры:
$ php symfony propel:build-model
$ php symfony propel:build-forms
$ php symfony propel:build-filters
Это создаст классы моделей, форм и фильтров для новых таблиц, а также обновит свойства и методы для уже существующих классов при добавлении новых полей (можно будет вызывать $item->getNewfield()).

После этого не забудьте очистить кэш:
$ php symfony cache:clear

Этого должно быть достаточно для несложных изменений.

P.S.: Индексы не потеряются, но их все-таки стоило бы прописать в схеме :)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Quber
@Quber
PHP Team lead
Не знаю как это устроено в первой части. Работаю со второй. На dev версии это делается очень просто, одной командой:
php app/console doctrine:schema:update --force
Она создаст все необходимые поля, индексы, изменит где необходимо и что необходимо.

Для боевой версии это решение разработчики не рекомендуют:
Warning! This should be done only in dev environment! We recommend using Doctrine migrations, to safely update your schema.


Рекомендуется использовать миграции. Это бандл для доктрины DoctrineMigrationsBundle. Тут подробно написано про него и как им пользоваться symfony.com/doc/current/bundles/DoctrineMigrations...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы