Сброс паролей из коробки в проекте Laravel с поставщиком базы данных: «пользователь должен реализовать интерфейс canresetpassword» [решено] - PullRequest
0 голосов
/ 08 ноября 2019

Хорошо, это мой первый проект Laravel. Впервые я тоже что-то разрабатывал на лампе (я парень из Windows .NET, так что будьте осторожны, плз).

Я использую Laravel 5.8 (ограничено нашим хостингом) и создал стандарт из коробкиаутентификация с

php artisan make:auth

Я использую mySql в качестве базы данных для приложения, создал таблицу пользователей, напоминающую поля стандартной модели пользователя, и изменил провайдера пользователей на этот:

'users' => [
         'driver' => 'database',
         'table' => 'myDatabaseUserTableName',
     ],

Итак ... на данный момент все работает нормально. Я могу зарегистрировать пользователей, войти и выйти.

Любопытно, что когда я пытаюсь выполнить опцию запоминания пароля, я получаю исключение UnexpectedValueException: пользователь должен реализовать интерфейс CanResetPassword на PasswordBroker.php

Насколько я достиг по этой теме (кажется, имеетэто было проблемой для многих разработчиков, начиная с ранних версий 5.x), похоже, проблема в том, что метод getUser брокера не использует класс модели User для извлечения пользователя, и, похоже, связан с тем, что я не использую Eloquentстандартный пользовательский провайдер (хотя я использую стандартную пользовательскую модель).

Я не нашел никакого объясненного решения этой проблемы, и мне было интересно, может ли кто-нибудь помочь мне с этим, прежде чем я начал работать с фреймворкомкод, чтобы увидеть, смогу ли я заставить его работать (или сломать его хуже, пытаясь!)

РЕДАКТИРОВАТЬ: Хорошо, наконец-то мне удалось исправить функциональность. Я не чувствую себя полностью комфортно с решением, но оно работает, и это довольно просто.

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

1 Ответ

0 голосов
/ 08 ноября 2019

Чтобы избавиться от ошибки интерфейса, я добавил интерфейс CanResetPasswordContract в класс GenericUser и использовал класс Illuminate \ Auth \ Passwords \ CanResetPassword для реализации интерфейса.

Итак, я только что добавил:

use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

в начале laravel / framework / src / Illuminate / Auth / GenericUser.php, добавил CanResetPasswordContract к реализациям класса и вызвал класс CanResetPassword с:

use canResetPassword;

Внутрикод класса.

Итак, теперь GenericUser, класс, который используется PasswordBroker для извлечения пользователя при восстановлении пароля, реализует интерфейс, и ошибка больше не отображается ...

Конечно, этого недостаточно для исправления всей функциональности, поскольку GenericUser сам по себе не может отправлять электронные письма. Вам нужно разрешить ему быть уведомляемым, чтобы сделать это, вы должны добавить

use Illuminate\Notifications\Notifiable;

к файлу, также используйте Notifiable внутри класса.

На этом этапе, если выпопробуйте еще раз запросить сброс пароля, вы получите электронное письмо с URL-адресом, позволяющим сбросить пароль (если у вас правильная конфигурация email.php, то есть). Но если вы используете его, вы получите сообщение об ошибке, поскольку GenericUser не сможет сохранить изменения в базе данных.

Поэтому вам понадобится модель, способная сохранять данные в базе данных.

Я добавил Eloquent Model, хотя я использую провайдера базы данных, похоже, что Eloquent работает над созданием пользователя, поэтому я решил попробовать:

use Illuminate\Database\Eloquent\Model;

и убедиться, что вы добавили переменную с именемиз вашей таблицы пользователей. Оба эти изменения должны быть внесены в класс GenericUser:

protected $table = 'yourUserTableName';

Также вам необходимо указать, что ваша модель пользователя уже существует (это проверяется перед отправкой электронного письма, в противном случае электронное письмо не отправляется). Поэтому я добавил:

  $user->exists = true;

непосредственно перед сохранением на метод resetPassword поставщика / laravel / framework / src / Illuminate / Foundation / Auth / ResetsPasswords.php

Со всеми этими изменениями вместо, функциональность сброса пароля, наконец, работает.

Однако я чувствую, что поступаю противоположно тому, что я должен делать ... Я хотел бы сказать брокеру использовать мой класс User Model вместо изменения GenericUser во что-то, что напоминает моего UserМодель.

...