13

アプリのルーティング ファイルでルートを定義しました。

RouteName:
    pattern:  /some/route
    defaults: { _controller: MyAppBundle:Controller:action }

私が使用できるコントローラーで:

$this->get('router')->generate('RouteName');

何も拡張しないビュークラスなど、作成した新しいクラスから簡単にアクセスするにはどうすればよいですか。

namespace My\AppBundle\View;

class ViewClass {
    public function uri()
    {
        return getTheRoute('RouteName');
    }
}
4

4 に答える 4

36

ViewClass に「ルーター」サービスを挿入する必要があります。例えば。ViewClass サービスを定義する場所で:

viewclass.service:
    class: Namespace\For\ViewClass
    arguments:
       router: "@router"

そして、コンストラクターで:

public function __construct(\Symfony\Bundle\FrameworkBundle\Routing\Router $router)
{
    $this->router = $router;
}
于 2012-09-11T14:27:41.280 に答える
1

手がかりは、$this->generateUrl()コントローラーでメソッドがどのように機能するかにあります。見る:

/**
 * Generates a URL from the given parameters.
 *
 * @param string  $route      The name of the route
 * @param mixed   $parameters An array of parameters
 * @param Boolean $absolute   Whether to generate an absolute URL
 *
 * @return string The generated URL
 */
public function generateUrl($route, $parameters = array(), $absolute = false)
{
    return $this->container->get('router')->generate($route, $parameters, $absolute);
}

そのため、クラスをサービスとして定義し、@router サービスを注入する必要があります。それか、クラスに ContainerAwareInterface を実装させるかのどちらかですが、最初の方法の方が確実に優れています。

于 2012-09-11T14:28:49.943 に答える
1

クラスをサービスとして登録し、ルーターを依存関係として挿入する必要があります。

優れた symfony2 ドキュメントのサービス コンテナーに関する章を参照してください。

サービス コンテナーと依存関係の挿入の概念に慣れていない場合は、少し圧倒されるかもしれません。しかし、これは symfony2 アーキテクチャーの重要な部分であるため、理解するために最善を尽くしてください。

于 2012-09-11T14:29:29.080 に答える
0

インスタンス化時に、コンテナー全体をコントローラーからビュー クラスに渡すことができます。これはベスト プラクティスではなく、推奨されません。

class View
{
  protected $container;

  public function __construct(\Symfony\Component\DependencyInjection\Container $container)
  {
    $this->container = $container;
  }
}

次に、コードで使用できます

$this->container->get('router')->generate($route, $parameters, $absolute);
于 2012-09-14T16:00:07.233 に答える