2013-03-15 6 views
8

이전 코드베이스를 Symfony 2.2 프레임 워크로 옮깁니다.비즈니스 로직을 배치 할 곳은 Symfony 2 모델 레이어입니까?

제 기사에서 내 기사 엔티티에 현재 기사의 URL을 반환하는 getUrl() 메서드가 있습니다.

Symfony에서 나는 라우터 서비스를 사용하여 이러한 URL을 생성해야합니다.

엔티티 내부에서 라우터에 액세스 할 수 없으므로 프레임 워크가 실제로 지원하지 않는 것이 좋지 않습니다.

Twig 도우미 path()을 사용하여 Twig 템플릿 자체에서 라우터를 호출하고 URL을 구성하는 데 필요한 아티클 인스턴스의 모든 인수를 제공 할 수 있습니다. 그러나이 방법은 URL 형식 규칙을 변경하기로 결정할 경우 매우 좋지 않습니다.이 모든 호출을 찾아 다시 작성해야합니다 (DRY이 아님).

저는 비즈니스 로직 캡슐화를 여기에 저장하고 뷰 레이어에 모든 용기를주지 않으려합니다.

이 상황에서 어떻게 진행해야합니까?

답변

11

서비스 레이어에 ArticleManager 클래스를 만들고 여기에 비즈니스 로직을 처리하십시오. 의존성 주입을 통해 라우터에 전달할 수 있습니다. 귀하의 예를 들어

, ArticleManager는 (당신도 __construct 또는 별도의 setter 메소드를 통해 주입하는 것이) 라우터 인스턴스를 사용하는 것이 $article의 속성을 기반으로 URL을 생성하고, 그것을 돌려 getUrl(Article $article) 방법이있을 것입니다.

이 방법을 사용하면 비즈니스 논리가 뷰 또는 컨트롤러 계층을 오염시키지 않도록 할 수 있습니다.

Service Container docs을 반드시 읽으십시오.

+0

고마움 팔! 이 접근 방식에 대해 생각해 보았습니다. 좀 더 경험이 많은 사람의 확인이 필요했습니다.) 다른 클래스에서 모델 엔티티를 관리하는 것이 정말 마음에 들지 않지만이 옵션은 실용적인 옵션 일뿐입니다. –

+0

액티브 레코드 ORM을 사용 중이라면, 이는 확실히 외국 접근 방식처럼 느껴집니다. 하지만 시간이 지남에 따라 걱정을 나누고 이전에 어떻게 관리했는지 의아하게 생각할 것입니다. –

+0

@SlavaFominII 이것은 좋은 해결책입니다. 동일한 "모델"개체를 가지고 있다면 같은 Manger에 저장하거나 애플리케이션의 모든 엔티티에 대한 관리자 (즉, 서비스)를 보유하고 있으며, 때로는 불가능할 수도 있습니다. – DonCallisto

관련 문제