我创建了一个中间件(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; ...
答案 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()
由于用户未登录而为空,则会失败。