API - 处理嵌套资源(Laravel)

时间:2016-02-18 21:29:13

标签: php rest laravel

在Laravel(使用Fractal Transformers)中,我试图弄清楚如何准确处理嵌套资源。可以说我有这些路线:

Route::resource('user', 'UserController');
Route::resource('user.activity', 'UserActivityController');

因此,如果我想获得所有用户,则uri为/user,如果我想要用户5,则为/user/5

现在,如果我想要用户的活动,则uri为user/1/activity

这是我有点困惑的地方。在UserActivityController中,您可能有:

public function index($user_id)
{
    $user = $this->user->find($user_id)->activity;
    return $this->respondWithItem($user, $this->transformer);
}

所以我对此感到困惑:

1)对于每个嵌套资源,我是否继续获取顶级父资源(在这种情况下为User)?让我们说user嵌套了3或4级深度资源(即/user/1/activity/5/mentions/6/somethng-else)?每个资源控制器是否只需要从顶部开始并继续工作?

2)由于我正在使用Fractal,因此支持includes,允许我根据需要加载相关数据,方法是将某些数据附加到查询字符串中的includes。实际上,它非常灵活,我觉得我可以使用基础(如User)并从聪明的include用法中获取我需要的所有其他数据。那么,最好是这样做而不是使用子资源和子资源控制器吗?

1 个答案:

答案 0 :(得分:3)

是的,您需要使用id获取模型。即使它是嵌套资源,它也不会共享任何共同的数据。因此,您必须获取每个Controller中的所有内容。

例如:     

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class UserActivityController extends Controller
{
    /**
     * Show the specified user activity.
     *
     * @param  int  $userId
     * @param  int  $acitivityId
     * @return Response
     */
    public function show($userId, $acitivityId)
    {
        //  get the user, and then activity
    }


    /**
     * Show all activities from a user.
     *
     * @param  int  $userId
     * @return Response
     */
    public function show($userId)
    {
        //
    }



}

或者您可以扩展UserController并在__constructor中获取$user模型。通过这种方式,它将在UserActivityController

中提供