我在Symfony2中遇到路由问题。
实际上我下载了最新版本并在我的服务器上运行它。该演示工作正常。
现在我要做以下事情: 我想创建一个TestController,这个控制器应该有:
所以我开始在名为src\Acme\DemoBundle\Controller
的{{1}}文件夹中创建一个新控制器。这是代码:
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
和hello.html.twig
index.html.twig
中创建了3个观看次数
他们都有这样的内容
hello2.html.twig
最后我编辑了{% extends "AcmeDemoBundle::layout.html.twig" %}
{% block title "Symfony - Demos" %}
{% block content_header '' %}
{% block content %}
foo!!!
{% endblock %}
并添加了这样的内容:
routing.dev.yml
当我想运行测试控制器时,我得到:
找不到“GET / test /”
的路线
有什么问题? 是否可以为两个控制器功能提供一个视图? (比如hello()和hello($ foo))?
答案 0 :(得分:3)
你也可以这样做:
在routing_dev.yml中,请确保您拥有:
_main:
resource: routing.yml
在routing.yml中,添加如下内容:
AcmeDemoBundle:
resource: "@AcmeDemoBundle/Resources/config/routing.yml"
prefix: /test
您可以选择所需的前缀来访问该特定包。
在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
答案 1 :(得分: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');
答案 2 :(得分:0)
在您的路由中,您定义了前缀,但实际上并未定义路由。由于您正在使用注释 - 必须通过Controller中的注释来定义路径。
请参阅此great manual;)
您的routing_dev.yml
应如下所示:
_name1:
resource: "@AcmeDemoBundle/Controller/TestController.php"
type: annotation
在你的控制器中你应该为每个动作定义@Route:
/**
* @Route("/hello")
*/
public function helloAction()
{
return array();
}
在此之后,您将能够通过路线/hello
等访问您的操作。
干杯;)