gpt4 book ai didi

php - 多个路由到同一个 Controller

转载 作者:可可西里 更新时间:2023-11-01 13:26:09 26 4
gpt4 key购买 nike

我正在尝试构建一个 restfull API,我认为,REST 对此不是很明确,一个资源应该可以通过多个 URL 访问。让我举个例子。

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

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

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

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

});

我的意图是能够通过将讨论附加到它所属的类别来访问每个讨论:

localhost/forum/categories/{category_id}/discussions

或通过此网址

本地主机/论坛/讨论

有没有人能在不重写整个 Controller 的情况下使用这样的东西。

这是我的讨论 Controller :

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

}

index 方法在两个调用中都有效(localhost/forum/categories/id/discussions 和 localhost/forum/discussions)

但是当我尝试显示资源时,只有长版本有效,短版本会抛出以下异常:

ErrorException in DiscussionsController.php line 68:
Missing argument 2 for App\Http\Controllers\DiscussionsController::show()

我会说 Laravel 变得疯狂,因为他无法识别 ID,是否有任何聪明的解决方法,或者我是否必须重写 Controller ?

非常感谢任何意见,谢谢

最佳答案

你可以试试这样的东西

public function show(Category $category, Discussion $discussion)

如果您正在调用 localhost/forum/categories/{categories}/discussions/{discussions} 那么两个变量都有它们的确切值。如果你调用 localhost/forum/discussions/{discussions} 然后类别将只是新类别

确保将 RouteServiceProvider 中的值绑定(bind)为

$router->model('discussions', 'App\Discussion');
$router->model('categories', 'App\Category');

关于php - 多个路由到同一个 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29791311/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com