Как я могу упростить сохранение в Symfony2? - PullRequest
6 голосов
/ 30 мая 2011

Я сейчас играю с Symfony2, и мне это очень нравится. Однако возник один вопрос, и мне интересно, какой будет лучшая практика.

Если я хочу сохранить сущность, мне нужно поступить так:

<?php
$myEntity = new Entity();
$myEntity->setSomeData('just an example');
$em = $this->get('doctrine')->getEntityManager();
$em->persist($myEntity);
$em->flush();

Это похоже на ужасный код, который нужно делать снова и снова. Я бы предпочел что-то подобное:

<?php
$myEntity = new Entity();
$myEntity->setSomeData('just an example');
$myEntity->persist();

Однако, исходя из того, как я должен получить менеджера по сущностям, это, похоже, далеко от лучших практик. Так что мне делать? Есть намеки на то, как вы справляетесь с этим?

Ответы [ 2 ]

11 голосов
/ 30 мая 2011

Это стандартный способ сделать это, чтобы правильно разделить проблемы.Сущности не должны знать о слое постоянства.

Что вы можете легко сделать, так это добавить ярлык метода persistAndFlush в ваш класс контроллера, если у вас действительно так много кода, который создает и сохраняет новые сущности.

6 голосов
/ 01 июня 2011

Также не забывайте, что метод flush фактически обновляет ваши изменения в базе данных. Это означает, что если вам нужно сохранить более одного объекта, лучше сделать один сброс в конце каждой сохраняемой операции.

Скажем, у вас есть три сущности: $entity1, $entity2 и $entity3. Тогда этот код не является оптимальным:

$em->persist($entity1);
$em->flush();

$em->persist($entity2);
$em->flush();

$em->persist($entity3);
$em->flush();

Этот код будет работать лучше, потому что он синхронизирует вашу базу данных только один раз:

$em->persist($entity1);
$em->persist($entity2);
$em->persist($entity3);

$em->flush();

Таким образом, наличие ярлыка в вашем контроллере, такого как persistAndFlush, должно использоваться с осторожностью, потому что оно неэффективно, когда вам нужно сохранить более одного объекта. Об этом говорится здесь в документации Doctrine2 (на 3/4 страницы). Вот текст взятый из официальной документации 2.0:

Не вызывайте flush после каждого изменения объекта или каждого отдельного вызова persist / remove / merge / ... Это анти-шаблон и излишне снижает производительность вашего приложения. Вместо этого формируйте единицы работы, которые работают с вашими объектами, и вызывайте flush, когда вы закончите. При обслуживании одного HTTP-запроса обычно не нужно вызывать сброс более 0-2 раз.

С уважением, Matt

...