我正在尝试构建一个restfull API,我想到了这一点,而REST并不是非常明确的,一个资源应该可以通过多个URL访问.让我举一个例子.
Route::group(['prefix' => 'forum'], function(){
    Route::resource('categories', 'CategoriesController');
    Route::resource('categories.discussions', 'DiscussionsController');
    Route::resource('discussions', 'DiscussionsController');
});
我的目的是能够通过将每个讨论附加到它所属的类别来访问每个讨论:
本地主机/论坛/分类/ {} CATEGORY_ID /讨论
或者通过这个网址
本地主机/论坛/讨论
有没有人有这样的东西工作而不重写完整的控制器.
这是我的讨论控制器:
class DiscussionsController extends ApiController {
public function __construct(DiscussionRepositoryInterface $discussion)
{
    $this->discussions = $discussion;
}
/**
 * Display a listing of the resource.
 *
 * @return Response
 */
public function index($category = null)
{
    $response = $this->discussions->all($category);
    return $this->respond($response->getData());
}
/**
 * Show the form for creating a new resource.
 *
 * @return Response
 */
public function create()
{
    if (!$this->hasPermission('forum.create.discussion'))
    {
        return $this->respondNotAllowed();
    }
    return $this->respondSuccess('Granted');
}
/**
 * Store a newly created resource in storage.
 *
 * @return Response
 */
public function store($category)
{
    if (!$this->hasPermission('forum.create.discussion'))
    {
        return $this->respondNotAllowed();
    }
    return $this->respondSuccess('Granted');
}
/**
 * Display the specified resource.
 *
 * @param  int  $id
 * @return Response
 */
public function show($categories = null, $discussions)
{
    $discussion =  $this->discussions->find($categories, $discussions);
    if ($discussion == null)
        return $this->respondNotFound('Discussion not found');
    $data = [
        'discussions' => $discussion
    ];
    return $this->respond($data);
}
/**
 * Show the form for editing the specified resource.
 *
 * @param  int  $id
 * @return Response
 */
public function edit($id)
{
    if (!$this->hasPermission('forum.edit.discussion'))
    {
        return $this->respondNotAllowed();
    }
    return $this->respondSuccess('Granted');
}
/**
 * Update the specified resource in storage.
 *
 * @param  int  $id
 * @return Response
 */
public function update($id, $data)
{
    if (!$this->hasPermission('forum.edit.discussion'))
    {
        return $this->respondNotAllowed();
    }
    $data = Input::only('category_id', 'user_id', 'desc', 'title');
    $data = $this->clearNullInput($data);
    if ($this->discussions->update($id, $data))
        return $this->respondError('Couldnt update discussion');
    return $this->respondSuccess('Discussion updated successfully');
}
/**
 * Remove the specified resource from storage.
 *
 * @param  int  $id
 * @return Response
 */
public function destroy($id)
{
    if (!$this->hasPermission('forum.delete.discussion'))
    {
        return $this->respondNotAllowed();
    }
    if (!$this->discussions->delete($id))
        return $this->respondError('Couldnt destroy user');
    return $this->respondSuccess('Granted');
}
}
索引方法在两个调用中都很好(localhost/forum/categories/id/discussion和localhost/forum/discussion)
但是当我尝试显示资源时,只有长版本才能运行,短版本会抛出以下执行:
ErrorException in DiscussionsController.php line 68:
Missing argument 2 for App\Http\Controllers\DiscussionsController::show()
我会说laravel疯了,因为他无法识别id,是否有任何聪明的解决方法或者我将不得不重写控制器?
任何意见都是高度赞成的,谢谢
你可以尝试这样的事情
public function show(Category $category, Discussion $discussion)
如果您正在调用localhost/forum/categories/{categories}/discussions/{discussions},则两个变量都有其确切值。如果您致电,localhost/forum/discussions/{discussions}那么类别将只是新类别
确保将 RouteServiceProvider 中的值绑定为
$router->model('discussions', 'App\Discussion');
$router->model('categories', 'App\Category');