Как стать автором
Обновить

Комментарии 30

Перезайлете картинки, пожалуйста. За топик спасибо, после Zend с интересом смотрю на Symfony.
залил на habrastorage.org
благодарю!
В yii как-то попроще это, через gii
Что проще то? А о, например, генерации связей в формах (насчет моделей не знаю) вообще мечтать не приходиться.
Модели связываются автоматом, причём генерятся даже связи много-ко-многим, покрайней мере я даже не помню что-бы я писал руками many_to_many связь (а они у меня есть).
На уровне форм — да, этого нету. Но генератор кода там такой, что он предназначен для того, что бы вы расширяли его своими шаблонами для кодогенерации. Сообщество уже целые пачки наборов шаблонов для него понаписало: пользуйся — нехочу.
Да, но если название модели не совпадает с названием таблицы, связи генерируются не правильно, а метод tableName вообще не учитывается.
Баг-репорт сделайте :)
В Yii (посредством модуля Gii) автоматически генерятся модели, имеющие связи.
На примере топика: у нас новость имеет ссылки (через отношение «много ссылок — к одной новости»). При подгрузке данной новости есть возможность сделать т.н. «eager loading», с целью минимизировать количество запросов к БД (в отличие от ручной загрузки связанных с новостью ссылок). Автоматизация — налицо.
Далее. В форме, описанной для новости, очень легко и тривиально получить список связанных с новостью ссылок посредством конструкции
$model->links // Тут возвращается массив объектов Links для данной новости (если есть)

Дальше — дело техники: проходимся по массиву, строим поля формы, в контроллере описываем логику на обновление/удаление набора данных, относящихся к текущему объекту — вуаля.
Обновление данных (ссылок, в нашем случае) через AJAX — без проблем.

Ни в коем случае не умаляю достоинств S2 и Doctrine. Это такой же инструмент, как и другие вменяемые CRUD-генераторы. :)
Эх как зацепило про Yii. Я тоже в общем то не говорил, что Yii хуже, просто опровергаю неверное, по-моему мнению, высказывание.
С Yii я работал, один проект даже дополз до гитхаба :)
Создаем схему БД:

А как жe YML и миграции?
Ну видно человеку просто так больше нравится.
Начиналось все очень бодренько и интересно.

А потом как-то странно получилось, что при сохранении объекта приходится руками сохранять все связанные объекты, которые в принципе как-то «понятно» существую в форме.
// Нужно указать родительский объект
foreach ($entity->getNewsLinks() as $link)
{
$link->setNews($entity);
}
$em->persist($entity);


Я тоже думал будут сохраняться автоматом. После изучения форумов и гитхаба (на сайте документации по этой части пока нет) оказалось что нужно явно указывать родительский объект. Надеюсь в 2.1 или раньше будет улучшено.
можно автоматом. например у меня привязка проекта к категориям работает с стандартным трансформером и выглядит вот так github.com/stfalcon/PortfolioBundle/blob/master/Form/ProjectForm.php#L21

если что-то нестандартное, то можно написать свой трансформер
blog.stfalcon.com/2011/06/symfony2-blogbundle/ см. «Добавление/редактировании тегов для записи»
Когда-то, на заре института, попалась мне в руки книга по винапи.

Глава начиналась:

Давайте создадим нашу первую программу. (вроде было окошко с кнопочкой)

После этого шли три страницы мешанины букв.

Завершалось вся это фразой в духе: посмотрите, как «легко и просто» (с) с помощью винапи можно создавать замечательные программы.

«Посмотрите, как с помощью %foo% можно легко и удобно %something%» и wallofcode — это шаблон, напрочь отбивающий всякое потенциальное желание в этом дальше разбираться.

Обычно очень интересны аспекты, позволяющие что-то сделать именно _легко_ и _удобно_, как-то облегчить жизнь. Вот чего почитать бы о той же симфонии.

