Подтверждение регистрации пользователя по email — Laravel.
(подробнее читайте тут) ну а далее уже ее необходимо дорабатывать в зависимости от задач.
По-умолчанию, в Laravel не требуется подтверждение email указанного при регистрации пользователя, а сам он автоматически «логинится» сразу после регистрации. Если для WEB приложения важен реальный электронный адрес, например мы собираемся потом отправлять пользователю сообщения, то такая схема не может устраивать.
В данной статье пример создания функционала подтверждения регистрации пользователя, т.е. ему (на указанный email) будет отправлено сообщение со ссылкой и, пока он по ней не перейдет, не сможет авторизоваться.
Проверено на Laravel версии 5.8.
Сущность и база данных.
В сущность пользователя, файл User.php, добавляем статусы:
class User extends Authenticatable < use Notifiable; const STATUS_DELETED = 0; const STATUS_INACTIVE = 9; const STATUS_ACTIVE = 10; …
DELETED - может понадобиться в дальнейшем
INACTIVE - статус будет присваиваться сразу после регистрации
ACTIVE - статус будет даваться пользователю подтвердившему свой email
php artisan make:migration ChangeUsersTable --table=users
В появившийся файл миграции добавляем:
class ChangeUsersTable extends Migration < public function up() < Schema::table('users', function (Blueprint $table) < $table->smallInteger('status')->default(User::STATUS_INACTIVE)->after('remember_token'); $table->string('verify_token')->after('status')->nullable()->unique(); >); DB::table('users')->update([ 'status' => User::STATUS_ACTIVE, ]); > public function down() < Schema::table('users', function (Blueprint $table) < $table->dropColumn('status'); $table->dropColumn('verify_token'); >); > >
Всем уже существующим пользователям проставляется STATUS_ACTIVE.
Функционал отправки сообщения о регистрации.
Т.к. подтверждение будет высылаться по email, необходимо создать соответствующий функционал.
Генерируем отдельный класс для работы с отправкой писем с помощью консоли:
php artisan make:mail Auth/VerifyMail --markdown=emails.auth.verify
ключ --markdown указывает, что будет использоваться формат Markdown для составления шаблона письма. Это упростит работу, т.к. уже есть подготовленные блоки кода в фреймворке. Значением ему указывается путь к шаблону письма (где хотим его разместить), он так же будет сгенерирован.
Создастся файл Mail/Auth/VerifyMail.php наследуемый от Illuminate\Mail\Mailable.
В Laravel каждый тип email-сообщений, отправляемых вашим приложением, представлен классом "mailable".
Нужно его привести к такому виду:
user = $user; > public function build() < return $this ->subject('Signup Confirmation') ->markdown('emails.auth.verify'); > >
Шаблон письма resources/views/emails/auth/verify.blade.php
@component('mail::message') # Email Confirmation Please refer to the following link: @component('mail::button', ['url' => route('register.verify', ['token' => $user->verify_token])]) Verify Email @endcomponent Thanks,
> @endcomponent
В ссылке указываем маршрут route('register.verify'), который нужно будет создать для проверки токена т.е. подтверждения регистрации.
Теперь сущность User готова для работы и есть класс с помощью которого будет отправляться сообщение пользователю со ссылкой для подтверждения email.
Изменение логики при регистрации.
Чтобы пользователь не аутентифицировался автоматически после регистрации, чтобы организовать работу с новыми полями из БД (verify_token и status) и чтобы создать функционал отправки письма/подтверждения email, необходимо доработать RegisterController.
Выполнив команду в консоли:
php artisan route:list
получим список зарегистрированных маршрутов. В графе URI находим «register» и действия которые вызываются
- для GET: App\Http\Controllers\Auth\RegisterController@showRegistrationForm
- для POST: App\Http\Controllers\Auth\RegisterController@register
Соответственно форма регистрации открывается переходом по ссылке, а значит методом GET, а данные из нее отправляются на обработку методом POST.
В App/Http/Controllers/Auth/RegisterController.php и подключаемых внутри этого класса трейтах содержится функционал регистрации. Т.к. форма регистрации нас устраивает, ищем действие куда будут переданы данные после ее заполнения. Согласно списка маршрутов, это метод register. В самоом RegisterController такого метода не находим, поэтому переходим в подключаемый трейт RegistersUsers.php. Видим в нем такую строку:
$this->guard()->login($user);
т.е. автоматическая авторизация пользователя, от которой нужно избавиться.
Переопределяем его в классе App/Http/Controllers/Auth/RegisterController таким образом:
public function register(Request $request) < $this->validator($request->all())->validate(); event(new Registered($user = $this->create($request->all()))); return redirect()->route('login') ->with('success', 'Check your email and click on the link to verify.'); >
После регистрации пользователь не будет авторизован, а вместо этого перенаправлен на страницу входа с сообщением о необходимости подтверждения email.
Затем меняем метод create, т.к. при создании нового пользователя должен генерироваться случайный токен, а так же статус установим в INACTIVE (хотя это и так значение по-умолчанию для нового пользователя в таблице users):
protected function create(array $data) < $user = User::create([ 'name' =>$data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']), 'verify_token' => Str::random(), 'status' => User::STATUS_INACTIVE, ]); Mail::to($user->email)->send(new VerifyMail($user)); return $user; >
Так же тут добавляем отправку сообщения пользователю со сгенерированным ранее классом VerifyMail.
В этом же классе создаем метод который будет выполняться при переходе пользователя по ссылке из письма:
public function verify($token) < if (!$user = User::where('verify_token', $token)->first()) < return redirect()->route('login') ->with('error', 'Sorry your link cannot be identified.'); > $user->status = User::STATUS_ACTIVE; $user->verify_token = null; $user->save(); return redirect()->route('login') ->with('success', 'Your e-mail is verified. You can now login.'); >
По токену будет осуществлен поиск пользователя в БД, затем ему будет установлен статус «активен», а токен обнулен. После этого пользователь будет перенаправлен на страницу входа.
Т.к. в методе create мы добавили 2 аргумента одноименному методу, нужно их указать в сущности User в свойстве $fillable.
User.php
protected $fillable = [ 'name', 'email', 'password', 'verify_token', 'status', ];
Маршрутизация.
Теперь нужно прописать маршрут для действия verify, на которое будет вести ссылка из письма.
Добавляем в routes/web.php:
Route::get('/verify/', 'Auth\RegisterController@verify')->name('register.verify');
Изменение логики авторизации.
Осталось сделать, чтобы пользователь не мог "залогиниться" до момента подтверждения своего email.
Для этого добавляем метод в App/Http/Controllers/Auth/LoginController.php
public function authenticated(Request $request, $user) < if ($user->status !== User::STATUS_ACTIVE) < $this->guard()->logout(); return back()->with('error', 'You need to confirm your account. Please check your email.'); > return redirect()->intended($this->redirectPath()); >
Автор: Сергей Дата публикации: 29.05.2019
- AJAX пагинация в Laravel-5. Динамическая подгрузка контента (результатов поиска по сайту).
- Создание расширения (пакета) для Laravel 5.
- Виджеты в Laravel 5.
- Мультиязычный сайт на Laravel 5. Отображаем текущий язык в URL.
- События в Laravel 5.
Пишем регистрацию на сайте на PHP
Ну вот мы с вами и закончили изучение основных возможностей объектно-ориентированного программирования. Теперь мы будем учиться применять все эти возможности в деле. А именно – напишем движок для блога на чистом PHP. И в сегодняшнем уроке мы узнаем как сделать регистрацию на сайте. Благодаря ей новые пользователи смогут регистрироваться на нашем сайте. Поехали.
Продолжение урока будет доступно вам
после покупки ООП в PHP
Как сделать проверку полей после отправки формы а не сразу?
Изучаю PhP, решил сделать самую простую, ненавороченную форму регистрации. Условия поставил себе такие, если в имени больше 10 символов, то имя не корректно. Если в email нет 2 точек и одного @, то email не корректен. Всего чего хотел добился, но проблема с If получилась, при обновлении страницы, текст из операторов ветвления, сразу же показывается, и изменяется только в случае если условие верно. Как можно незамысловата, самым простым для новичков способом сделать так, что бы текст операторов не показывался пока не будет отправлена форма?

Отслеживать
3,443 9 9 серебряных знаков 19 19 бронзовых знаков
задан 13 окт 2020 в 11:48
MrSilentBeast MrSilentBeast
11 5 5 бронзовых знаков
Для начала, чтобы никто не ломал глаза о картинки, код надо вставить текстом.
13 окт 2020 в 11:58
Ляяя, забыл( Сори
13 окт 2020 в 12:05
интересно, почему заголовок вопроса был как сделать форму, а вопрос на самом деле - как узнать что она была отпралена?
13 окт 2020 в 12:11
@MrSilentBeast обновил ответ по вашему обновленному вопросу
13 окт 2020 в 16:41
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Сначала делай проверку
if (isset($_POST['submit'] < // пришли данные из формы
а потом проверяй их.
Зачем в мыле две точки должны быть? Одной достаточно.
UPD: форму отправляй методом POST
Отслеживать
ответ дан 13 окт 2020 в 12:02
975 6 6 серебряных знаков 18 18 бронзовых знаков
А если посмотреть внимательно на код в вопросе?
13 окт 2020 в 12:09
У него отправка формы через GET запрос
13 окт 2020 в 12:10
да, спасибо, не заметил )
13 окт 2020 в 13:44
Снова смотри на код и ищи, что ещё ты не заметил, из-за чего твоя проверка никогда не сработает
13 окт 2020 в 13:50
@Ипатьев умник иди от сюда )) Сработает такая проверка. Если поменять на GET и поставить ее первой
13 окт 2020 в 16:28
Наверное, надо, проверить - была ли отправлена форма?
Вообще, формы, которые отправляют какую-либо информацию на сайт, а не запрашивают её с сайта, отправляются методом POST, а не GET.
Поэтому в общем случае проще всего проверить либо if ($_SERVER['REQUEST_METHOD'] === POST) , либо просто if($_POST) .
В случае же, когда форма отправлена методом GET, или на странице есть несколько форм, и надо понять, какая именно была отправлена, то имеет смысл проверить наличие одного из полей, например if (isset($_POST['firstname'])) .
Кроме того надо помнить несколько важных вещей про отправку форм
- если форма была отправлена методом POST, то после успешной обработки всегда обязательно должен быть сделан редирект, с помощью функции header() . Можно на ту же самую страницу, или любую другую, но редирект обязателен
- по этой причине обработка формы должна идти в файле ДО вывода формы, а не после
Отслеживать
ответ дан 13 окт 2020 в 12:42
20.4k 3 3 золотых знака 27 27 серебряных знаков 49 49 бронзовых знаков
"должен быть сделан редирект, с помощью функции header()" - дичь. Форма приходит сюда же, если form action=""
13 окт 2020 в 13:43
Господи, при чем здесь то куда приходит форма, если речь идет о том что происходит уже после её обработки?
13 окт 2020 в 13:49
Нутк, наведите сначала порядок в своих мыслях, прежде чем ими делиться
13 окт 2020 в 13:53
согласен, отправка не очень удачное слово, заменил на обработку
13 окт 2020 в 14:18
трудно с такими разговаривать. сними корону, всё равно видно, что ты сам её на себя нацепил. послать бы найух, но воспитание не позволяет.
Смс проверка при регистрации
Здравствуйте уважаемые форумчане!
Помогите, плиз, модернизировать сайт.
Планирую запустить сайт, но хочу сделать чтобы при регистрации проверялся номер телефона как в контакте.
Планируемый алгоритм такой. Пользователь вводит свои данные - почту, имя, фамилию и тд. (это уже есть) и в конце регистрации я хочу прикрутить форму для ввода номера телефона с последующей проверкой подлинности номера. Сначала скрипт должен проверить есть ли в базе данных введенный номер, если нет то отправляем смс с паролем. Пользователь получает код в смс и вводит в форму, проверяем код и если правильно то поздравляем с регистрацией.
Посоветуйте пожалуйста смс сервис представляющий подобные услуги (работающий с украинскими операторами, остальные страны не принципиально), и подскажите наброски кода php для осуществления данной задачи.
Но вообще то задача состоит в том чтобы на сайте регистрировалось поменьше спамеров и т.д, как еще можно с ними бороться кроме смс и проверки "мыла"? И что самое ефективное?
Буду признателен за любую подсказку по данной теме.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Как создать смс активацию профиля при регистрации?
У меня не получилось. Цель - пользователь вводит номер телефона, на нее поступает смс с кодом.
Проверка при регистрации логина
Немогу искать и пробовать, устал. Хочу зделать проверку логина при регистрации, лазил по всему.

Проверка ника при регистрации
Вопрос 1: Здравствуйте, подскажите как сделать проверку на существующий ник, например если.
Регистрация: 23.07.2012
Сообщений: 76
Bond 17, сервис smscoin вам не подходит?
p.s. самый лучший на мой взгляд способ борьбы со спамерами - это контрольный вопрос, ну не 2+2, а например как называется наша планета (ответ: Земля). Поставил на своем сайте - спам прекратился.
