2015-02-25 4 views
1

Я использую laravel 4.2. И у меня есть эта странная ошибка.Laravel странная ошибка: Яркая модель меняется на экземпляр класса Builder

Все, что я пытаюсь сделать, это передать этот объект 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'); 

Но он бросает эту ошибку:

enter image description here

Я даже попытался сделать dd(get_class($user)), который подтверждает, что переданный объект является n User объект и строго не экземпляр Illuminate\Database\Eloquent\Builder; но я не могу понять, в чем проблема.

ответ

1

Query Scopes полезны для повторного использования логики запросов в моделях. Это означает, что первым параметром, который передается методу scope, является экземпляр построителя запросов, который можно манипулировать и возвращать, чтобы обеспечить цепочку методов. В вашем случае определение метода охвата должно выглядеть следующим образом:

public function scopeSendTo($query, User $user, $type) 
{ 
    // code goes here 
} 

Хотя приведенный выше код будет работать, это плохой подход, так как это не целевое назначение областей для красноречивых моделей.

Предлагаю пересмотреть свою стратегию решения этой проблемы. This answer дает некоторые полезные рекомендации по внедрению проверки электронной почты с использованием встроенной службы проверки подлинности Laravel, или вы можете рассмотреть возможность использования более надежного решения для проверки подлинности, такого как Confide.

Смежные вопросы