PS: Это я не критикую (на самом деле материал довольно полезный в качестве вводного), и не холиварю (хотя для CRUD-а телодвижений, конечно, многовато), просто накипело.
большая часть кода генерится автоматом, но движений конечно многовато
кто то предлагал такую штуку)
echo $site->gen('tz.doc')->render();
Как-то слишком объемно, но материал полезный!
Создание описаний сущностей посредством ручного написания yml или xml достаточно утомительное занятие… Для ускорения процесса в Symfony 2 есть удобное средство генерации описания модели данных путем реверс-инжиниринга существующей БД.

Вы, по-моему, неверно понимаете суть используемых в sf2 абстракций. Модель — это модель (не знаю как ещё по другому сказать) предметной области. Она может быть с БД вообще не связана, а храниться только в памяти. То есть БД это способ хранения модели, а не модель — способ представления БД в sf2 приложении. А если в ТЗ будет что хранилищем должна выступать MongoDB — вы будете создавать фейковый документ, чтобы по нему модель сгенерировалась? (Аравда не уверн есть ли в этом бандле для доктрины генерация вообще)

Генерировать модель по схеме специально для этого созданной, это, имхо, как проектировать автомобиль начиная с колёс. Я пользовался реверс-инженирингом, но именно когда передо мной стояла задача написать новый фронт-енд к существующей БД. То есть моей задачей было заставить именно эти колеса катиться. И то, буквально первая моя строчка была расширением класса модели новым свойством без его связи с БД.

Кому-то это покажется придиркой, или спором остроконечников с тупоконечниками, но поверьте разница есть не только в том, что по чему генерируется.
В данном примере рассматривается, как мне кажется, достаточно удобный способ автоматизации генерации заготовки модели по схеме БД, которую уже можно дальше расширять. При этом схему БД можно создать различными визуальными утилитами, для генерации описания модели для ORM-систем знаю только платный ORM Designer.
а где же тесты?
примеры Unit тестов для контроллеров/моделей
github.com/stfalcon/PortfolioBundle/tree/master/Tests
github.com/stfalcon/BlogBundle/tree/master/Tests

и небольшой (пока) пример BDD :)
github.com/stfalcon/fwdays/tree/master/src/Application/DefaultBundle/Features
ещё для CRUD можно использовать SonataAdminBundle github.com/sonata-project/SonataAdminBundle
тогда, например, весь CRUD для страниц будет выглядеть вот так github.com/stfalcon/fwdays/blob/master/src/Stfalcon/Bundle/PageBundle/Admin/PageAdmin.php
а в стандартном контроллере у меня пока только вывод страниц github.com/stfalcon/fwdays/blob/master/src/Stfalcon/Bundle/PageBundle/Controller/PageController.php
Метод showAction можно еще упростить

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
...
/**
* Finds and displays a Page entity.
*
* @Route("/{slug}", name="page_show")
* @ParamConverter("page", class="StfalconPageBundle:Page")
* @Template()
*/
public function showAction(Page $page)
{
return array(
'page' => $page,
);
}
спасибо, @ParamConverter вижу впервые. видимо не так давно появился :)
Когда я вижу, как результат кодогенератора допиливается руками (а иначе в 90% никак), мне всегда страшно становится от того, во что превратится код, если в модель надо будет внести изменения и перезапустить кодогенератор
НЛО прилетело и опубликовало эту надпись здесь
Коллеги, только-только начал изучать Symfony и возникла маленькая проблемка при обновлении существующего entity:

public function saveAction($id, Request $request) {
$em = $this->getDoctrine()->getEntityManager();
$guest = $em->getRepository(«THEEventsBundle:Guest»)->find($id);

if (!$guest) {
throw $this->createNotFoundException('No guest found for id '.$id);
}

$form = $this->createFormBuilder($guest)
->add(«fio», «text», array(«label» => «ФИО»))
->add(«event», null, array(«label» => «Событие»))
->getForm();

if ($request->getMethod() == «POST») {
$form->bindRequest($request);

if ($form->isValid()) {
$em->flush();

return $this->redirect($this->generateUrl(«guests_list»));
}
}

return array(«form» => $form->createView());
}

По этому коду, вместо обновления записи, создается новая запись в БД
Подскажите, в чем может быть причина такого поведения?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации