有没有办法不使用 Kohana 中的子模型覆盖整个属性?

Posted

技术标签:

【中文标题】有没有办法不使用 Kohana 中的子模型覆盖整个属性?【英文标题】:Is there a way to not override the entire property with a sub model in Kohana? 【发布时间】:2010-11-10 07:56:16 【问题描述】:

我有以下模型链:

Model_Auth_User
Model_Module_User
Model_App_User
Model_User

...Model_User 是我实际使用的模型,它只是一个虚拟类,而其他的都有功能。

我的问题是在Model_App_User 中我想在模型中添加一列,比如employee_flag。我需要将它添加到_labels_table_columns 和可能的其他人。当然,如果我在Model_App_User中输入以下内容:

 protected $_labels = array(
      'employee_flag' => 'Employee Flag',
 );

整个标签数组被覆盖。不是我想要的。

我想到的一个选项是添加一个名为_override_properties 的属性,我将在初始化时处理它并与对象中的属性合并。但这也失败了,因为如果我在Model_Module_User 中使用它,它将覆盖我在Model_App_User 中放入的任何内容。

还有哪些其他选择?

【问题讨论】:

【参考方案1】:

有两种解决方案。您可以通过在名为 labels 的方法中定义标签来更改 ORM 的工作方式。我想应该是这样的:

public static function labels ()

    return array
    (
        'name' => 'First Name'
    );

然后在您的子类中,它会很简单:

public static function labels ()

    $labels = parent::labels();

    // Add new or modify labels.
    $labels['last'] = 'Last Name';

    return $labels;

您需要修改 ORM 检索标签的方式才能使其工作。如果您没有时间修改 ORM 的工作方式,那么 Zahymakas 添加到子数组 __construct 的解决方案是一个不错的折衷方案。

【讨论】:

【参考方案2】:

$this->_labels['employee_flag'] = 'Employee Flag'; 呢?

【讨论】:

但这可以在定义中完成,因为$this 还不存在。这需要通过一种方法来完成。所以可以在_initialize() 中做到这一点。我想知道是否有另一个不需要添加另一个 _initialize() 的解决方案(虽然不是一个糟糕的解决方案)。 好吧,既然你试图修改一个属性而不是(重新)设置它,这要么必须在某种 init func 中完成,要么必须有一个像“modifyProperty”这样的方法。 _initialize() 是你需要的方法。 我不认为你可以做任何事情没有覆盖。您可以覆盖 _initialize 函数或构造函数。

以上是关于有没有办法不使用 Kohana 中的子模型覆盖整个属性?的主要内容,如果未能解决你的问题,请参考以下文章

NestedScrollView 内的子级未覆盖整个屏幕高度

Kohana 3.2 中使用 ORM 模型(结果)的字段的自定义过滤器

Kohana - 检查模型是不是存在(不是记录)

有没有办法删除 kohana 在电子邮件中设置的返回路径?

是否可以在不使用整个框架的情况下在 PHP 中为 ORM 安装 Kohana 库?

WPF:有没有办法在不重新定义整个样式的情况下覆盖 ControlTemplate 的一部分?