2012-02-25 6 views
2

Sf2.0, 예를 들어 표준 블로그. routing.yml의symfony 2 모델 별 라우팅

코드 :

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

나는 게시물 목록을 포함하는 모든 내 temlates/레이아웃,이 constrution를 사용 : 내가 사용하여 내 게시물에 대한 URL을 생성

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

표준 방법 . 만약 내가 post_show에 대한 내 경로를 바꾸고 싶다면 (say ... 슬러그 매개 변수를 추가 /posts/{id}.{slug}), 나는 나의 모든 temlates를 바꿀 필요가있다.

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

질문 : 대신, 난 내 포스트 모델, 뭔가 등으로 경로를 생성 할 내 포스트 모델에이 발전기를 얻을 수있는 방법, 나는 "사용 ..."와 경로를 생성하는 방법을 어떻게해야 ?

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

사전에 감사 : 내 템플릿에서

은 내가 배치 할.

+0

먼저 getUrl을 모델에 넣는 것은 좋지 않습니다. 주로 모델이 어리 석고 URL을 생성하는 방법을 모르기 때문입니다. 한 가지 방법은 특정 유형의 객체 (예 : 게시물 및 URL 반환)에 호출 할 수있는 자신의 나뭇 가지 확장을 만드는 것입니다.'{{post | url}}''읽으십시오 여기서 나뭇 가지를 확장하는 방법에 대해 알아보십시오. http://www.kiwwito.com/article/extending-twig-in-symfony-2-add-custom-functions – Sgoettschkes

+0

나뭇 가지를 만드는 방법을 알고 있습니다. 아마도 당신 말이 맞을 것입니다. I RoR "to_param"과 같은 somth를 만들려고하는데 표준 "경로"와 "url"대신에 하나의 twig ext를 생성 할 것입니다 – ZloyPotroh

+0

이 경우에는 Sluggable 번들을보고 싶을 것입니다. 당신은 찾고 있습니다 : https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/sluggable.md – Sgoettschkes

답변

5

이 질문과 생각에 흥미를 느끼고 이전 질문에 대한 답을 얻으려고 어디서나 원하는 것을 달성 할 수있는 간단한 개념 증명을 해킹했습니다. 엔티티와 경로 이름을 전달할 수있는 나뭇 가지 함수를 구현했습니다.

  1. 이 경로는
  2. 변수를 통해 경로 변수
  3. 루프를 취득 경로를 컴파일에 따라 게터를 호출하려고 이름
  4. 로 지정하기 :이 기능은 URL을 생성하려면 다음 setps을 수행 엔티티는 경로의 URL을 생성하는 UrlGeneratorInterface에 필요한 매개 변수 배열을 구축
  5. 하자 심포니의 URL 생성기는 URL을 생성

그러나 이는 경로 매개 변수의 이름이 엔티티의 속성과 정확하게 일치 함을 의미합니다. 어쨌든 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')}}으로 함수를 호출 할 수 있습니다.

하지만 아직 심포니에 구현이없는 이유는 무엇입니까? 왜 내가 아직 발견하지 못했는지 묻고 있습니다.

+0

symfony cmf 라우팅 http://symfony.com/doc/master/cmf/getting_started/routing.html을 살펴 보길 원할 것입니다. 정확히 같지는 않지만 여기서 도움이 될 것입니다. 홍보는 물론 환영합니다. – dbu

1

Ok ... 그리고 지금까지 엔티티 매개 변수를 라우터에 전달하는 기능이 없습니다.등 :

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

room13에 의해 대답은 이해하지만 쉽게 그것을 만들 생각 :

나뭇 가지 템플릿 또는 HAML에서

(https://github.com/arnaud-lb/MtHamlBundle를 강력하게 추천 시간을 절약, 당신이 행복 할 것) 그리고 엔터티에 같은 함수를 정의 :

public function toParam(){ 

    // maybe some logic.... 

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

이유 : 경로 매개 변수는 새 옵션은 단지 엔티티 # toParam 한 장소에 추가하는 대신 경로가 사용되는 경우, 발견하고, 덮어 쓰기 등장하는 경우 ll 나뭇 가지 템플릿.

+0

나는 toParam 아이디어를 좋아한다. – eightyfive