【发布时间】:2016-08-26 18:46:21
【问题描述】:
我有很多通用控制器,它们具有获取、更新和删除路由,但是它们具有不同的路由参数。我想为所有控制器找到一种实现通用接口的方法,但我做不到,因为参数的签名不同。
例如,现在我有这样的界面:
interface iTable
{
public function getAction(Request $request, $token, $sortBy, $order, $searchBy, $searchQuery, $pageNumber);
...
和适当的控制器
class UserManagementController extends Controller implements iTable
{
/**
* @Route("/token={token}/manage/users", name="ManagementGetUsers")
* @Route("/token={token}/manage/users/page{pageNumber}", name="ManagementGetUsersWithPage")
* @Route("/token={token}/manage/users/sort={sortBy}/{order}", name="ManagementGetUsersWithSort")
* @Route("/token={token}/manage/users/sort={sortBy}/{order}/page{pageNumber}", name="ManagementGetUsersWithSortAndPage")
* @Route("/token={token}/manage/users/sort={sortBy}/{order}/searchBy={searchBy}/q={searchQuery}/page{pageNumber}", name="ManagementGetUsersWithSortAndSearchAndPage")
*/
public function getAction(Request $request, $token = '', $sortBy = "Id", $order = "ASC", $searchBy = 'Id', $searchQuery = '', $pageNumber = 1){
...
有没有办法让我将路由中的参数组合在一个关联数组中,以便我可以使用封装所有路由参数的选项数组实现接口?
interface iTable
{
public function getAction(Request $request, array $options);
...
更新 1
我正在尝试在方法注释中指定默认参数,以便该方法只需要$request 参数。
/**
* @Route("/token={token}/manage/users", name="ManagementGetUsers", defaults={"token" = null, "sortBy" = 'Id', "order" = 'ASC', "searchBy" = 'Id', "searchQuery" = null, "pageNumber" = 1})
* @Route("/token={token}/manage/users/page{pageNumber}", name="ManagementGetUsersWithPage", defaults={"token" = null, "sortBy" = 'Id', "order" = 'ASC', "searchBy" = 'Id', "searchQuery" = null, "pageNumber" = 1})
* @Route("/token={token}/manage/users/sort={sortBy}/{order}", name="ManagementGetUsersWithSort", defaults={"token" = null, "sortBy" = 'Id', "order" = 'ASC', "searchBy" = 'Id', "searchQuery" = null, "pageNumber" = 1})
* @Route("/token={token}/manage/users/sort={sortBy}/{order}/page{pageNumber}", name="ManagementGetUsersWithSortAndPage", defaults={"token" = null, "sortBy" = 'Id', "order" = 'ASC', "searchBy" = 'Id', "searchQuery" = null, "pageNumber" = 1})
* @Route("/token={token}/manage/users/sort={sortBy}/{order}/searchBy={searchBy}/q={searchQuery}/page{pageNumber}", name="ManagementGetUsersWithSortAndSearchAndPage", defaults={"token" = null, "sortBy" = 'Id', "order" = 'ASC', "searchBy" = 'Id', "searchQuery" = null, "pageNumber" = 1})
*/
public function getAction(Request $request){
...
但我收到以下错误
[Syntax Error] Expected PlainValue, got ''' at position 102 in method AppBundle\Controller\UserManagementController::getAction()
我尝试过使用不同路由的默认参数,但收效甚微。
【问题讨论】:
-
看看$request->query->all();我怀疑您可能会使事情变得过于复杂,但是如果您已经计划传递请求,那么确实不需要将参数作为数组传递。可能想看看其他一些通用的 crud 包,看看它们是如何做到的。
-
@Cerad 谢谢,我现在正在查看使用注释中的默认值和
$request作为唯一的控制器方法参数。
标签: php arrays interface symfony