Laravel所有者中间件无法正常工作

时间:2016-06-10 13:40:59

标签: laravel

我创建了一个中间件(app / Http / Middleware / AbortIfNotOwner.php),这是来自另一个Stackoverflow帖子的代码

<?php

namespace App\Http\Middleware;

use Closure;
use DB;

class AbortIfNotOwner
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string    $resourceName
     * @return mixed
     */

    public function handle($request, Closure $next, $resourceName)
    {
        $resourceId = $request->route()->parameter($resourceName);

        $user_id = \DB::table($resourceName)->find($resourceId)->user_id;

        if ($request->user()->id != $user_id) {
            abort(403, 'Unauthorized action.');
        }

        return $next($request);
    }
}

我在app \ Http \ Kernel.php

中注册
protected $routeMiddleware = [
     'owner' => 'App\Http\Middleware\AbortIfNotOwner',
];

在我的路线文件中我有:

Route::group(['middleware' => ['owner:bids']], function() {
        Route::get('user/{id}/bids', ['as' => 'buyer_bids', 'uses' => 'User\Buyer\BidsController@getBidsPerUser']);
    });

当我运行此代码时,我得到了一个

  

AbortIfNotOwner.php中的ErrorException第23行:尝试获取属性   非对象

这是指中间件中的以下几行:

> $resourceId = $request->route()->parameter($resourceName);
> $user_id = \DB::table($resourceName)->find($resourceId)->user_id;

我认为问题似乎是resourceId为null。我在出价表中有一个字段user_id,所以我不确定是什么问题。路线网址类似于/ user / 2 / bid。

编辑 - 已解决

我发现以下情况有效:

 $user_id = \DB::table($resourceName)->find($request->id)->user_id;

而不是

 $resourceId = $request->route()->parameter($resourceName);
 $user_id = \DB::table($resourceName)->find($resourceId)->user_id;

这适用于

等路线
  

路线::得到(&#39; / {ID} /出价&#39;

编辑 - 已解决 - 其他解决方案

$resourceId = $request->route()->parameter($resourceName);
$user_id = \DB::table($resourceName)->find($resourceId)->user_id;
如果路线更改为

将起作用

  

路线::得到(&#39; / {出价} /出价&#39;

...而不是

  

路线::得到(&#39; / {ID} /出价&#39; ...

2 个答案:

答案 0 :(得分:1)

更改您的路线Route::get('user/{bids}/bids'...,以获取路线参数,例如此$request->route()->parameter('name'),它必须与路线中的参数名称相匹配,这意味着加粗的一个用户/ {bid} < /强> /出价。

答案 1 :(得分:0)

\DB::table($resourceName)->find($resourceId)返回null(无结果),因此没有user_id属性。在尝试访问其属性之前,请检查您是否找到了结果。

同样适用于$ request-&gt; user() - &gt; id - 如果$request->user()由于用户未登录而为空,则会失败。