我有一个父类:
<?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;提供了一个值。论点。论证 可以为空,并且没有提供空值,没有默认值 已提供或因为此后有一个非可选参数 之一。
如何映射子实体?
答案 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”)