Laravel User Model требуется несколько расширений - PullRequest
0 голосов
/ 20 сентября 2019

У меня новая установка Laravel с установленной по умолчанию веб-аутентификацией и проверкой электронной почты (которая использует пакеты по умолчанию и устанавливается с помощью artisan).Это заставляет мою модель User расширять Authentication и MustVerifyEmail, например:

class User extends Authenticatable implements MustVerifyEmail {...}

Поскольку это модель, я хотел бы реализовать отношения с другими моделями, например, у Post может быть много комментариев.Я не могу использовать класс Model, потому что не могу расширить два класса.Так в чем же решение / альтернатива этой проблеме?

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Authenticatable (Illuminate\Foundation\Auth\User) уже расширяет модель.Вам не нужно расширять его снова.

/ vendor / laravel / framework / src / Illuminate / Foundation / Auth / User.php

class User extends Model implements
    AuthenticatableContract,
    AuthorizableContract,
    CanResetPasswordContract
{
    use Authenticatable, Authorizable, CanResetPassword, MustVerifyEmail;
}
0 голосов
/ 23 сентября 2019

Для тех, кто хочет использовать аутентификацию Laravel с проверкой электронной почты , а также хочет расширить класс User с помощью модели , тогда они столкнутся с такой ситуацией, когда класс уже будет выглядеть примерно так:this:

class User extends Authenticatable implements MustVerifyEmail {...}

Чтобы использовать отношения модели в Laravel, вам нужно расширить User с Model, например, так:

class User extends Model
{
    //
}

Это проблема, когда PHP позволяет классу толькопростираться от одного другого класса.Таким образом, мы можем либо перейти от Authenticatable, либо от Model

@ matticustard уже упоминалось, что «Authenticatable уже расширяет Model».Следовательно, мы можем просто расширить Model, и это будет просто работать.

Если у вас реализован MustVerifyEmail, то внесение вышеуказанных изменений приведет к ошибке, поскольку вы не объявите следующие методы: 'hasVerifiedEmail', 'markEmailAsVerified', 'sendEmailVerificationNotification 'и' getEmailForVerification '.

Для этой проблемы просто определите методы следующим образом:

/**
 * Determine if the user has verified their email address.
 *
 * @return bool
 */
public function hasVerifiedEmail()
{
    return ! is_null($this->email_verified_at);
}

/**
 * Mark the given user's email as verified.
 *
 * @return bool
 */
public function markEmailAsVerified()
{
    return $this->forceFill([
        'email_verified_at' => $this->freshTimestamp(),
    ])->save();
}

/**
 * Send the email verification notification.
 *
 * @return void
 */
public function sendEmailVerificationNotification()
{
    $this->notify(new Notifications\VerifyEmail);
}

/**
 * Get the email address that should be used for verification.
 *
 * @return string
 */
public function getEmailForVerification()
{
    return $this->email;
}

ПРИМЕЧАНИЕ. Приведенный выше код просто взят из признака, определенного в Illuminate \ Auth \ MustVerifyEmail;

Это решение сработало для меня, и если у вас есть какие-либо предложения или другое решение, не стесняйтесь отвечать / комментировать ниже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...