【问题标题】:Symfony route variables as an associative array in the controller functionSymfony 路由变量作为控制器函数中的关联数组
【发布时间】: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


【解决方案1】:

我使用$request->attributes->get('...');找到了问题的解决方案

/**
 * @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){
    var_dump($request->attributes->get('token'); // Will output correctly
    ...

使用这种方法,我可以检索所有自定义参数标记并为通用接口维护一致的控制器方法签名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2018-08-15
    • 1970-01-01
    相关资源
    最近更新 更多