我正在用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();
}