2015-10-08 4 views
0

У меня есть вопрос относительно Учения и сущностей на Symfony 2.3.Doctrine2: вызов флеша несколько раз

Согласно «Документация книги» раздел «Базы данных и Doctrine> Сохранение связанных сущностей» (проверить пример здесь: http://symfony.com/doc/current/book/doctrine.html) пример создает simultaneusly новую строку в обоих продуктов и категории таблиц и ассоциированных компаний product.category_id значение с «id» элемента новой категории.

Проблема в том, что Action Controller создает новый продукт и новую категорию в любое время, когда он вызывается!

Для того, чтобы просто создать новый продукт и связать его CATEGORY_ID с существующей категорией идентификатором (я сделал тест передачи параметров через URL, как это:/веб/магазин/создать/NewProduct/Kayak/)

это routing.yml маршрут

acme_store_create_product_by_category: 
path:  /create/newproduct/{name}/{categoryId} 
defaults: { _controller: AcmeStoreBundle:Default:createProduct } 

я сделал что-то вроде этого, который, кажется, работает нормально:

public function createProductAction($name, $categoryId) 
{ 
    $em = $this->getDoctrine()->getManager(); 

    if ($em->getRepository("AcmeStoreBundle:Category")->findOneById($categoryId)) { 

     $product = new Product(); 

     $product->setName($name); 
     $product->setPrice(220); 
     $product->setDescription("This is just a test"); 

     $em->persist($product); 

     $em->flush(); 

     $newproduct = $em->getRepository("AcmeStoreBundle:Product")->find($product->getId()); 
     /** Create new product and populate $newproduct with its data */ 


     $repository = $em->getRepository("AcmeStoreBundle:Category")->find($categoryId); 

     $newproduct->setCategory($repository); 

     $em->persist($newproduct); 

     $em->flush(); 
     /** Update the id_category field of the new product with parameter $categoryId */ 

     //exit(\Doctrine\Common\Util\Debug::dump($product)); 

     return new Response('Create product ' . $name . ' with category id ' . $categoryId); 

    } else { 

     return new Response('It doesn\'t exists any category with id ' . $categoryId); 
    } 
} 

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

Спасибо заранее!

ответ

2

Я думаю, что в основном это зависит от вашего домена приложения. Если вы запустите flush два раза, это означает, что вы выполняете две транзакции. В первом вы сохраняете продукт, во втором - категорию. Итак, если первая транзакция завершится неудачно (допустим, у вас есть уникальный ключ в названии продукта, и вы пытаетесь сохранить продукт с тем же именем, чтобы получить дублирующее ключевое исключение), тогда спросите себя, нормально ли продолжать и упорствовать категория. Я не думаю, что мы можем легко ответить на этот вопрос, потому что я думаю, что это зависит от вашей логики приложения, что должна делать эта конечная точка, что произойдет, если вы закончите с продуктом, а не с категорией или наоборот.

Вы также должны учитывать, что если вы получаете исключение во время первой транзакции, ваш код не будет обрабатывать эту ошибку, и вторая транзакция будет терпеть неудачу. Когда возникает исключение, такое как повторяющийся ключ, все сущности отключаются, и диспетчер сущности больше не знает, как управлять вещами. Поэтому вам придется сбросить его или вы получите сообщение EntityManager is closed.

try { 
    // first transaction 
    $entityManager->persist($entityOne); 
    $entityManager->flush(); 
} catch (\Exception $e) { 
    /* ... handle the exception */ 
    $entityManager->resetManager(); 
} 

// now we can safely run a second transaction here 

Я надеюсь, что это ответ на ваш вопрос :-)

+0

Спасибо большое Francesco :-)! В настоящее время я прилагаю большие усилия, чтобы переключиться на Entities-подобный подход и ORM. Это довольно далеко от методов библиотек PDO или mysqli. Да, пример, который я опубликовал, был просто моим любопытством, строго связанным с примером в книге документации по Symfony, а не с реальным применением, конечно :-) В любом случае, это очень полезно для вашего совета! Я собираюсь реализовать его в своем тестовом коде, чтобы иметь в виду будущие случаи. –

+1

Рад, что это помогло @FabrizioSabato :-) Вы ищете какую-либо другую информацию? Я спрашиваю, потому что я не уверен, что это полностью отвечает на ваш вопрос. Вероятно, это лучше всего изменить название вопроса, чтобы это было полезно для пользователей, поступающих из поисковых систем.Что-то вроде «Doctrine2: многократный вызов флеша»? –

+0

Ну, теперь я читаю некоторую документацию о связанных с ними веб-формах и beahviours. Я почти уверен, что это принесет дополнительную информацию, и я буду очень рад поделиться этим обсуждением. Хорошо, по твоему совету я изменю название. –

Смежные вопросы