如何动态获取网格行为列?

时间:2018-09-27 11:44:39

标签: yii2

我正在制作一个插件系统,并且正在动态添加与Order模型相关的行为。例如:

class OrderBehavior extends Behavior
{
    public function getOrderTrackNumber()
    {
        return $this->owner->hasOne(TrackNumber::class, ['order_id' => 'id']);
    }
}

在运行时,我不知道激活了哪些插件(以及哪些行为)。

如何动态获取所有关联属性(例如orderTrackNumber)以在GridView列中进行渲染?

2 个答案:

答案 0 :(得分:1)

您可以使用getBehaviors()来将所有活动行为附加到模型。在这一点上,您可能应该为行为添加一些接口,这些行为可能会添加新的关系,因此它们将能够提供已定义关系的列表-这样可能会节省性能(浏览所有行为的方法和搜索关系定义可能很慢且不可靠)。 。例如:

interface BehaviorWithRelationsInterface {

    /**
     * @return string[]
     */
    public function getRelationsNames(): array;
}

然后加入模型:

/**
 * @return string[]
 */
public function getAllRelationsNames(): array {
    $relations = [];
    foreach ($this->getBehaviors() as $behavior) {
        if ($behavior instanceof BehaviorWithRelationsInterface) {
            $relations = array_merge($relations, $behavior->getRelationsNames());
        }
    }

    // add relations defined directly in model
    $relations[] = 'user';

    return $relations;
}

如果您什么都没错过,getAllRelationsNames()应该返回模型中定义的所有关系的名称。

答案 1 :(得分:0)

yii2中没有内置的方法可以返回模型的所有关系,

您可以通过behaviours()方法检查您的附加行为,
或者,如果需要完整的列表,请通过反射检查您的获取器和附加行为是否返回了实现关系接口的对象。