在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
用法中获取我需要的所有其他数据。那么,最好是这样做而不是使用子资源和子资源控制器吗?
答案 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