Как сделать Rest Remover Password и изменить поле электронной почты пользователя в поле имени пользователя с помощью Laravel 5.0?

Я пытаюсь сделать напоминание пароля с Laravel 5.0, моя таблица user настроена в config / auth.php как правильная таблица, чтобы сделать это, но в таблице нет поля электронной почты, потому что в моем имени пользователя больше подходит, чем электронной почты, чтобы быть владельцем электронной почты.

Поэтому, когда я пытаюсь вызвать POST / password / username (в моем случае мне нужно создать метод postUsername в моем PasswordController, который использует trait ResetsPasswords, потому что у меня есть имя пользователя, а не адрес электронной почты, и я не могу переименовать поле имени пользователя по электронной почте ), Я получаю следующую ошибку mysql:

Column not found: 1054 Unknown column 'email' in 'where clause' (SQL: select * from пользователя, where email = email@email.com limit 1

Как изменить поведение по умолчанию напоминания пароля в Laravel 5.0 для использования в поле имени пользователя вместо поля электронной почты?

Я пытаюсь использовать метод mutator (setter) и accessor (getter) для отправки по электронной почте, но не работает, таким образом:

 <?php // class User extends Model implements AuthenticatableContract, CanResetPasswordContract... public function getEmail() { return $this->username; } public function setEmail($email) { return $this->username = $email; } 

Установка метода getEmailForPasswordReset на модели пользователя решает проблему:

 <?php public function getEmailForPasswordReset() { return $this->username; } 

И мой PasswordController для работы с полем POST / password / username / {token} вместо поля электронной почты:

 <?php namespace Reverse\Http\Controllers\Auth; use Illuminate\Http\Request; use Reverse\Http\Controllers\Controller; use Illuminate\Contracts\Auth\Guard; use Illuminate\Contracts\Auth\PasswordBroker; use Illuminate\Foundation\Auth\ResetsPasswords; class PasswordController extends Controller { /* |-------------------------------------------------------------------------- | Password Reset Controller |-------------------------------------------------------------------------- | | This controller is responsible for handling password reset requests | and uses a simple trait to include this behavior. You're free to | explore this trait and override any methods you wish to tweak. | */ use ResetsPasswords; /** * Create a new password controller instance. * * @param \Illuminate\Contracts\Auth\Guard $auth * @param \Illuminate\Contracts\Auth\PasswordBroker $passwords * @return void */ public function __construct(Guard $auth, PasswordBroker $passwords) { $this->auth = $auth; $this->passwords = $passwords; // With this, when logged says: "You're logged!" and not send the email token //$this->middleware('guest'); } /** * Send a reset link to the given user. * * @param Request $request * @return Response */ public function postUsername(Request $request) { $validator = \Validator::make( ['username' => $request->get('username')], ['username' => 'required|email|min:6|max:255'] ); if($validator->passes()) { $response = $this->passwords->sendResetLink($request->only('username'), function ($m) { $m->subject($this->getEmailSubject()); }); switch ($response) { case PasswordBroker::RESET_LINK_SENT: return \Response::json(['success' => 'true']); //return redirect()->back()->with('status', trans($response)); case PasswordBroker::INVALID_USER: return \Response::json(['success' => 'true', 'status' => trans($response)]); //return redirect()->back()->withErrors(['username' => trans($response)]); } } else { return \Response::json(['error' => [ 'messages' => $validator->getMessageBag(), 'rules' => $validator->getRules() ]]); } } /** * Reset the given user's password. * * @param Request $request * @return Response */ public function postReset(Request $request) { $this->validate($request, [ 'token' => 'required', 'username' => 'required|email|min:6|max:255', 'password' => 'required|confirmed', ]); $credentials = $request->only( 'username', 'password', 'password_confirmation', 'token' ); $response = $this->passwords->reset($credentials, function($user, $password) { $user->password = bcrypt($password); $user->save(); $this->auth->login($user); }); switch ($response) { case PasswordBroker::PASSWORD_RESET: return \Response::json(['success' => 'true']); //return redirect($this->redirectPath()); default: return \Response::json(['success' => 'false', 'status' => trans($response)]); /*return redirect()->back() ->withInput($request->only('email')) ->withErrors(['email' => trans($response)]);*/ } } } 

Я тоже меняю вид сброса …

 // /resources/views/auth/reset.blade.php <input type="email" class="form-control" name="username" value="{{ old('username') }}"> 

Я меняю конфигурационный файл /config/mail.php, чтобы использовать его из переменных env, таких как новая переменная SMTP_HOST в файле конфигурации .env:

 <?php return [ /* |-------------------------------------------------------------------------- | Mail Driver |-------------------------------------------------------------------------- | | Laravel supports both SMTP and PHP's "mail" function as drivers for the | sending of e-mail. You may specify which one you're using throughout | your application here. By default, Laravel is setup for SMTP mail. | | Supported: "smtp", "mail", "sendmail", "mailgun", "mandrill", "log" | */ 'driver' => env('MAIL_DRIVER', 'smtp'), /* |-------------------------------------------------------------------------- | SMTP Host Address |-------------------------------------------------------------------------- | | Here you may provide the host address of the SMTP server used by your | applications. A default option is provided that is compatible with | the Mailgun mail service which will provide reliable deliveries. | */ 'host' => env('SMTP_HOST', 'smtp.mailgun.org'), /* |-------------------------------------------------------------------------- | SMTP Host Port |-------------------------------------------------------------------------- | | This is the SMTP port used by your application to deliver e-mails to | users of the application. Like the host we have set this value to | stay compatible with the Mailgun e-mail application by default. | */ 'port' => env('SMTP_PORT', 587), /* |-------------------------------------------------------------------------- | Global "From" Address |-------------------------------------------------------------------------- | | You may wish for all e-mails sent by your application to be sent from | the same address. Here, you may specify a name and address that is | used globally for all e-mails that are sent by your application. | */ 'from' => [ 'address' => env('MAIL_FROM_DEFAULT', 'admin@127.0.0.1'), 'name' => env('MAIL_NAME_DEFAULT', 'Admin') ], /* |-------------------------------------------------------------------------- | E-Mail Encryption Protocol |-------------------------------------------------------------------------- | | Here you may specify the encryption protocol that should be used when | the application send e-mail messages. A sensible default using the | transport layer security protocol should provide great security. | */ 'encryption' => env('SMTP_ENCRYPTION', 'tls'), /* |-------------------------------------------------------------------------- | SMTP Server Username |-------------------------------------------------------------------------- | | If your SMTP server requires a username for authentication, you should | set it here. This will get used to authenticate with your server on | connection. You may also set the "password" value below this one. | */ 'username' => env('SMTP_USERNAME', null), /* |-------------------------------------------------------------------------- | SMTP Server Password |-------------------------------------------------------------------------- | | Here you may set the password required by your SMTP server to send out | messages from your application. This will be given to the server on | connection so that the application will be able to send messages. | */ 'password' => env('SMTP_PASSWORD', null), /* |-------------------------------------------------------------------------- | Sendmail System Path |-------------------------------------------------------------------------- | | When using the "sendmail" driver to send e-mails, we will need to know | the path to where Sendmail lives on this server. A default path has | been provided here, which will work well on most of your systems. | */ 'sendmail' => '/usr/sbin/sendmail -bs', /* |-------------------------------------------------------------------------- | Mail "Pretend" |-------------------------------------------------------------------------- | | When this option is enabled, e-mail will not actually be sent over the | web and will instead be written to your application's logs files so | you may inspect the message. This is great for local development. | */ 'pretend' => false, ]; 

И теперь, отлично работает!