如何通过父类通过paramconverter映射实体

时间:2018-03-08 15:25:05

标签: php symfony inheritance doctrine abstract-class

我有一个父类:

<?php
namespace AppBundle\Entity\Blog;

/**
 * Class Tag
 * This is the parent class for all Tags
 */
abstract class Tag
{
    /**
      @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(name="tag_name", type="string", length=255, unique=true)
     */
    protected $tagName;

    /**
     * @ORM\Column(name="slug", type="string", length=255, unique=true)
     */
    protected $slug;
    // ... getters and setters

和2个儿童班:
OtherTag

<?php
namespace AppBundle\Entity\Blog;

/**
 * OtherTag 
 * @ORM\Table(name="othertag")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\Blog\OtherTagRepository")
 */
class OtherTag extends Tag

和JobTag     

namespace AppBundle\Entity\Blog;

/**
 * JobTag
 *
 * @ORM\Table(name="jobtag")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\Blog\JobTagRepository")
 */
class JobTag extends Tag

在我的控制器中,我想通过标记名或slug来映射标记,但我无法使其工作。我不想写每一个动作(比如将用户添加到标签订阅或删除用户订阅)两次,所以我想,它会像这样工作:

/**
 * Add user subscription to tag.
 * @Route("/subscription/add/{tagname}", name="subscription_add_tag")
 * @ParamConverter("tag", options={"mapping":{"tagname":"tagName"}})
 */
public function addUserTagAction(Tag $tag)
{
    //TODO: some code to add user
}

但我收到错误:

  

控制器   &#34;的appbundle \控制器\博客\ TagController :: addUserTagAction()&#34;要求   你为&#34; $ tag&#34;提供了一个值。论点。论证   可以为空,并且没有提供空值,没有默认值   已提供或因为此后有一个非可选参数   之一。

如何映射子实体?

1 个答案:

答案 0 :(得分:1)

您可以创建own custom ParamConverter

namespace Sensio\Bundle\FrameworkExtraBundle\Request\ParamConverter;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Component\HttpFoundation\Request;

interface ParamConverterInterface
{
    function apply(Request $request, ParamConverter $configuration);

    function supports(ParamConverter $configuration);
}

然后将其声明为服务并使用它

@ParamConverter(“tagname”,class =“AcmeBundle:Tag”,converter =“your_service_name”)