Laravel 5.4 模型属性和方法继承



主要模型是BaseMonster,其中包含怪物的所有基本信息(统计数据,怪物类型等),这些信息将由子职业继承。

目前,我有两个子类,名为WildMonster和PlayerMonster,与BaseMonster相关,具有一对多关系(从BaseMonster方面)。

我的主要目标是能够将属性(如统计数据,名称和图像)以及所有相关方法从BaseMonster继承到其他子怪物类。
这样,我可以避免公共属性的数据库冗余,同时调整某些子怪物的各个方面,只需编辑其父 BaseMonster 记录即可。
示例:"海妖"怪物的攻击属性值太高。只需更改其BaseMonster记录,与"Kraken"相关的所有WildMonsterPlayerMonster实例都会受到影响。

我也想避免代码冗余,例如在 BaseMonster 中创建一个 rating() 方法,该方法将使用怪物实例的所有实际统计数据(以及统计奖励和等级),并且可以被任何怪物子类使用

我尝试使用 Laravel 访问器访问父属性,并将它们设置为Eloquent base_monster关系统计信息,但这样我就无法使用子属性(如级别或health_bonus)来相应地调整值。(或者至少我没有找到正确的方法)。
我也尝试从子端设置访问器,但成功了一半,但无论如何,这意味着我必须在所有子类中编写相同的访问器,如果我想更改某些内容,我会弄得一团糟。

如何在 laravel 5.4 中实现这样的事情?


属性提取


BaseMonster 是其他怪物类的父级,包含大多数场合所需的所有常见属性和方法。BaseMonsters由游戏管理员创建,用于管理统计数据和图像等内容,并生成新的WildMonster以填充各种地下城

基地怪物(扩展模型)

  • 名字
  • 图像
  • 健康
  • 攻击
  • 防御
  • monster_type_id(与怪物类型模型的关系)
野生怪物

是在地牢或其他方式遇到的怪物。如果被招募,可以"变身"为玩家怪物。

WildMonster(扩展BaseMonster)

名称
  • (为特殊遭遇自定义名称)
  • 级别(相应地调整统计数据)
  • health_bonus(怪物有可能拥有各种属性加成)
  • attack_bonus
  • defense_bonus
  • base_monster_id(与BaseMonster模型的关系)
玩家怪物是玩家在战斗后招募的怪物。

玩家怪物(扩展基地怪物)

  • 名称(最终由玩家自定义)
  • 水平
  • health_bonus
  • attack_bonus
  • defense_bonus
  • base_monster_id(与BaseMonster模型的关系)

您正在寻找的内容称为 Laravel 中的多态关系。通过这种方式,您可以根据要求定义基本模型BaseMonster。按照网站上的示例:

<?php
namespace App;
use IlluminateDatabaseEloquentModel;
class BaseMonster extends Model
{
public function monster_wild_or_player()
{
return $this->morphTo();
}
public function monster_type()
{
return $this->hasOne('AppMonsterType');
}
}
class PlayerMonster extends Model
{
public function base_info()
{
return $this->morphMany('AppBaseMonster', 'monster_wild_or_player');
}
}
class WildMonster extends Model
{
public function base_info()
{
return $this->morphMany('AppBaseMonster', 'monster_wild_or_player');
}
}

最新更新