Symfony2将两个变量从服务传递给Controller $ slug

时间:2015-01-15 18:52:58

标签: forms symfony service controller slug

要清理我的控制器代码,我想将“newPostAction”移动到服务。我得到的问题是,现在我无法通过服务两个变量的功能传递给控制器​​。我使用该函数创建一个表单,并从表单的帖子中获取slug并进行渲染。我不知道如何将它传递给控制器​​。我尝试使用“list()”函数,但它没有正确的信息。

如何从控制器内部调用pos的“slug”?

这是控制器代码:

/**
 * @param Request $request
 * @return array
 *
 * @Route("/new/_post", name="_blog_backend_post_new")
 * @Template("BlogBundle:Backend/Post:new.html.twig")
 */
public function newPostAction(Request $request)
{
    $form_post = $this->getPostManager()->createPost($request);

    $slug_post = ¿How do I get it from inside the createPost()?;

    if (true === $form_post)
    {
        $this->get('session')->getFlashBag()->add('success', 'Your post was submitted successfully');

        return $this->redirect($this->generateUrl('blog_blog_post_show', array('slug' => $slug_post)));
    }

    return array(
        'post_slug' => $slug_post,
        'form_post' => $form_post->createView()
    );
}

以下是用于创建新帖子实体的PostManager服务:

/**
 * Create and validate a new Post
 *
 * @param Request $request
 * @return bool|FormInterface
 */
public function createPost (Request $request)
{
    $post = new Post();
    $post->setAuthor($this->um->getloggedUser());

    $form_post = $this->formFactory->create(new PostType(), $post);
    $form_post->handleRequest($request);

    $slug_post = $post->getSlug();

    if ($form_post->isValid())
    {
        $this->em->persist($post);
        $this->em->flush();

        return true;
    }

    return $form_post;
}

1 个答案:

答案 0 :(得分:1)

您只需要从服务返回一个数组并访问控制器中的值。

<强>更新

需要对代码进行一些更改才能使工作正常进行。

解释:当表单有效时,之前的代码(我删除了它)返回true,因此$ret["form_post"]没有意义,因为$ret不是阵列。令我惊讶的是它并没有给你一个错误。

无论如何,这可以解释为什么Doctrine并没有坚持你的实体。谈到重定向,错误可能是由于同样的原因。 $ret为真(布尔值),$ret["form_slug"]也没有意义。

我希望这可以解决问题。请告诉我它是否有效。

服务

public function createPost (Request $request)
{
    $post = new Post();
    $post->setAuthor($this->um->getloggedUser());

    $form_post = $this->formFactory->create(new PostType(), $post);
    $form_post->handleRequest($request);

    $slug_post = $post->getSlug();

    if ($form_post->isValid())
    {
        $this->em->persist($post);
        $this->em->flush();

        return array("form_post" => true, "slug_post" => $slug_post);;
    }

    return array("form_post" => $form_post, "slug_post" => $slug_post);
}

控制器:

public function newPostAction(Request $request)
{
    $ret = $this->getPostManager()->createPost($request);

    $form_post = $ret["form_post"];        

    $slug_post = $ret["slug_post"];

    if (true === $form_post)
    {
        $this->get('session')->getFlashBag()->add('success', 'Your post was submitted successfully');

        return $this->redirect($this->generateUrl('blog_blog_post_show', array('slug' => $slug_post)));
    }

    return array(
        'post_slug' => $slug_post,
        'form_post' => $form_post->createView()
    );
}