1

我在 Symfony2 中的路由有问题。

实际上我下载了最新版本并在我的服务器上运行它。该演示工作正常。

现在我想做以下事情:我想创建一个TestController,这个控制器应该有:

  • 索引视图
  • 像你好世界一样的景色
  • 我可以传递2个参数的视图

所以我开始在src\Acme\DemoBundle\Controller名为TestController. 这是代码:

<?php

namespace Acme\DemoBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Acme\DemoBundle\Form\ContactType;

// these import the "@Route" and "@Template" annotations
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;

class TestController extends Controller
{
    public function indexAction()
    {
        return array();
    }

    public function hello2Action($name1, $name2)
    {
        return array();
    }

    public function helloAction()
    {
        return array();
    }
}

src\Acme\DemoBundle\Resources\views\Test然后我在一个名为的新文件夹中创建了 3 个视图hello.html.twigindex.html.twig并且hello2.html.twig

两个都有这样的内容

{% extends "AcmeDemoBundle::layout.html.twig" %}

{% block title "Symfony - Demos" %}

{% block content_header '' %}

{% block content %}
    foo!!!
{% endblock %}

最后我编辑routing.dev.yml并添加了这样的东西:

_name1:
    resource: "@AcmeDemoBundle/Controller/TestController.php"
    type:     annotation
    prefix:   /test

_name2:
    resource: "@AcmeDemoBundle/Controller/TestController.php"
    type:     annotation
    prefix:   /test/hello

_name3:
    resource: "@AcmeDemoBundle/Controller/TestController.php"
    type:     annotation
    prefix:   /test/hello2/{name1}&{name2}

当我想运行测试控制器时,我得到:

找不到“GET /test/”的路由

怎么了?是否可以为两个控制器功能提供一个视图?(比如 hello() 和 hello($foo))?

4

3 回答 3

3

你也可以这样做:

  1. 在 routing_dev.yml 中,确保你有这个:

     _main:
         resource: routing.yml
    
  2. 在 routing.yml 中,添加如下内容:

       AcmeDemoBundle:
          resource: "@AcmeDemoBundle/Resources/config/routing.yml"
          prefix:   /test
    

    您可以选择访问该特定捆绑包时所需的前缀。

  3. 在 Acme/DemoBundle/Resources/config/routing.yml 你现在可以添加你的路由模式。

      name1:
          pattern: /
          defaults: { _controller: AcmeDemoBundle:Test:index }
    
      name2:
          pattern: /hello
          defaults: { _controller: AcmeDemoBundle:Test:hello }
    
      name3:
          pattern: /hello2/{name1}/{name2}
          defaults: { _controller: AcmeDemoBundle:Test:hello2 }
    

您现在可以访问、路由/test/test/hello/test/hello2/firstname/lastname'。这只是在 symfony 2 中管理路由的一种方式。这可能会有所帮助:http ://symfony.com/doc/current/book/routing.html

于 2012-07-28T14:01:11.680 回答
1

两件事情:

  • 您已经为“/test”定义了一个路由,但没有为“/test/”定义一个路由,这就是您收到第一条错误消息的原因(没有为“GET /test/”找到路由)。无论如何,最好按照另一个答案中的建议将路由定义为注释。

  • 为了让控制器使用您正在使用的结构(返回和变量数组,在本例中为空数组),您需要使用“@Template”注释标记它们,如下所示:

/*

* @Route("/hello/{name}", name="_demo_hello")
* @Template()
*/    
public function helloAction($name)

这使得 Symfony 自动寻找相应的模板文件。如果您不这样做,则需要返回一个 Response 对象,指示应呈现的模板,如下所示:

return $this->render('AcmeDemoBundle:Test:index.html.twig');
于 2012-07-28T17:20:57.593 回答
0

在您的路由中,您定义了前缀,但实际上没有定义路由。由于您使用的是注释 - 必须通过控制器中的注释定义路由。

请参阅这本很棒的手册;)

routing_dev.yml应该是这样的:

_name1:
    resource: "@AcmeDemoBundle/Controller/TestController.php"
    type:     annotation

在你的控制器中,你应该为每个动作定义@Route:

/**
 * @Route("/hello")
 */
public function helloAction()
{
    return array();
}

在此之后,您将能够通过路由/hello等访问您的操作。

干杯;)

于 2012-07-28T13:19:44.363 回答