1

Symfony2のルーティングに問題があります。

実際、最新のリリースをダウンロードしてサーバーで実行しました。デモは正常に機能します。

ここで、次のことを実行します。TestControllerを作成したいので、このコントローラーには次のものが必要です。

  • インデックスビュー
  • HelloWorldのようなビュー
  • 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.twighello2.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/」のルートが見つかりません

なにが問題ですか?2つのコントローラー機能に対して1つのビューを持つことは可能ですか?(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'にアクセスしてルーティングできます。これはsymfony2でルートを管理する1つの方法にすぎません。これは役立つかもしれません:http ://symfony.com/doc/current/book/routing.html

于 2012-07-28T14:01:11.680 に答える
1

2つのこと:

  • 「/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 に答える