Привязать запись к другому объекту - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть блог с постами.Есть поле 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();
        }
    }
}

1 Ответ

0 голосов
/ 26 сентября 2019

Отличная новость!Наконец, кто-то показал мне правильное место для документации документация .всегда отсутствует подробный пример или высовывать человека в конкретное место в документации

Теперь все просто: поле в таблице blog.creator_id, свойство в сущности:

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User")
     */
    protected $creator;

контроллер:

    public function createAction(Request $request)
    {
        $blog  = new Blog();
        $form    = $this->createForm(BlogType::class, $blog);
        $form->handleRequest($request);

        if ($form->isValid()) {
            $blog->setCreator($this->getUser());

            $em = $this->getDoctrine()
                ->getManager();
            $em->persist($blog);
            $em->flush();

            return $this->redirect($this->generateUrl('BloggerBlogBundle_blog_show', array(
                    'id'    => $blog->getId()))
            );
        }

        return $this->render('@BloggerBlog/Blog/form.html.twig', array(
            'form'    => $form->createView()
        ));
    }
...