我使用 Laravel Breeze 作为 Auth 脚手架包以及 Spatie 的 Laravel Permissions。我创建了两个注册表单,一个用于“学生”,另一个用于“教师”,所有注册视图都位于 RegisteredUserController 中。
app\Http\Controllers\Auth\RegisteredUserController.php
select
SUBSTRING(extension,1,5),
count(*) NumRecordsWithThisExtension
from
tbl1
GROUP BY
SUBSTRING(extension,1,5);
正如你在这个控制器中看到的,我有两种类型的用户“学生”和“教师”的两个注册视图。
我想要做的是在注册时基于这两种类型“学生”和“教师”使用laravel设置用户的角色 -spatie 的许可。
app\routes\auth.php
<?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 createSudent()
{
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']);
// Assigning roles
$user->assignRole(['student', 'teacher']);
// Check if it's correct roles
if($user()->hasRole('sponsor')) {
return redirect()->intended('/student/dashboard');
}
if ($user()->hasRole('project')) {
return redirect()->intended('/teacher/dashboard');
}
else {
return redirect('/signin');
}
event(new Registered($user));
}
}
答案 0 :(得分:0)
这里我解释了一个简单的设置:
如果您使用 spatie laravel 权限。首先,您需要在数据库中拥有一些角色。它可以通过编写一个 crud 并在管理面板中控制它或在数据库中播种来实现。我在这里为它写种子。
对于您的情况,我创建了 writer 和 publisher 两个角色:
php artisan make:seeder RoleTableSeeder
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
public function run()
{
$this->call(RoleTableSeeder::class);
}
}
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class RoleTableSeeder extends Seeder
{
public function run()
{
$writerRole = Spatie\Permission\Models\Role::create([
'name' => 'writer'
]);
$publisherRole = Spatie\Permission\Models\Role::create([
'name' => 'publisher'
]);
}
}
php artisan db:seed
您应该像您在问题中所做的那样将您的用户引导到正确的视图刀片。
角色必须在创建后分配给用户。这里需要一个逻辑来区分是作家还是出版商?我建议在您的表单中为角色添加一个隐藏的输入。如果是这样,您可以指定例如 writer 角色并使用 required_if
此处解释的方法根据需要创建一些字段。
你应该在创建后给用户一个角色。
use Illuminate\Validation\Rule;
public function store(Request $request)
{
$request->validate([
'name' => 'required|string|max:255',
'custom_field' => [Rule::requiredIf($request->role)],
'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),
]));
$role = $request->get('role')
? Spatie\Permission\Models\Role::findByName('writer')
: Spatie\Permission\Models\Role::findByName('publisher');
$user->assignRole($role);
event(new Registered($user));
return redirect(RouteServiceProvider::HOME);
}