flush()
в процессе обработки preUpdate
приводит к бесконечной рекурсии, ибо обработчик события вызывается в процессе выполнения предыдущего вызова flush()
.persist()
, remove()
и т.п. в процессе обработки событий доктрины может привести к неожиданным результатам. Данные просто могут быть не сохранены, как минимум. Крайне не рекомендую менять какие-либо данные в Entity, EM/UoW при обработке событий доктрины.OrderStatusChanged
. Но лучше использовать более конкретные события вроде OrderCompleted
и OrderCanceled
. flush()
.$this->em->flush();
$this->events->dispatch(new OrderCompleted($order->id));
// или
$this->em->flush();
$this->notificationCreator->createChangeStatusNotification($order->getCustomer());
public function preUpdate(PreUpdateEventArgs $args)
{
$entity = $args->getObject();
if (!$entity instanceof Order) {
return;
}
$this->logger->info($entity);
$onlyStatusChanged = count($args->getEntityChangeSet()) === 1 && $args->hasChangedField('status');
if ($onlyStatusChanged) {
$this->notificationsCreator->createChangeStatusNotification($entity->getCustomer());
}
// много кода...
}
App\handler\action\Handler:
arguments: !service_locator
type1: '@App\handler\create\Handler'
type2: '@App\handler\upload\Handler'
CandidateType
сюда и сравнить полученный код.Request
=> Response
, а для этого контроллеры и существуют.В версиях Symfony до 4.0 было рекомендовано организовать собственный код приложения с помощью пакетов. Это больше не рекомендуется, и пакеты должны использоваться только для совместного использования кода и функций между несколькими приложениями.
Пакет похож на плагин в другом программном обеспечении, но еще лучше. Основные функции Symfony framework реализуются с помощью пакетов (FrameworkBundle, SecurityBundle, DebugBundle и т. Д.) Они также используются для добавления новых функций в ваше приложение с помощью сторонних пакетов.
email
из entity User
):public function getEmails()
{
return array_column($this->getEntityManager()
->createQuery('select u.email from User u')
->getResult(\Doctrine\ORM\Query::HYDRATE_SCALAR), 'u_email');
}
public function getEmails()
{
return array_column($this->getEntityManager()
->createQuery('select u.id, u.email from User u')
->getResult(\Doctrine\ORM\Query::HYDRATE_SCALAR), 'u_email', 'u_id');
}
// Tunnel the Browsersync server through a random Public URL
// -> http://randomstring23232.localtunnel.me
tunnel: true
// Attempt to use the URL "http://my-private-site.localtunnel.me"
tunnel: "my-private-site"
browserSync.init({
server: { baseDir: 'app/' },
notify: false,
online: true,
tunnel: "test", // или true если нужен рандомный туннель
browser: "chrome",
});
// src/AppBundle/Form/CustomerType.php
public function buildForm(FormBuilderInterface $builder, array $options)
{
//....
$builder
->add('phones',CollectionType::class, array(
'by_reference' => false,
// ...
));
//....
}
class Customers implements UserInterface
{
/**
* @ORM\OneToMany(targetEntity="AppBundle\Entity\Phone", mappedBy="customer_id", cascade={"persist", "remove", "merge"})
*/
private $phones; // Это же коллекция, нужно множественное число, чтобы работали adder и remover
public function addPhone(Phone $phone)
{
$phone->setCustomer($this);
$this->phones->add($phone);
}
public function removePhone(Phone $phone)
{
$phone->setCustomer(null);
$this->phones->removeElement($phone);
}
}
// src/AppBundle/Form/PhoneType.php
// $builder->add('customerId', HiddenType::class); // не нужен
flush()
нужно вынести, потому что вы можете заперсистить 100 объектов и сделать один flush — одна череда обращений к Бд. В вашем же случае будет 100 и более обращений к БДis_a()
и вот это все) и если придет не тот объект — кидать InvalidArgumentException