我有很多通用控制器,它们将具有get,更新和删除路由,但是它们将具有不同的路由参数。我想找到一种方法,让所有的控制器实现一个通用的接口,但我不能,因为参数的签名是不同的。
例如,现在我有这样的界面:
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->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
...
使用这种方法,我可以检索所有自定义参数令牌并为通用接口维护一致的控制器方法签名。