有没有办法在 Symfony 2 中“继承”控制器的前缀?

h00*_*gan 0 php symfony

有没有办法让一个控制器在 Symfony2 中继承另一个控制器的路由前缀?

我想创建一个“admin”路由和控制器,其他控制器可以从中继承基本前缀,例如 admin 类将开始这样的事情:

/**
 * @Route("/admin")
 */
class AdminController {...}
Run Code Online (Sandbox Code Playgroud)

然后另一个类可以只“继承”前缀并使用自己的前缀添加到它,例如:

/**
 * @Route("/news")
 * @InheritPrefix("AdminController") <-- an imaginary annotation to show what I mean
 */
class NewsController
{
    /**
     * @Route("/", name="admin_news")
     */
    public function indexAction() {...}

    /**
     * @Route("/list-all", name="admin_news_list-all")
     */
    public function listAllAction() {...}
}
Run Code Online (Sandbox Code Playgroud)

结果将是 URL /admin/news 将被路由到 NewsController::indexAction() 并且 /admin/news/list-all 将重定向到 NewsController::listAllAction()

然后可以创建第二个类,例如

/**
 * @Route("/photos")
 * @InheritPrefix("AdminController") <-- an imaginary annotation to show what I mean
 */
class PhotoController
{
    /**
     * @Route("/new", name="admin_photos_new")
     */
    public function newAction() {...}
}
Run Code Online (Sandbox Code Playgroud)

然后 url /admin/photos/new 将重定向到 PhotoController::newAction()

我知道 SonataAdminBundle,但想知道是否有办法在没有那个包的情况下做到这一点。

Wou*_*r J 5

您可以为完整的 RouteCollection 指定前缀。使用注解时,每个控制器都是一个集合。但是每个导入的资源也是一个集合。这意味着您可以使用admin带有/admin前缀的资源导入和带有前缀的控制器/news

# app/config/routing.yml
_admin:
    resource: @AdminBundle/Controller
    prefix: /admin
Run Code Online (Sandbox Code Playgroud)
# app/config/routing.yml
_admin:
    resource: @AdminBundle/Controller
    prefix: /admin
Run Code Online (Sandbox Code Playgroud)
// src/AdminBundle/Controller/AdminController.php

// ...
class AdminController
// ...
Run Code Online (Sandbox Code Playgroud)