【发布时间】:2019-08-11 17:50:50
【问题描述】:
我有一个 TelegramUserextending Model 有两个简单的相同功能:
public function toString() {
if ($this->telegram_first_name != null) {
return $this->telegram_first_name;
} else if ($this->telegram_username != null) {
return $this->telegram_username;
}
}
public function getDisplayName() {
if ($this->telegram_first_name != null) {
return $this->telegram_first_name;
} else if ($this->telegram_username != null) {
return $this->telegram_username;
}
}
如果我从类外部调用 toString 方法(例如$telegramUser->toString()),一切都会按预期工作,但如果我从TelegramUser 模型内部调用 toString,就会发生这种情况:
local.ERROR: LogicException: App\TelegramUser::toString must return a relationship instance. in webapp/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php:416
Stack trace:
#0 webapp/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php(399): Illuminate\Database\Eloquent\Model->getRelationshipFromMethod('toString')
#1 webapp/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php(329): Illuminate\Database\Eloquent\Model->getRelationValue('toString')
#2 webapp/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(1519): Illuminate\Database\Eloquent\Model->getAttribute('toString')
#3 webapp/app/TelegramUser.php(79): Illuminate\Database\Eloquent\Model->__get('toString')
这是 TelegramUser 模型中我调用 toString 函数的函数:
public function giftableKarma($chatId, $karmaType, $karmaCount) {
Log::debug("$this->toString() wants to donate $karmaCount unit(s) of $karmaType->name");
...
}
将 toString 放在字符串之外,如下所示:
Log::debug($this->toString() . " wants to donate $karmaCount unit(s) of $karmaType->name");
导致同样的错误。
这就是我定义getDisplayName 的原因,它只有在我把它放在字符串之外时才起作用,所以:
Log::debug($this->getDisplayName() . " wants to donate $karmaCount unit(s) of $karmaType->name");
将愉快地工作并记录用户的名字或用户名,同时:
Log::debug("$this->getDisplayName() wants to donate $karmaCount unit(s) of $karmaType->name");
会导致同样的LogicException错误,这个时候明显指的是getDisplayName“属性”
所以我的两个问题是:
- 为什么
toString方法在从类外部调用代码时有效,而在giftableKarma方法内部无效? - 为什么将 getDisplayName 放在日志字符串中时会触发相同的异常?
非常感谢!
【问题讨论】: