我开发了两个API的注册和登录,现在我想在用户注册成功时开发一个验证电子邮件,注册用户会收到一封验证电子邮件为此我开发了一个功能我在用户注册时没有收到任何电子邮件我无法找出我错在哪里请帮我解决这个问题
UserController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use App\Models\User;
use Illuminate\Support\Str;
use Tymon\JWTAuth\Facades\JWTAuth;
use Tymon\JWTAuth\Exceptions\JWTException;
use App\Models\PasswordReset;
use App\Notifications\ResetPasswordNotification;
class UserController extends Controller
{
public function __construct() {
$this->middleware('auth:api', ['except' => ['login', 'register']]);
}
public function register(Request $request)
{
$this->validate($request, [
'fullName'=>'required|string|between:3,15',
'email'=>'required|email|unique:users',
'password'=>'required|regex:/^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{6,}$/',
'mobile'=>'required|digits:10'
]);
$user = new User([
'fullName'=> $request->input('fullName'),
'email'=> $request->input('email'),
'password'=> bcrypt($request->input('password')),
'mobile'=>$request->input('mobile')
]);
$user->save();
$input["created_at"] = now();
$input['verifytoken'] =Str::random(60);
// User::create($request->getAttributes())->sendEmailVericationNotification();
return response()->json(['message'=>'Successfully Created user'],201);
}
public function login(Request $request)
{
$this->validate($request, [
'email' => 'required|email',
'password' => 'required'
]);
$credentials = $request->only('email', 'password');
try {
if (!$token = JWTAuth::attempt($credentials)) {
return response()->json(['error' => 'Invalid Credentials'], 401);
}
}catch (JWTException $e) {
return response()->json(['error' => 'Could not create token'],500);
}
return response()->json(['token' => $token], 200);
}
public function verifyEmail()
{
$id = request('id');
$token = request('token');
$user = User::where("verifytoken", $token)->first();
// $user = User::where("email", $email)->first();
if (!$user) {
return response()->json(['message' => "Not a Registered Email"], 200);
} else if ($user->email_verified_at === null) {
$user->email_verified_at = now();
$user->save();
return response()->json(['message' => "Email Successfully Verified"], 201);
} else {
return response()->json(['message' => "Email Already Verified"], 202);
}
}
}
User.php[user-model]
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Notifications\Notifiable;
use Tymon\JWTAuth\Contracts\JWTSubject;
use App\Notifications\ResetPasswordNotification;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable implements JWTSubject,MustVerifyEmail
{
use HasFactory, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'fullName',
'email',
'password',
'mobile',
'verifytoken'
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password',
'remember_token',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
/**
* Get the identifier that will be stored in the subject claim of the JWT.
*
* @return mixed
*/
public function getJWTIdentifier() {
return $this->getKey();
}
/**
* Return a key value array, containing any custom claims to be added to the JWT.
*
* @return array
*/
public function getJWTCustomClaims() {
return [];
}
public function sendPasswordResetNotification($token)
{
$this->notify(new ResetPasswordNotification($token));
}
}
User migration table
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('fullName');
$table->string('email')->unique();
$table->string('mobile')->unique();
$table->string('email_verified_at')->nullable();
$table->string('password');
$table->string('verifytoken')->nullable();
$table->rememberToken();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('users');
}
}
VerificationMail.php[it's under Notifications]
<?php
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
class VerificationMail extends Notification
{
use Queueable;
public $email;
public $token;
/**
* Create a new notification instance.
*
* @return void
*/
public function __construct(string $email, string $token)
{
//
$this->email = $email;
$this->token = $token;
}
/**
* Get the notification's delivery channels.
*
* @param mixed $notifiable
* @return array
*/
public function via($notifiable)
{
return ['mail'];
}
/**
* Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($notifiable)
{
$url = "/api/verifyemail/$this->token";
return (new MailMessage)
->line('Welcome to BookStore, I am Aman Verma')
->line('Please Verify your email to get started with us')
->action('Verification Email', url($url))
->line('Thank you for using our application!');
}
/**
* Get the array representation of the notification.
*
* @param mixed $notifiable
* @return array
*/
public function toArray($notifiable)
{
return [
//
];
}
}
api.php
Route::group([
'middleware' => 'api',
'prefix' => 'auth'
], function ($router) {
Route::post('/login', [UserController::class, 'login']);
Route::post('/register', [UserController::class, 'register']);
Route::post('verifyemail/{token}','VerificationController@verifyEmail');
Route::post('/sendPasswordResetLink', 'App\Http\Controllers\PasswordResetRequestController@forgotPassword');
Route::post('/resetPassword', 'App\Http\Controllers\ChangePasswordController@resetPassword');
Route::get('/email/verify/{id}',[VerificationController::class,'verify']);
});
答案 0 :(得分:1)
在您的用户模型中,您需要从 MustVerifyEmail.php trait 中覆盖这个内置函数。
// User.php
...
/**
* Send the email verification notification.
*
* @return void
*/
public function sendEmailVerificationNotification()
{
//replace with your verification email
$this->notify(new VerifyEmail);
}