2012-02-25 33 views
2

Sf2.0、標準ブログなど。symfony 2モデル別ルーティング

のrouting.ymlのコード:

DevBlogBundle_post_show: 
pattern: /posts/{id} 
defaults: { _controller: "DevBlogBundle:Post:show" } 
requirements: 
    _method: GET 
    id: \d+ 

私が使用して私のポストのためのURLを生成する標準的な方法:

path('DevBlogBundle_post_show',{'id':post.id}) 

私は記事のリストが含まれるすべての私temlates /レイアウト、このconstrutionを使用。もし私がpost_showのルートを変更したいのなら(スラグパラメータを追加する/posts/{id}.{slug})、私はすべての私のtemlatesを変更する必要があります。

public function getUrl(){ 
    return $this->generator->generate('DevBlogBundle_post_show',array (...params...));} 

質問:どのように私は私がしなければならないものを、私のPostモデルにこのジェネレーターを取得することができ、「使用して...」とどのようにルートを生成する代わりに、私は、私のPostモデルによってルートを生成するような何かをしたいです?

<a href="{{ post.getUrl() }}" ...>...</a> 

感謝を事前に:私のテンプレートで

は私が置きたいです。

+0

まず、getUrlをモデルに入れるのは悪い考えです。なぜなら、モデルはむしろばかばかしく、URLの生成方法を知らないからです。 1つの方法は、あなた自身のtwig拡張を作成することです。これは、特定のタイプのオブジェクト(例えば、投稿を呼び出してurlを返します)を呼び出すことができます。 '{{post | url}}'ここに枝を伸ばすことについて:http://www.kiwwito.com/article/extending-twig-in-symfony-2-add-custom-functions – Sgoettschkes

+0

私はtwig extを作り出す方法を知っています。そしておそらく、あなたは正しいでしょう。 私RoRの "to_param"のようなものを作成しようとすると、標準の "path"と "url"の代わりに使用する1つのtwig extを作成します – ZloyPotroh

+0

この場合、Sluggableバンドルを見たいと思うかもしれません。あなたが探している:https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/sluggable.md – Sgoettschkes

答えて

5

この質問と私の前のコメントの考えに興奮して、私はあなたが求めるものを達成するためのコンセプトの簡単な証明を一緒にハッキングしました。私はエンティティとルート名を渡すことができるtwig関数を実装しました。この関数は、URLを生成するには、次のsetpsを行います

  1. で指定されたルートがルート
  2. は変数より
  3. ループをルート変数を取得し、上に従ってゲッターを呼び出そうとコンパイルゲットルートURLを生成するためにUrlGeneratorInterfaceによって必要とされるパラメータの配列を構築するエンティティ
  4. レッツのsymfonyのURLジェネレータは、URL
0123を生成します

しかし、これは、ルートパラメータがエンティティのプロパティと同じ名前になっていることを意味します。これは、とにかくIMHOは良い方法です。このコードは、コンテナプロパティに注入されたサービスコンテナ参照を持つ分岐拡張に配置する必要があります。

public function generateEntityUrl($entity,$routeName) 
{ 
    $router   = $this->container->get('router'); 
    $generator  = $router->getGenerator(); 
    $collection  = $router->getRouteCollection(); 
    $route   = $collection->get($routeName); 
    $compiledRoute = $route->compile(); 
    $variables  = $compiledRoute->getVariables(); 
    $parameters  = array(); 

    foreach($variables as $var) 
    { 
     $getter = 'get'.ucfirst($var); 
     $parameters[$var]=$entity->$getter(); 
    } 

    return $generator->generate($routeName,$parameters); 

} 

次に、{{post|entity_url('DevBlogBundle_post_show')}}で関数を呼び出すことができます。

しかし、なぜsymfonyに実装されていないのか、なぜ私はまだそれを見つけられていないのか、自分に尋ねています。

+0

symfony cmfのルーティングhttp://symfony.com/doc/master/cmf/getting_started/routing.htmlを調べたいかもしれません - まったく同じではありませんが、ここで助けてください。 PRは大歓迎です。 – dbu

1

Ok ...これまでのところ、エンティティパラメータをルータに渡す機能はありません。room13によって 回答は意味をなさないが、私はそれを容易にするためだと思う:

小枝テンプレートまたはHAMLで

(強くお勧めします、あなたの時間を節約、それはあなたが幸せになります:https://github.com/arnaud-lb/MtHamlBundle)など:

{{ path('route_name', entity.toParam()) }} 

public function toParam(){ 

    // maybe some logic.... 

    return array(
    'id' => $this->id, 
    'slug' => $this->getSlug(), 
    .....other needed params 
); 
} 

理由:: あなたのルートパラメータが新しいオプションが登場している場合は、単にエンティティ#toParamに一つの場所にそれを追加の代わりを見つけるために、ルートが使用される場合、および上書きとエンティティでのような関数を定義しますテンプレートをつける。

+0

私は 'toParam'というアイディアが好きです。 – eightyfive

関連する問題