bars80081
Новичок
Добрый день,
почему-то в попытке осилить Симфони меня преследуют дубовые вопросы на самых примитивных вещах. как всегда не могу задать гуглу нужный вопрос.
Допустим, есть блог с постами. Есть поле blog.creator int, которое несёт в себе id пользователя (таблица user.id). Соответственно, хочется, чтобы при создании записи в таблице blog, в поле blog.creator проставлялось id авторизованного пользователя.
сущности:
в чём вопрос? как это ПРАВИЛЬНО сделать?
вопрос 1:
если я сам формирую форму и обрабатываю её, то само собой напрашивается решение на валидации формы:
правильно ли это? или я горожу велосипед там, где есть волшебная команда?
вопрос 2:
если я установил EasyAdminBundle, который очень удачно лёг и позволяет легко просматривать записи Blog, редактировать и добавлять их.
Каким образом там надо задать конфигурацию, чтобы поле creator заполнялось пользователем?
В теории ответ должен был быть прописан в EasyAdminBundle/book/edit-new-configuration , но почему-то ни там, ни в прочих разделах ничего не обнаружил.
Возникает ощущение, что это надо делать через подачу опций, которые будут переданы в createFormBuilder:
но что указывать в этих опциях? если можно, ткните в нужное место документации тогда.
Или надо указывать автозаполнение этого поля при создании сущности (прямо в классе сущности)? Но ведь тогда я отягащу сущность функционалом, которого вроде как следует избегать
почему-то в попытке осилить Симфони меня преследуют дубовые вопросы на самых примитивных вещах. как всегда не могу задать гуглу нужный вопрос.
Допустим, есть блог с постами. Есть поле blog.creator int, которое несёт в себе id пользователя (таблица user.id). Соответственно, хочется, чтобы при создании записи в таблице blog, в поле blog.creator проставлялось id авторизованного пользователя.
сущности:
PHP:
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
{
PHP:
<?php
// 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:
если я сам формирую форму и обрабатываю её, то само собой напрашивается решение на валидации формы:
PHP:
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, который очень удачно лёг и позволяет легко просматривать записи Blog, редактировать и добавлять их.
Каким образом там надо задать конфигурацию, чтобы поле creator заполнялось пользователем?
В теории ответ должен был быть прописан в EasyAdminBundle/book/edit-new-configuration , но почему-то ни там, ни в прочих разделах ничего не обнаружил.
Возникает ощущение, что это надо делать через подачу опций, которые будут переданы в createFormBuilder:
Код:
# config/packages/easy_admin.yaml
easy_admin:
entities:
Customer:
class: App\Entity\Customer
form:
form_options: { validation_groups: ['Default', 'my_validation_group'] }
# ...
PHP:
$form = $this->createFormBuilder($entity, array(
'data_class' => 'App\Entity\Customer',
'validation_groups' => array('Default', 'my_validation_group'),
))
-> ...
Или надо указывать автозаполнение этого поля при создании сущности (прямо в классе сущности)? Но ведь тогда я отягащу сущность функционалом, которого вроде как следует избегать