Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

devhoussam123's avatar

Laravel Breez and Spatie Permissions set role while user registered

I'm using laravel Breez as Auth scaffolding package by laravel and I setup laravel permissions by spatie.

I have created two registration forms one for "Writer" and other for "Publisher" all registration views are located in RegisteredUserController

app\Http\Controllers\Auth\RegisteredUserController.php

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Models\Frontend\User;
use App\Providers\RouteServiceProvider;
use Illuminate\Auth\Events\Registered;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;

class RegisteredUserController extends Controller
{
    /**
     * Display the registration view for writer.
     *
     * @return \Illuminate\View\View
     */
    public function createWriter()
    {
        return view('auth.writer.writer-space');
    }
    
    /**
     * Display the registration view for publisher.
     *
     * @return \Illuminate\View\View
     */
    public function createPublisher()
    {
        return view('auth.publisher.publisher-space');
    }

    /**
     * Handle an incoming registration request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\RedirectResponse
     *
     * @throws \Illuminate\Validation\ValidationException
     */
    public function store(Request $request)
    {
        $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|confirmed|min:8',
        ]);

        Auth::login($user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => Hash::make($request->password),
        ]));

        event(new Registered($user));

        return redirect(RouteServiceProvider::HOME);
    }
}

as you can see in this controller I have two registration view for two type of users "Writer" and "Publisher".

What I want to do is to Set the role of the users while registration based on this two types "Writer" and "Publisher" Roles using laravel-permission by spatie.

app\routes\auth.php

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Auth\RegisteredUserController;

Route::get('/publisher-space', [RegisteredUserController::class, 'createPublisher'])->middleware('guest')->name('publisher-space');

Route::get('/writer-space', [RegisteredUserController::class, 'createWriter'])->middleware('guest')->name('writer-space');
0 likes
2 replies
fylzero's avatar

@devhoussam123 Just use this in your controller logic...

$user->assignRole('writer');

...assuming you have the roles created in the Spatie package.

1 like
devhoussam123's avatar

Call to undefined method App\Models\Frontend\User::intersect()

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Models\Frontend\User;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
use App\Providers\RouteServiceProvider;
use Illuminate\Auth\Events\Registered;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;

class RegisteredUserController extends Controller
{
    /**
     * Display the registration view for student.
     *
     * @return \Illuminate\View\View
     */
    public function createStudent()
    {
        return view('auth.student.student-space');
    }
	
    /**
     * Display the registration view for teacher.
     *
     * @return \Illuminate\View\View
     */
    public function createTeacher()
    {
        return view('auth.teacher.teacher-space');
    }

    /**
     * Handle an incoming registration request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\RedirectResponse
     *
     * @throws \Illuminate\Validation\ValidationException
     */
    public function store(Request $request)
    {
        $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|confirmed|min:8',
        ]);

        Auth::login($user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => Hash::make($request->password),
        ]));
		
		// Create roles
		
		$create_sponsor_role = Role::create(['name' => 'student']);
		$create_project_role = Role::create(['name' => 'teacher']);
		
		// Assign roles
		
		$sponsor_role = $user->assignRole('student');
		$project_role = $user->assignRole('teacher');
		
		// Check if it's correct roles
		
		if($user->hasRole($sponsor_role)) {
			return redirect()->intended('/student/dashboard');
		}
		
		if ($user->hasRole($project_role)) {
			return redirect()->intended('/teacher/dashboard');
		}
		
		event(new Registered($user));
    }
}

Please or to participate in this conversation.