我正在使用laravel 4.2。我有这个奇怪的错误。
我尝试做的只是将User
(Eloquent
模型)的此对象传递给scopeSendTo
模型的方法EmailVerification
;并遇到了这个我无法弄清楚的奇怪错误。
这是我的代码:
class EmailVerification extends Eloquent
{
...
public function scopeSendTo(User $user, $type)
{
$token = Str::slug(microtime(true).Hash::make(Str::random(20)));
$verification = new EmailVerification([
'token' => $token,
'type' => $type,
]);
$user->verifications()->save($verification);
Mail::send('emails.verification', ['verification' => $verification], function ($message) {
$name = $user->profile ? $user->profile->first_name : '';
$message->to($user->email, $name)->subject('Account Verification');
});
...
}
...
}
我试图像这样使用这种方法:
$user = User::find($userId);
EmailVerification::sendTo($user, 'signup');
但它引发了这个错误:
我甚至尝试过dd(get_class($user))
来确认传递的对象是User
对象,而不是Illuminate\Database\Eloquent\Builder
的实例;但我无法弄清楚这里有什么问题。
答案 0 :(得分:1)
Query Scopes有助于在模型中重用查询逻辑。这意味着传递给scope方法的第一个参数是一个查询构建器实例,可以对其进行操作并返回以允许方法链接。在您的情况下,范围方法定义应如下所示:
public function scopeSendTo($query, User $user, $type)
{
// code goes here
}
虽然上面的代码可行,但这是一个糟糕的方法,因为这不是Eloquent模型范围的预期目的。
我建议您修改解决此问题的策略。 This answer为使用Laravel的集成身份验证服务实施电子邮件验证提供了一些很好的建议,或者您可以考虑使用更强大的身份验证解决方案,例如Confide。