Несколько маршрутов к одному контроллеру

Я пытаюсь создать restfull API, и я пришел к точке, где я думаю, и REST не очень ясно об этом, что один ресурс должен быть доступен более чем по одному URL. Позвольте мне привести пример.

Route::group(['prefix' => 'forum'], function(){

    Route::resource('categories', 'CategoriesController');

    Route::resource('categories.discussions', 'DiscussionsController');

    Route::resource('discussions', 'DiscussionsController');

});

мое намерение состоит в том, чтобы иметь доступ к каждому обсуждению либо путем добавления его к категории он принадлежит:

localhost / форум / категории / {category_id} / обсуждения

или это URL-адрес

localhost / форум / обсуждения

у кого-нибудь есть что-то подобное, чтобы работать без перезаписи полного контроллера.

Это мой контроллер обсуждений:

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/discussions и localhost/forum/discussions)

но когда я пытаюсь показать ресурс, работает только длинная версия, короткая бросает следующее execption:

ErrorException in DiscussionsController.php line 68:
Missing argument 2 for AppHttpControllersDiscussionsController::show()

Я бы сказал, что laravel сходит с ума, потому что он не может идентифицировать id, есть ли какой-либо умный обходной путь или мне придется переписать контроллер¿?

любое мнение высоко ценится, спасибо

1 ответов


вы можете попробовать что-то вроде этого

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');