Php 如何在laravel中拆分两个用户?
我已经尝试了很多方法,但不是如何我不能做的路线和重定向正确。我希望,如果管理员进来,他们会重新定向到仪表板,如果这只是一个用户,则返回主页。我没有办法做这件事了。请帮帮我 角色\用户\表Php 如何在laravel中拆分两个用户?,php,laravel,Php,Laravel,我已经尝试了很多方法,但不是如何我不能做的路线和重定向正确。我希望,如果管理员进来,他们会重新定向到仪表板,如果这只是一个用户,则返回主页。我没有办法做这件事了。请帮帮我 角色\用户\表 public function up() { Schema::create('role_user', function (Blueprint $table) { $table->integer('role_id'); $table-&
public function up()
{
Schema::create('role_user', function (Blueprint $table) {
$table->integer('role_id');
$table->integer('user_id');
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->primary(['user_id', 'role_id']);
});
}
角色表
1.管理
2.注册用户
public function up()
{
Schema::create('roles', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
});
}
用户表
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->tinyInteger('role_id')->unsigned()->nullable();
$table->string('name');
$table->string('email');
$table->string('password');
$table->rememberToken();
$table->timestamps();
$table->foreign('role_id')->references('id')->on('roles');
});
中间件
namespace App\Http\Middleware;
use Closure;
class CheckIfAdmin{
public function handle($request, Closure $next)
{
$user = $request->user();
if (!isset($user)) {
return redirect('admin/login');
}
if (!$user->isAdmin()) {
return redirect('/');
}
return $next($request);
}
}
Kernel.php
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'admin' => \App\Http\Middleware\CheckIfAdmin::class,
];
Role.php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
protected $fillable = ['name'];
public $timestamps = false;
public function users()
{
return $this->hasMany(User::class);
}
}
User.php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use App\Role;
class User extends Authenticatable
{
use Notifiable;
protected $fillable = [
'name', 'email', 'password',
];
protected $hidden = [
'password', 'remember_token',
];
public function roles()
{
return $this->belongsToMany(Role::class);
}
public function isAdmin()
{
return (boolean)$this->roles->where('name', 'admin')->count();
}
}
web.php
Route::group(['prefix'=>'admin', 'namespace'=>'Admin', 'middleware'=>
['auth']], function(){
Route::resource('/category', 'CategoryController', ['as'=>'admin']);
Route::resource('/article', 'ArticleController', ['as'=>'admin']);
Route::group(['prefix' => 'user_managment', 'namespace' =>
'UserManagment'], function() {
Route::resource('/user', 'UserController', ['as' =>
'admin.user_managment']);
});
Route::group(['middleware' => 'admin'], function() {
Route::get('/', 'DashboardController@dashboard')-
>name('admin.index');
});
});
Route::get('/', function () {
return view('blog.home');
});
Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');
现在,如果管理员在url管理行中注册,他就会转到管理员,如果一个简单的用户这样做,他不会错过它,但我需要他自动打开仪表板。dashboard位于admin文件夹中,因为您已经编写了大部分代码,这应该可以工作:
Route::group(['prefix'=>'admin', 'namespace'=>'Admin', 'middleware'=>['admin']], function(){
Route::get('/', 'DashboardController@dashboard')->name('admin.index');
Route::resource('/category', 'CategoryController', ['as'=>'admin']);
Route::resource('/article', 'ArticleController', ['as'=>'admin']);
Route::group(['prefix' => 'user_managment', 'namespace' => 'UserManagment'], function() {
Route::resource('/user', 'UserController', ['as' => 'admin.user_managment']);
});
});
Route::get('/', function () {
return view('blog.home');
}); // Not sure if you want this behind the middleware or not
Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');
我会在您的中间件中更改这一行:
if (!$user->isAdmin()) {
return redirect('/home');
}
因此,根据您的评论,非管理员使用将重定向到/home
。这里不需要使用Auth
和admin
中间件,因为admin
将处理非管理员用户。它应该允许所有管理员到达封装在admin
中间件中的组,并将非管理员重定向到/home
路由。让我知道这是否是你一直在寻找的,或者我是否可以为你完善这一点
对于重定向问题:
签出:您可以更改protected$redirectTo='admin'代码>到函数:公共函数重定向到(){}
。结果会是:
public function redirectTo(){
// User role
$role = Auth::user()->role->pluck('name')->toArray();
if(in_array('admin', $role)){
return '/admin/login';
}else{
return '/home';
}
}
我看不到在路由或控制器中使用admin
中间件。它在哪里使用?如果您正在使用pivot,为什么用户有一个role\u id字段?为什么角色与用户的关系不使用pivot?@NMahurin所以我不知道如何进行检查并正确登录到管理员。我需要的一切,以显示在管理,并为一个简单的用户只homeI更新的问题,请参阅。使用您的方法,当我退出面板时,不会立即找到页面。在我的,我补充说,一切都很好,但它需要扔到仪表板上的权利。php仪表板位于管理员文件夹中。我不确定退出面板时@NikitaKurilovic的意思是什么?找不到哪个页面?你能显示你的身份验证控制器吗?使用你的代码,点击用户出口,我被抛出很抱歉这个页面没有found@NikitaKurilovic注销方法不在任何中间件后面。我猜您的注销方法指向'/'
,这就是注释的目的。只需删除->Route::get('/',function()…
部分的->中间件('admin')
部分。查看编辑。它起作用了。现在是最后一个。如果是admin,则是dashboard,如果是简单用户,则是home。我将控制器放在登录名“`protected$redirectTo='admin'”;``中,但这是针对每个人的,但我只需要管理员