Php 文件存储与条令和symfony 3?
我需要在我的symfony3应用程序中创建我的实体的帮助: 我希望我的用户可以发布内容如下的文章:Php 文件存储与条令和symfony 3?,php,doctrine-orm,symfony,Php,Doctrine Orm,Symfony,我需要在我的symfony3应用程序中创建我的实体的帮助: 我希望我的用户可以发布内容如下的文章: 头衔 作者 一个唯一图像(上载文件) 或者一部独特的电影($url) 你推荐什么? 我应该这样构建我的文章实体吗 class Article { /** * @var int * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strate
- 头衔
- 作者
- 一个唯一图像(上载文件)
- 或者一部独特的电影($url)
class Article
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var integer
*
* @ORM\Column(name="author", type="integer")
*/
private $author;
/**
* @var ?
*
* @ORM\Column(name="image", type="?")
*/
private $image;
/**
* @var string
*
* @ORM\Column(name="url_movie", type="string")
*/
private $url_movie;
/**
* @var integer
*
* @ORM\Column(name="media", type="integer")
*/
private $media;
}
(在控制器中:如果$media=1=>这是一个图像,否则这是一个视频)
或者使用类似于一对一关系的新实体“媒体”作为例子
对于我的案例,什么是最好的方法?我认为使用媒体实体并在媒体实体中处理媒体类型是最好的方法
class Article
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
// ...
/**
* @var Media
*
* @OneToOne(targetEntity="Media")
* @ORM\JoinColumn(name="media_id", referencedColumnName="id")
*/
private $media;
}
class Media
{
const TYPE_IMAGE = 'image';
const TYPE_MOVIE = 'movie';
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(type="string")
*/
private $url;
/**
* @var string
*
* @ORM\Column(type="string")
*/
private $type;
}
另一种方法是为图像和电影使用不同的实体(如果需要)。我认为使用媒体实体并在媒体实体中处理媒体类型是最好的方法
class Article
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
// ...
/**
* @var Media
*
* @OneToOne(targetEntity="Media")
* @ORM\JoinColumn(name="media_id", referencedColumnName="id")
*/
private $media;
}
class Media
{
const TYPE_IMAGE = 'image';
const TYPE_MOVIE = 'movie';
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(type="string")
*/
private $url;
/**
* @var string
*
* @ORM\Column(type="string")
*/
private $type;
}
另一种方法是使用图像和电影的不同实体(如果需要)。好的,我在我的文章类上做了一个表继承:
/**
* 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"})
*/
class Article
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="title", type="string", length=255)
*/
private $title;
//...
}
/**
* Movie
*
* @ORM\Entity
*/
class Movie extends Article
{
/**
* @var string
*
* @ORM\Column(name="url", type="text")
*/
private $url;
//getter setter
}
/**
* Image
*
* @ORM\Entity
*/
class Image extends Article
{
/**
* @var string
*
* @ORM\Column(name="path", type="string", length=255)
*/
private $path;
//getter setter
}
太棒了 好的,我在我的文章类上做了一个单表继承:
/**
* 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"})
*/
class Article
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="title", type="string", length=255)
*/
private $title;
//...
}
/**
* Movie
*
* @ORM\Entity
*/
class Movie extends Article
{
/**
* @var string
*
* @ORM\Column(name="url", type="text")
*/
private $url;
//getter setter
}
/**
* Image
*
* @ORM\Entity
*/
class Image extends Article
{
/**
* @var string
*
* @ORM\Column(name="path", type="string", length=255)
*/
private $path;
//getter setter
}
太棒了 是的,这很正常。遗憾的是,discriminator列是用于数据库端的,因此在您的实体中无法访问它。有两种可能的方法可以实现您的目标:
第一,使用子类名称:
/**
* 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"})
*/
class Article
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="title", type="string", length=255)
*/
private $title;
//...
/**
* Get article type.
*
* @return string
*/
public function getType()
{
// This will return "movie" or "image"
return strtolower(substr(strrchr(get_class($this), "\\"), 1));
}
}
/**
* Movie
*
* @ORM\Entity
*/
class Movie extends Article
{
/**
* @var string
*
* @ORM\Column(name="url", type="text")
*/
private $url;
//getter setter
}
/**
* Image
*
* @ORM\Entity
*/
class Image extends Article
{
/**
* @var string
*
* @ORM\Column(name="path", type="string", length=255)
*/
private $path;
//getter setter
}
第二,通过在类中手动声明类型:
/**
* 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"})
*/
class Article
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="title", type="string", length=255)
*/
private $title;
/**
* @var string
*/
protected $type;
//...
/**
* Get article type.
*
* @return string
*/
public function getType()
{
return $this->type;
}
}
/**
* Movie
*
* @ORM\Entity
*/
class Movie extends Article
{
/**
* @var string
*
* @ORM\Column(name="url", type="text")
*/
private $url;
public function __construct()
{
$this->type = 'movie';
}
//getter setter
}
/**
* Image
*
* @ORM\Entity
*/
class Image extends Article
{
/**
* @var string
*
* @ORM\Column(name="path", type="string", length=255)
*/
private $path;
public function __construct()
{
$this->type = 'image';
}
//getter setter
}
我个人倾向于第一种解决方案。我发现它更干净,更具发展性(如果您必须添加第三种文章类型,则此代码将进行调整)
当然,您也可以使用
instanceof
来确定您正在操作的文章实体是哪个子类。是的,这是正常的。遗憾的是,discriminator列是用于数据库端的,因此在您的实体中无法访问它。有两种可能的方法可以实现您的目标:
第一,使用子类名称:
/**
* 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"})
*/
class Article
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="title", type="string", length=255)
*/
private $title;
//...
/**
* Get article type.
*
* @return string
*/
public function getType()
{
// This will return "movie" or "image"
return strtolower(substr(strrchr(get_class($this), "\\"), 1));
}
}
/**
* Movie
*
* @ORM\Entity
*/
class Movie extends Article
{
/**
* @var string
*
* @ORM\Column(name="url", type="text")
*/
private $url;
//getter setter
}
/**
* Image
*
* @ORM\Entity
*/
class Image extends Article
{
/**
* @var string
*
* @ORM\Column(name="path", type="string", length=255)
*/
private $path;
//getter setter
}
第二,通过在类中手动声明类型:
/**
* 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"})
*/
class Article
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="title", type="string", length=255)
*/
private $title;
/**
* @var string
*/
protected $type;
//...
/**
* Get article type.
*
* @return string
*/
public function getType()
{
return $this->type;
}
}
/**
* Movie
*
* @ORM\Entity
*/
class Movie extends Article
{
/**
* @var string
*
* @ORM\Column(name="url", type="text")
*/
private $url;
public function __construct()
{
$this->type = 'movie';
}
//getter setter
}
/**
* Image
*
* @ORM\Entity
*/
class Image extends Article
{
/**
* @var string
*
* @ORM\Column(name="path", type="string", length=255)
*/
private $path;
public function __construct()
{
$this->type = 'image';
}
//getter setter
}
我个人倾向于第一种解决方案。我发现它更干净,更具发展性(如果您必须添加第三种文章类型,则此代码将进行调整)
当然,您也可以使用
instanceof
来确定您正在操作的文章实体是哪个子类。但是我不理解上面的媒体类。您的类没有图像路径或电影url的属性。它是如何工作的?我没有把反射推到那么远:我假设(错误地,我猜^^^^)你的图像也是由URL定义的。如果管理它们的方式不同,那么实体继承可能是一个不错的选择。媒体实体将只是一个类,在您的文章实体中只有一个属性“Media”,它可以包含两种不同类型的类。所以在Doctrine的文档中,我必须在单表继承和类表继承之间进行选择?是的!在大多数情况下,建议使用单表继承:这是最简单的方法,在大多数情况下,也是性能最好的方法。我详细介绍了我的新答案。但是我不理解你上面的媒体课。您的类没有图像路径或电影url的属性。它是如何工作的?我没有把反射推到那么远:我假设(错误地,我猜^^^^)你的图像也是由URL定义的。如果管理它们的方式不同,那么实体继承可能是一个不错的选择。媒体实体将只是一个类,在您的文章实体中只有一个属性“Media”,它可以包含两种不同类型的类。所以在Doctrine的文档中,我必须在单表继承和类表继承之间进行选择?是的!在大多数情况下,建议使用单表继承:这是最简单的方法,在大多数情况下,也是性能最好的方法。我详细介绍了我的新答案。谢谢你的帮助,但我已经在我的模板中直接为测试文章类型构建了我自己的小树枝扩展,现在它工作得非常好!无需手动声明类型或其他方法。这实际上是另一种方法!我很高兴你实现了你想要的。:)我回到这里,目前我正在研究一种通过表单添加新文章的方法。我很困惑。请看这里,谢谢您的帮助,但我已经在模板中直接为测试文章类型构建了自己的细枝扩展,现在它工作得非常好!无需手动声明类型或其他方法。这实际上是另一种方法!我很高兴你实现了你想要的。:)我回到这里,目前我正在研究一种通过表单添加新文章的方法。我很困惑。看这里