Laravel多态关系:如何处理"共享"数据

时间:2014-08-06 09:05:56

标签: php inheritance laravel polymorphism

我目前正在使用Laravel 4中的内容管理系统。 目前的情况是Page类有许多Item类。干净利落。 随着时间的推移,Item类的大小增加,我们实现了Item可以存储的新功能或数据。此时,一个Item可以包含-containers,纯文本,图像,导航等信息,除此之外" shared"每个项目总是有的数据,例如。 position,is_visible等。

现在我的信念是当前的状态是无法管理的,所以我开始考虑将Item类分为多个&34;继承"类(作为C#开发人员的背景),如下所示:

Item.php

  • ID
  • 位置
  • ISVISIBLE
  • isCommentable

Container.php继承Item.php

  • BGCOLOR
  • bgImage
  • 尺寸

Text.php继承Item.php

  • 含量

(所以这一切从C#的角度来看)。

现在,由于我在Laravel工作,让Item类继承自Eloquent,我认为正确的解决方案是通过morphMany和morphTo functionallity将Container / Text类绑定到Item类。我碰到的那面墙是这样的:我应该选择"创造"一个Text对象:我如何确保"基础数据"在Item类中也被填充了。

在设置系统时,我正在使用迁移来填充第一个记录。

Text.php

class Text extends Eloquent {
protected $fillable = [];

public function items()
{
    return $this->morphMany('Item', 'itemable');
}}

Item.php

class Item extends Eloquent
{
    protected $table = "items";

    public function page()
    {
        return $this->belongsTo('Page');
    }


    public function itemable()
    {

        return $this->morphTo();
    }
}

我将免除表格设置迁移,它是我感兴趣的插页:

public function up()
{
    DB::table('containers')->insert(array(
        'bgColor'=>'#ffebcf',
        'bgImage'=>'img/header-jumbotron.png',
        'bgImageRepeat'=>'repeat',
        'bgPosition'=>'left top',
   ));
}

执行此操作时,它不会获得初始Item对象的任何信息。但这应该是必需的,因为没有这些信息,Container对象根本就不应该被激活。也许我的想法有点奇怪,或者我错过了一些非常明显的东西。我正在寻找适合我的思维过程的整洁解决方案。 - 找不到了!这时:墙已经袭来。 另外 - 我想对我的方法提出一些反馈。这首先是正确的做法吗?理解!

0 个答案:

没有答案