После того, как пользователь зарегистрируется и подтвердит свою электронную почту, он должен завершить регистрацию с дополнительной информацией. Это происходит в /register/complete-signup
. Эта проблема для меня абсолютно бессмысленна.
По какой-то причине, когда я добавил свое Middleware has-not-completed-signup
, тест начинает давать сбой, потому что приложение \ Пользователь нет больше ассоциируется приложение \ учетная запись, которая происходит в контроллере через attach()
Как только я удаляю промежуточное ПО из маршрута, он работает нормально.
Мое промежуточное программное обеспечение предназначено для того, чтобы пользователь, который уже прошел регистрацию, не посетил или не разместил сообщения на этих маршрутах. Я протестировал в браузере и редирект работает. Метод контроллера используется в тесте, и я могу dd($account->users)
и получить правильный ответ. Но если я сделаю $user->accounts
, коллекция будет пустой.
После удаления промежуточного программного обеспечения $user->accounts
больше не будет пустым. Но я сделал dd()
внутри своего промежуточного программного обеспечения, и оно даже не работает (что правильно, потому что у пользователя нет учетной записи).
Так с чего бы это не получилось? Я полностью потерян.
Я попытался включить всю необходимую информацию ниже. Если вам нужно что-то еще, пожалуйста, дайте мне знать.
Редактировать:
В моем промежуточном программном обеспечении я прокомментировал функциональность. Что-то в проверке красноречивых отношений заставляет меня проваливать тест. Я понятия не имею, почему.
Это делает тест неудачным:
if (!auth()->user()->accounts->isEmpty()) {
//return redirect(RouteServiceProvider::HOME);
}
Если, например, я заменяю его на что-то бесполезное, как это, это работает:
if (auth()->user()) {
//return redirect(RouteServiceProvider::HOME);
}
Я могу сделать $account->users
, но $user->accounts
возвращает пустую коллекцию на контроллере, когда я использую свое промежуточное ПО
Оригинал:
Вот мои маршруты:
// auth scaffolding
Auth::routes(['verify' => true]);
// main app routes
Route::middleware('verified', 'auth')->group(function() {
// User verified and has an App\Account
Route::middleware('completed-signup')->group(function() {
Route::get("/", 'HomeController@index' )->name('home');
Route::get('/paywall', 'BillingController@paywall')->name('paywall');
});
// The user hasn't attached an App\Account to their User
Route::middleware('has-not-completed-signup')->group(function() {
Route::get("/register/complete-signup", 'AccountController@showCompleteSignup' )->name('complete-signup');
Route::post('/register/complete-signup', 'AccountController@storeCompleteSignup')->name('complete-signup.store');
});
});
has-not-completed-signup
Промежуточное ПО:
public function handle($request, Closure $next)
{
if (auth()->user()->hasCompletedAccountSetup()) {
return redirect(RouteServiceProvider::HOME);
}
return $next($request);
}
Приложение / Пользовательский метод:
Class User extends Authenticatable implements MustVerifyEmail {
...
public function accounts() {
return $this->belongsToMany('App\Account', 'account_role_user')->withPivot('role_id');
}
public function hasCompletedAccountSetup() {
return !$this->accounts->isEmpty();
}
...
AccountController@storeCompletedSignup:
public function storeCompleteSignup(Request $request) {
$validatedData = $request->validate([
'company' => 'required|max:255',
'contact_state' => 'required|max:255',
'contact_country' => 'required|max:255',
'contact_zip' => 'required|max:255',
'contact_city' => 'required|max:255',
'contact_phone' => 'nullable|max:255',
'contact_address_1' => 'required|max:255',
'contact_address_2' => 'nullable|max:255',
'contact_first_name' => 'required',
'contact_last_name' => 'required',
'contact_email' => 'required'
]);
$user = auth()->user();
$account = new Account($validatedData);
$account->contact_first_name = $user->first_name;
$account->contact_last_name = $user->last_name;
$account->contact_email = $user->email;
$account->save();
$account->users()->attach(
$user->id,
['role_id' => Role::where('name', 'owner')->first()->id ]
);
return $request->wantsJson()
? new Response('Signup Completed Successfully', 201)
: redirect()->route('/');
}
Мой тест:
/**
* @test
*/
public function a_user_can_complete_signup()
{
$user = Factory('App\User')->create();
$this->actingAs($user);
$accountAttributes = factory('App\Account')->raw([
'contact_first_name' => "TEST",
'contact_last_name' => $user->last_name,
'contact_email' => $user->email,
'contact_country' => "USA"
]);
$res = $this->post('/register/complete-signup', $accountAttributes);
$res->assertSessionDoesntHaveErrors();
$this->assertTrue( !$user->accounts->isEmpty() ); // THIS FAILS
$this->assertTrue( $user->accounts->first()->company == $accountAttributes['company']);
$this->assertTrue( $user->accounts->first()->contact_first_name == $user->first_name );
}