在Laravel中嵌套资源中的模型绑定


Model binding in nested resources in Laravel

我正在用Laravel构建一个RESTful api,我的前端应用程序在Angular中。

我有许多模型/控制器和路由。我正在努力掌握如何为嵌套资源创建restful路由。

例如,我显示客户端列表的路由很简单:

 Route::resource('clients', 'ClientsController');

客户端可以有多个活动:

class Client extends Model
{
    public function campaigns()
    {
        return $this->hasMany('App'Campaign');
    }
}

我不需要一个路由来显示所有的活动,但我确实需要一个路由来显示基于客户端的所有活动。

Route::resource('clients.campaigns', 'CampaignsController');

我的意图是让Angular应用请求的端点是:

myapp/api/clients/6/campaigns

其中'6'为客户端ID。这将返回一个属于id为6的客户端的活动列表。

在我的索引方法,我试图使用隐式模型绑定来获得这个客户端Id,但我总是得到一个空的结果集:

class CampaignsController extends ApiController
{
    public function index(Client $client)
    {
        $campaigns = Campaign::where('client_id', $client->id)->get();
        if (!count($campaigns)) {
            Log::warning('Campaigns list is empty');
            return $this->respondNotFound('No Campaigns Found');
        }
        try {
            return $this->respond([
                'data' => $this->campaignTransformer->transformCollection($campaigns->all())
            ]);
        } catch ('Exception $e) {
            Logging::logException($e, 'API error showing campaigns list');
            return $this->respondInternalError('An internal error occurred');
        }
    }
}

显然我的路由没有绑定客户端- $client上的var_dump显示了这一点。我哪里做错了?

对于遇到这个问题的人- Laravel正在为我注入client_id。

因此索引方法变成:

public function index($client_id)
{
    $campaigns = Campaign::where('client_id', $client_id)->get();
}