【问题标题】:users and roles tables relationship through middleware parameter laravel 5.1通过中间件参数laravel 5.1的用户和角色表关系
【发布时间】:2016-04-07 05:32:44
【问题描述】:

我正在使用 laravel 5.1 开发一个用户管理网站。

不允许用户注册,但他们可以查看他们的个人资料。注册只能由管理员完成,所以我有两种类型的用户(管理员和普通用户)。

我正在学习本教程: https://www.youtube.com/watch?v=8AQLUZ0X9ME 在我到达用户模型之前一切都很好

用户表:

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password', 60);
            $table->rememberToken();
            $table->softDeletes();
            $table->integer('role_id')->unsigned();
            $table->timestamps();
        });

角色表:

public function up()
    {
        Schema::create('roles', function (Blueprint $table) {
            $table->increments('id');
            $table->string('role_name');
            //
        });
    }

榜样:

class Role extends Model
{
    protected $table = 'roles';
    protected $fillable = ['role_name'];

    public function users()
    {
        return $this->hasMany('App\User');
    }

用户模型:

    public function role(){
        return $this->belongsTo('App\Role','role_id');
    }

    public function hasRole($title){
        $user_role = $this->role();
        if(!is_null($user_role)){
            $user_role = $user_role->role_name; //here is the problem with role_name

        }
        return ($user_role===$title)?true:false;
    }

在 PHPStorm 中,role_name 以黄色突出显示,并表示

在类中找不到字段“role_name” \Illuminate\Database\Eloquent\Relations\BelongsTo less... (Ctrl+F1) 在主题类中找不到引用的字段。注意:检查不是 对“stdClass”或派生类型的对象执行。

我创建了 3 个中间件 Update、Create 和 Delete,它们都有相同的句柄函数:

public function handle($request, Closure $next, $Admin)
    {
        $User = $request->user();
        return ($User->hasRole($Admin))?$next($request):response(view('errors.401'),401);

    }

路线文件:

Route::get('/users','UserController@index');
Route::post('/users/create',['middleware'=>'create:Admin','uses'=>'UserController@store']);
Route::patch('/users/{id}',['middleware'=>'update:Admin','uses'=>'UserController@update']);
Route::delete('/users/{id}',['middleware'=>'delete:Admin','uses'=>'UserController@destroy']);

每当我打开创建页面时,我都会收到此错误:

“C:\wamp\www\laravelU\project 中的ErrorException - Copy5\app\User.php 第 42 行:未定义的属性: Illuminate\Database\Eloquent\Collection::$role_name"

我已经处理这个代码 3 个晚上我需要你的帮助。 是否有任何更简单的方法可以在不使用包的情况下实现我的目标?

【问题讨论】:

  • 第42行是哪一行??
  • 用户模型:$user_role = $user_role->role_name; //这是role_name的问题

标签: laravel laravel-5.1


【解决方案1】:

您在尝试$user_role->role_name 时遇到错误的原因是您在技术上是在BelongsTo 类中寻找属性role_name

当尝试访问 eloquent 模型的关系时,您可以将其用作动态属性,即

$user_role = $this->role;

$user_role = $this->role()->get();

因此,您可以将 hasRole 方法更改为:

public function hasRole($title){

    if(is_null($this->role)){
        return false;
    }

    return $this->role->role_name === $title;
}

您的应用程序抛出 MethodNotAllowedHttpException 的原因是因为您试图通过 GET 请求访问 POST 路由。 (任何时候你使用网络浏览器导航到一个页面,它都会是一个GET 请求)。

您应该做的是将Route::post('create' ... 更改为Route::get('create'... 广告添加类似Route::post('store' 的内容以提交。

看看https://laravel.com/docs/5.1/controllers#restful-resource-controllers

其次,如果它们只是检查用户是否是管理员,则不需要 3 个不同的中间件类。

最后,看看https://laravel.com/docs/5.1/validation#form-request-validation(包括Authorizing 部分)

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    谢谢罗斯! 这是我编辑后的路线:

    Route::get('/users','UserController@index');
    Route::get('/users/create',['middleware'=>'create:Admin','uses'=>'UserController@create']);
    Route::post('/users/create',['middleware'=>'create:Admin','uses'=>'UserController@store']);
    Route::patch('/users/{id}',['middleware'=>'update:Admin','uses'=>'UserController@update']);
    Route::delete('/users/{id}',['middleware'=>'delete:Admin','uses'=>'UserController@destroy']);
    

    当我打开浏览器并尝试访问创建页面时出现此错误:

    “C:\wamp\www\laravelU\project 中的ErrorException - Copy5\app\User.php 第 42 行:未定义的属性: Illuminate\Database\Eloquent\Collection::$role_name"

    将来,我将添加一个角色,例如无法删除用户的管理员。所以我觉得使用多个中间件更容易,但 $role_name 让我很生气!

    【讨论】:

    • 从技术上讲,这是一个不同的问题,实际上我应该要求您创建一个新问题,但是,如果您编辑当前问题(不是答案)并添加包含 @987654322 的第 42 行的方法@我可以帮你。
    猜你喜欢
    • 2015-12-09
    • 2015-05-18
    • 2016-04-25
    • 1970-01-01
    • 2017-04-16
    • 2017-05-17
    • 2018-05-09
    • 2019-09-23
    • 2016-07-23
    相关资源
    最近更新 更多