由于以下问题,无法验证电子邮件验证测试: 缺少 [Route: verify.verify] [URI: {lang}/verify-email/{id}/{hash}] [缺少参数:lang] 的必需参数。
我在我的应用程序中实现了一种多语言方法。所以我通过中间件传递语言环境。我已经改变了我的所有观点,以考虑到语言环境 app()->getLocale() 等。
我在我的 web.php 中添加了 Route::Group,如下所示:
<?php
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Auth;
Route::redirect('/', 'en', 301);
Route::group(['prefix' => '{lang}','where' => ['lang' => '[a-zA-Z]{2}'],'middleware' => 'setlanguage'], function() {
Route::get('/','App\Http\Controllers\welcomeController@index')->name('welcome');
Auth::routes();
require __DIR__.'/auth.php';
Route::get('/dashboard', function () {
return view('dashboard');
})->middleware(['auth'])->name('dashboard');
Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
});
如您所见,我正在调用 auth.php,其中包含我的电子邮件验证控制器的路由:
<?php
use App\Http\Controllers\Auth\EmailVerificationNotificationController;
use App\Http\Controllers\Auth\EmailVerificationPromptController;
use App\Http\Controllers\Auth\VerifyEmailController;
use Illuminate\Support\Facades\Route;
Route::get('/verify-email', [EmailVerificationPromptController::class, '__invoke'])
->middleware('auth')
->name('verification.notice');
Route::get('/verify-email/{id}/{hash}', [VerifyEmailController::class, '__invoke'])
->middleware(['auth', 'signed', 'throttle:6,1'])
->name('verification.verify');
Route::post('/email/verification-notification', [EmailVerificationNotificationController::class, 'store'])
->middleware(['auth', 'throttle:6,1'])
->name('verification.send');
这是我的 EmailVerificationTest.php,其中第二次和第三次测试失败:
<?php
namespace Tests\Feature;
use App\Models\User;
use App\Providers\RouteServiceProvider;
use Illuminate\Auth\Events\Verified;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\URL;
use Tests\TestCase;
class EmailVerificationTest extends TestCase
{
use RefreshDatabase;
public function test_email_verification_screen_can_be_rendered()
{
$user = User::factory()->create([
'email_verified_at' => null,
]);
$response = $this->actingAs($user)->get('/en/verify-email');
$response->assertStatus(200);
}
public function test_email_can_be_verified()
{
Event::fake();
$user = User::factory()->create([
'email_verified_at' => null,
]);
$verificationUrl = URL::temporarySignedRoute(
'verification.verify',
now()->addMinutes(60),
['id' => $user->id, 'hash' => sha1($user->email)]
);
$response = $this->actingAs($user)->get($verificationUrl);
Event::assertDispatched(Verified::class);
$this->assertTrue($user->fresh()->hasVerifiedEmail());
$response->assertRedirect(RouteServiceProvider::HOME.'?verified=1');
}
public function test_email_is_not_verified_with_invalid_hash()
{
$user = User::factory()->create([
'email_verified_at' => null,
]);
$verificationUrl = URL::temporarySignedRoute(
'verification.verify',
now()->addMinutes(60),
['id' => $user->id, 'hash' => sha1('wrong-email')]
);
$this->actingAs($user)->get($verificationUrl);
$this->assertFalse($user->fresh()->hasVerifiedEmail());
}
}
如果我取出 Auth:routes() 并要求 DIR.'/auth.php' 从 Route::Group 外部,它会工作,但它不会在其路由中考虑区域设置我想保留。
关于如何在保持语言环境的同时检查上述测试的任何想法。
谢谢。