/**
  * Potwierdzenie adresu e-mail poprzez link aktywacyjny znajdujacy sie w mailu
  *
  * @return \Illuminate\Http\Response
  */
 public function email()
 {
     $actkey = Actkey::where('user_id', request('id'))->where('actkey', request('actkey'))->firstOrFail();
     $user = User::find(request('id'));
     $user->is_confirm = 1;
     if ($actkey->email) {
         $user->email = $actkey->email;
     }
     $user->save();
     $actkey->delete();
     return redirect(route('home'))->with('success', 'Adres e-mail został pozytywnie potwierdzony');
 }
 /**
  * @param UserSettingsRequest $request
  * @return \Illuminate\Http\RedirectResponse
  */
 public function save(UserSettingsRequest $request)
 {
     $user = auth()->user();
     if ($user->email !== $request->get('email')) {
         $email = $request->get('email');
         // kasujemy poprzednie rekordu zwiazane z tym userem
         Actkey::where('user_id', $user->id)->delete();
         // przed zmiana e-maila trzeba wyslac link potwierdzajacy
         $actkey = Actkey::create(['actkey' => str_random(), 'user_id' => $user->id, 'email' => $email]);
         // taki format linku zachowany jest ze wzgledu na wsteczna kompatybilnosc.
         // z czasem mozemy zmienic ten format aby wskazywal na /User/Confirm/Email/<id>/<actkey>
         $url = route('user.email') . '?id=' . $user->id . '&actkey=' . $actkey->actkey;
         Mail::queue('emails.email', ['url' => $url], function ($message) use($email) {
             $message->to($email);
             $message->subject('Prosimy o potwierdzenie nowego adresu e-mail');
         });
         if ($user->is_confirm) {
             $request['email'] = $user->email;
         }
     }
     User::find($user->id)->fill($request->all())->save();
     return back()->with('success', 'Zmiany zostały poprawie zapisane');
 }
 /**
  * Obsluga formularza rejestracji uzytkownika
  *
  * @param  \Illuminate\Http\Request  $request
  * @return \Illuminate\Http\Response
  */
 public function signup(Request $request)
 {
     $this->validate($request, ['name' => 'required|min:2|max:28|username|unique:users', 'email' => 'required|email|max:255|unique:users', 'password' => 'required|confirmed|min:3', 'human' => 'required']);
     DB::beginTransaction();
     try {
         $email = $request->input('email');
         $user = User::create(['name' => $request->input('name'), 'email' => $email, 'password' => bcrypt($request->input('password'))]);
         $actkey = Actkey::create(['actkey' => str_random(), 'user_id' => $user->id]);
         // taki format linku zachowany jest ze wzgledu na wsteczna kompatybilnosc.
         // z czasem mozemy zmienic ten format aby wskazywal na /User/Confirm/Email/<id>/<actkey>
         $url = route('user.email') . '?id=' . $user->id . '&actkey=' . $actkey->actkey;
         Mail::queue('emails.signup', ['url' => $url], function ($message) use($email) {
             $message->to($email);
             $message->subject('Dziękujemy za rejestrację. Potwierdź autentyczność swojego adresu e-mail');
         });
         Auth::login($user, true);
         stream(Stream_Create::class, new Stream_Person());
         DB::commit();
     } catch (\Exception $e) {
         DB::rollBack();
         throw $e;
     }
     return redirect()->intended(route('home'));
 }
<?php

use Coyote\Actkey;
$I = new FunctionalTester($scenario);
$I->wantTo('confirm my email address');
$userId = 100001;
$actkey = 'randomstring';
$I->haveRecord('users', ['id' => $userId, 'name' => 'Joe Doe', 'email' => '*****@*****.**', 'password' => bcrypt('123'), 'created_at' => new DateTime(), 'updated_at' => new DateTime(), 'is_confirm' => 0]);
// uzywamy modelu poniewaz w tabeli nie ma klucza "id"
Actkey::create(['actkey' => $actkey, 'user_id' => $userId]);
$I->amOnPage("/User/Confirm/Email?id={$userId}&actkey={$actkey}");
$I->see('Adres e-mail został pozytywnie potwierdzony');
$I->dontSeeRecord('actkeys', ['actkey' => $actkey, 'user_id' => $userId]);