生命周期回调不起作用
Lifecycle callbacks not working
我目前正在试用 Symfony 4,但我在处理由数据库操作(prePersist、preUpdate...)触发的事件时遇到了一些问题
在 Symfony 3 中,我曾经使用 EntityListener 来完成此操作,但我发现它们在 Symfony 4 文档中确实令人费解。但我还发现了 LifecycleCallbacks,我是这样使用的:
/**
* @ORM\Entity(repositoryClass="App\Repository\PostRepository")
* @ORM\HasLifecycleCallbacks()
*/
class Post
{
//Attributes and other functions not included for the sake of clarity, but if I use them, consider that they exist
/**
* @ORM\PrePersist
*/
public function setPostSlug()
{
$title = $this->getPostTitle();
$title = strtolower($title);
$keywords = preg_split("/[\s,']+/", $title);
$slug = implode('-', $keywords);
dump($slug);
$this->$slug = $slug;
return $this;
}
}
我的 post 是通过 Symfony 表单创建的,在持久化之前,我想在我将在我的 URL 中使用的标准化字符串中分解我给 post 的标题访问表示post。不幸的是,尽管正确生成了 slug,但事件永远不会触发持久性。我尝试在 prePersist 和 postPersist 事件上执行该操作,但 none 有效。我搜索了这个问题,发现 LifecycleCallbacks 需要清除缓存才能被考虑在内,但这样做没有帮助。
这是负责创建 post 的操作,如果这可能有所帮助:
/**
* @Route("/admin/create/post", name="admin-create-post")
* @param Request $request
*/
public function createPost(Request $request)
{
$post = new Post();
$form = $this->createForm(PostType::class, $post);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()){
$em = $this->getDoctrine()->getManager();
$post = $form->getData();
$em->persist($post);
$em->flush();
$this->redirectToRoute('main');
}
return $this->render('admin/new_post.html.twig', array(
'form' => $form->createView()
));
}
您是否知道问题的根源,或者我可以使用哪些其他工具来获得所需的结果?
提前致谢。
我用 EventListener 处理复杂的生命周期
为此..做:
# services.yml
AppBundle\EventListener\YourListener:
tags:
- { name: doctrine.event_listener, event: prePersist }
// YourListener.php
namespace AppBundle\EventListener;
class YourListener {
/**
* @param LifecycleEventArgs $args
*/
public function prePersist(LifecycleEventArgs $args): void
{
$post = $args->getEntity();
if ($post instanceof Post) {
// Do your job
}
}
}
但我使用 symfony EventListenerSubscriber 是这样的:
/**
* This needs to be set through passed argument in case of accident duplicate
*
* @ORM\PrePersist()
*/
public function setTrackingNumber()
{
$this->trackingNumber = NumberCreator::randomStringWithNDigits(self::TRACKING_DIGIT_COUNT);
}
所以我认为你需要在你的 slug setter 中这样做
/**
* @ORM\PrePersist
*/
public function setSlug()
{
$title = $this->getPostTitle();
$title = strtolower($title);
$keywords = preg_split("/[\s,']+/", $title);
$slug = implode('-', $keywords);
dump($slug);
$this->$slug = $slug;
return $this;
}
我认为方法名称有问题...希望这对您有所帮助
我目前正在试用 Symfony 4,但我在处理由数据库操作(prePersist、preUpdate...)触发的事件时遇到了一些问题
在 Symfony 3 中,我曾经使用 EntityListener 来完成此操作,但我发现它们在 Symfony 4 文档中确实令人费解。但我还发现了 LifecycleCallbacks,我是这样使用的:
/**
* @ORM\Entity(repositoryClass="App\Repository\PostRepository")
* @ORM\HasLifecycleCallbacks()
*/
class Post
{
//Attributes and other functions not included for the sake of clarity, but if I use them, consider that they exist
/**
* @ORM\PrePersist
*/
public function setPostSlug()
{
$title = $this->getPostTitle();
$title = strtolower($title);
$keywords = preg_split("/[\s,']+/", $title);
$slug = implode('-', $keywords);
dump($slug);
$this->$slug = $slug;
return $this;
}
}
我的 post 是通过 Symfony 表单创建的,在持久化之前,我想在我将在我的 URL 中使用的标准化字符串中分解我给 post 的标题访问表示post。不幸的是,尽管正确生成了 slug,但事件永远不会触发持久性。我尝试在 prePersist 和 postPersist 事件上执行该操作,但 none 有效。我搜索了这个问题,发现 LifecycleCallbacks 需要清除缓存才能被考虑在内,但这样做没有帮助。
这是负责创建 post 的操作,如果这可能有所帮助:
/**
* @Route("/admin/create/post", name="admin-create-post")
* @param Request $request
*/
public function createPost(Request $request)
{
$post = new Post();
$form = $this->createForm(PostType::class, $post);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()){
$em = $this->getDoctrine()->getManager();
$post = $form->getData();
$em->persist($post);
$em->flush();
$this->redirectToRoute('main');
}
return $this->render('admin/new_post.html.twig', array(
'form' => $form->createView()
));
}
您是否知道问题的根源,或者我可以使用哪些其他工具来获得所需的结果?
提前致谢。
我用 EventListener 处理复杂的生命周期 为此..做:
# services.yml
AppBundle\EventListener\YourListener:
tags:
- { name: doctrine.event_listener, event: prePersist }
// YourListener.php
namespace AppBundle\EventListener;
class YourListener {
/**
* @param LifecycleEventArgs $args
*/
public function prePersist(LifecycleEventArgs $args): void
{
$post = $args->getEntity();
if ($post instanceof Post) {
// Do your job
}
}
}
但我使用 symfony EventListenerSubscriber 是这样的:
/**
* This needs to be set through passed argument in case of accident duplicate
*
* @ORM\PrePersist()
*/
public function setTrackingNumber()
{
$this->trackingNumber = NumberCreator::randomStringWithNDigits(self::TRACKING_DIGIT_COUNT);
}
所以我认为你需要在你的 slug setter 中这样做
/**
* @ORM\PrePersist
*/
public function setSlug()
{
$title = $this->getPostTitle();
$title = strtolower($title);
$keywords = preg_split("/[\s,']+/", $title);
$slug = implode('-', $keywords);
dump($slug);
$this->$slug = $slug;
return $this;
}
我认为方法名称有问题...希望这对您有所帮助