Search code examples
laravellaravel-5laravel-authorization

Laravel Email Confirmation On Registration


I need to send an email after a new user is created.

But I don't know how to return to the home page without getting an error. This is what I am doing right now.

User::create([
            'name' => $data['name'],
            'username' => $data['username'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
            'phone' => bcrypt($data['phone']),
            'confirmation_code' => str_random(30),
        ]);

Email_function();

if (Auth::attempt(['email' => $data['email'], 'password' => bcrypt($data['password']) ])) {
        // Authentication passed...
        return redirect('/');
    }

I keep getting this as my error message.

SErrorException in SessionGuard.php line 439:
Argument 1 passed to Illuminate\Auth\SessionGuard::login() must implement interface Illuminate\Contracts\Auth\Authenticatable, null given, called in /Applications/XAMPP/xamppfiles/htdocs/sniddl/vendor/laravel/framework/src/Illuminate/Foundation/Auth/RegistersUsers.php on line 63 and defined

Edit: changed the title to reflect the answer.


Solution

  • Here is a modified create function with an added email function for your register controller

    Make sure Request is included in the pages top with namespaces being used:

    use Illuminate\Http\Request;
    

    Change the create function in your controller:

    protected function create(Request $data)
    {
    
    
        $user                       = new User;
        $user->name                 = $data->input('name');
        $user->username             = $data->input('username');
        $user->email                = $data->input('email');
        $user->password             = bcrypt($data->input('password'));
        $user->phone                = bcrypt($data->input('phone'));
        $user->confirmation_code    = str_random(60);
        $user->save();
    
        if ($user->save()) {
    
            $this->sendEmail($user);
    
            return redirect('VIEWPATH.VIEWFILE')->with('status', 'Successfully created user.');
    
        } else {
    
            return redirect('VIEWPATH.VIEWFILE')->with('status', 'User not created.');
    
        }
    
    }
    

    Create the sendEmail function in the same controller that will use Laravels built in email. Make sure you create and your HTML email:

    public function sendEmail(User $user)
    {
        $data = array(
            'name' => $user->name,
            'code' => $user->confirmation_code,
        );
        \Mail::queue('EMAILVIEWPATH.HTMLEMAILVIEWFILE', $data, function($message) use ($user) {
            $message->subject( 'Subject line Here' );
            $message->to($user->email);
        });
    }
    

    NOTE: Your going to need to update the VIEWPATH.VIEWFILE and EMAILVIEWPATH.HTMLEMAILVIEWFILE at a minimium in the examples above.

    Check the repos below for CONTROLLER : https://github.com/laravel/laravel/blob/master/app/Http/Controllers/Auth/RegisterController.php https://github.com/jeremykenedy/laravel-auth/blob/master/app/Http/Controllers/Auth/AuthController.php

    REGISTER VIEW(blade) EXAMPLE https://github.com/jeremykenedy/laravel-auth/blob/master/resources/views/auth/register.blade.php

    EMAIL VIEW THAT RECEIVES VARIABLES: https://github.com/jeremykenedy/laravel-auth/blob/master/resources/views/emails/activateAccount.blade.php