У меня есть блог с постами.Есть поле blog.creator = user.id.Соответственно есть две сущности.Я хочу, чтобы при создании записи в таблице блога идентификатор авторизованного пользователя указывался в поле blog.creator.
как это сделать ПРАВИЛЬНО?
Вопрос 1: если ясоздайте форму самостоятельно и обработайте ее, затем я хочу сделать это при проверке формы:
class BlogController extends AbstractController
{
private $security;
public function __construct(Security $security)
{
$this->security = $security;
}
public function createAction(Request $request)
{
$blog = new Blog();
$form = $this->createForm(BlogType::class, $blog);
$form->handleRequest($request);
if ($form->isValid()) {
$blog->setCreatorId($this->security->getUser()->getId());
$em = $this->getDoctrine()
->getManager();
$em->persist($blog);
$em->flush();
Это правильно?или есть волшебное решение?
Вопрос 2: Я установил EasyAdminBundle, который работает очень хорошо, позволяет легко просматривать сообщения в блоге, редактировать и добавлять их.Как настроить так, чтобы поле creator
было установлено авторизованным пользователем id
?Я думаю, что ответ должен был быть написан в https://symfony.com/doc/master/bundles/EasyAdminBundle/book/edit-new-configuration.html,, но почему-то не нашел ничего там или в других разделах.Есть ощущение, что это должно быть сделано путем предоставления опций, которые будут переданы createFormBuilder:
# config/packages/easy_admin.yaml
easy_admin:
entities:
Customer:
class: App\Entity\Customer
form:
form_options: { validation_groups: ['Default', 'my_validation_group'] }
# ...
$form = $this->createFormBuilder($entity, array(
'data_class' => 'App\Entity\Customer',
'validation_groups' => array('Default', 'my_validation_group'),
))
-> ...
но что я должен установить в этих опциях?если возможно, укажите правильное место в документации.Или я должен определить автозаполнение этого поля при создании объекта (в классе объекта)?Но тогда я свяжу сущность с функционалом, который, как представляется, недопустим
мой пользователь сущностей
namespace App\Entity;
use FOS\UserBundle\Model\User as BaseUser;
use Symfony\Component\Security\Core\User\UserInterface;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
* @ORM\Table(name="user")
*/
class User extends BaseUser implements UserInterface
{
Блог
// src/Blogger/BlogBundle/Entity/Blog.php
namespace App\Blogger\BlogBundle\Entity;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Mapping as ORM;
use App\Entity\User;
/**
* @ORM\Entity(repositoryClass="App\Blogger\BlogBundle\Entity\Repository\BlogRepository")
* @ORM\Table(name="blog")
* @ORM\HasLifecycleCallbacks
*/
class Blog
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="integer")
*/
protected $creator_id;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\User")
* @ORM\JoinColumn(name="creator_id", referencedColumnName="id")
*/
protected $user;
...
/**
* Set creator_id
* @param integer $creator_id
* @return Blog
*/
public function setCreatorId($creator_id)
{
$this->creator_id = $creator_id;
$this->setUser();
return $this;
}
/**
* Get creator_id
* @return integer
*/
public function getCreatorId()
{
return $this->creator_id;
}
/**
* Set user.
* @param integer $creator_id
* @return Blog
*/
private function setUser()
{
if(empty($this->creator_id)) {
$this->user = new User();
} elseif($this->em && !empty($this->creator_id)) {
$this->user = $this->em->getRepository('User')->find($this->creator_id);
}
return $this;
}
/**
* Get user.
* @return \App\Entity\User|null
*/
public function getUser()
{
return $this->user;
}
/**
* @ORM\PostLoad
* @ORM\PostPersist
*/
public function fetchEntityManager(LifecycleEventArgs $args)
{
if(is_null($this->em)) {
$this->em = $args->getEntityManager();
}
if(is_null($this->user)) {
$this->setUser();
}
}
}