构建表我有我的实体文章和一个单表继承这样的:与单表继承
/**
* Article
*
* @ORM\Table(name="article")
* @ORM\Entity(repositoryClass="PM\PlatformBundle\Repository\ArticleRepository")
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="media", type="string")
* @ORM\DiscriminatorMap({"article" = "Article", "movie" = "Movie", "image" = "Image", "text" = "Text"})
*/
class Article
{
protected $id;
protected $title;
protected $description;
protected $author;
//other attributes and setters getters
}
class Image extends Article
{
private $path;
//getter setter
}
class Movie extends Article
{
private $url;
//getter setter
}
所以我的文章的对象类型为图片或仅电影或文字。好吧,现在我想建立一个表单,用户可以发表一篇新文章:在这种形式下,用户必须选择树型(3无线电按钮):图像或电影或文本,当然还有其他字段:标题和描述。我该怎么做?因为用命令
PHP斌/控制台学说:生成:形式myBundle:文章
呈现的形式是:
class ArticleType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title', TextType::class)
->add('description', TextareaType::class)
->add('save', SubmitType::class);
;
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'PM\PlatformBundle\Entity\Article'
));
}
}
我不知道该实施方式我STI关系在这种形式。因为我的文章实体/对象中没有字段(仅在我的表格中)。 我必须添加一个Custom ChoiceType()字段,但它需要一个属性。 当我尝试的形式补充一点:
->add('path', SearchType::class) ->add('url', UrlType::class)
我得到这个错误:
无论属性“路径”,也不是方法之一“的getPath()”,“路径()“,”isPath()“,”hasPath()“,”__get()“并且在”PM \ PlatformBundle \ Entity \ Article“类中具有公共访问权限。
因为我创建了Article的实例,而不是Image或Movie的实例。最初,我创建了一个STI,认为一个新的文章实例可以让我定义文章的“类型”。但不是 ?对 ?
为不应映射到底层对象属性(Article)的表单域添加'mapped:false'选项。那么你将不得不找到一种方法来正确处理这种形式。 –
嗯,我不知道是否使用映射是一个好主意:false。我应该怎么做才能正确恢复路径和URL,因为它们确实存在于我的数据库和对象中(但通过继承)? –
但是你没有'Image' /'Movie'对象,是吗?不,你没有。所以你认为它应该如何工作(不必介意是否可能)? –