Symfony :为什么不允许在 routeting.yml 中将“类型”与“默认值”组合在一起


Symfony : why am I not allowed to combine "type" with "defaults" in routing.yml

问题的简短版本:Symfony的错误消息解释说我不能将type键与 defaults,我只能与resources一起使用(请参阅下面的详细信息)。为什么会这样?我该如何解决?

详细版本:

以下是我在Symfony中所做的确切顺序:

composer create-project symfony/framework-standard-edition sym-book/ '~2.5'
php app/console generate:bundle --namespace=MiddleMan/BookBundle --format=yml

src/MiddleMan/BookBundle/Resources/config/routing.yml的内容编辑为

middle_man_book_example:
    path:     /example
    defaults: { _controller: MiddleManBookBundle:Lucky:number }
    type: annotation

在目录 src/MiddleMan/BookBundle/Controller 中 ,将DefaultController.php重命名为 LuckyController.php ,并将其内容编辑为

namespace MiddleMan'BookBundle'Controller;
class LuckyController
{
    /**
     * @Route("/lucky/number")
     */
    public function numberAction()
    {
        $number = rand(0, 100);
        return new Response(
            '<html><body>Lucky number: '.$number.'</body></html>'
        );
    }
}

在我的浏览器中键入localhost:8000/example/lucky/number

错误消息如下:

The "type" key for the route definition "middle_man_book_example" in 
"/Users/ewandelanoy/Documents/Math_Software/Symfony_stuff/sym-book/src/MiddleMan/BookBundle/Resources/config/routing.yml" 
is unsupported. It is only available for imports in combination with 
the "resource" key in 
/Users/ewandelanoy/Documents/Math_Software/Symfony_stuff/sym-book/src/MiddleMan/BookBundle/Resources/config/routing.yml (
which is being imported from "/Users/ewandelanoy/Documents/Math_Software/Symfony_stuff/sym-book/app/config/routing.yml")

如果您使用的是type: annotation则不需要,实际上,也不得将defaults部分存储在 routeting.yml 中。默认值部分将在其自己的注释中为每个路由配置,路由注释如下所示:

/**
 * Sample route
 * @Route("/{id}", name="sample-route-name", defaults={"id" = 1})
 * //defaults section is there to provide default values
 *
 * @Method({"GET", "POST"}) // not actually needed, default - GET
 */

yml 路由配置如下所示:

sample_bundle_routing:
    resource: "@YourBundle/Controller/"
    type:     annotation
    prefix:   /some_prefix/

UPD这个 yml 配置应该放在主routing.yml 中。但是您可以使用另一种变体。主要routing.yml这样说:

sample_bundle_routing:
    resource: "@YourBundle/Resources/config/routing.yml"

然后在你放入主routing.yml作为资源的routing.yml中,你可以编写:

sample_bundle_routing:
    resource: "@YourBundle/Controller/"
    type:     annotation
    prefix:   /some_prefix/

我有一个问题:为什么需要同时使用 yml 和注释路由配置?我的意思是您在下面的评论中写道:"但我还需要编辑目录中的 routeting.yml 文件,以提供控制器名称和操作方法名称。如果您使用注释路由类型 - 您可以这样做,而无需在 yml 中对注释路由进行配置。我的意思是:您要么作为每个操作的注释进行路由,要么作为捆绑/主routing.yml中的字符串进行路由,而不是同时进行路由!如果您使用注释路由,则唯一需要放入 yml 的内容是在哪里查找路由配置(在我的示例中它是"@YourBundle/Controller/"路径)。