2016-06-08 7 views
1

내가 심포니에 새로운 해요 대 기업, 나는 한 모델 클래스가 있었던 MVC 프레임 워크에서 오는, 그러나 여기 심포니에서 우리는 2가 (법인저장소)심포니, 저장소

그래서, 나는 방법은 Entity 클래스 내부에 넣어해야 할 때 확실하지 않다 그것은 예를 들어

... 저장소 내에서해야 할 때 :

$user->logLogin() 

은 사용자 로그인 (timestamp, ip, country, user agent ecc.)을 log_logins 테이블에 기록하며 로그인 이벤트 수신기에서 호출됩니다. (나는 그 테이블의 데이터를 조작 할 필요가 없으므로 UserLogins 엔티티를 만들지 않을 것입니다, 단지 읽기 전용 정보입니다)

+4

몇 마디로 ... 엔티티는 애플리케이션에서 테이블을 표현하기 때문에 엔티티에 속성과 관련된 모든 메소드 (예 :'$ user-> getEmail()')를 넣으십시오. 저장소는 엔티티를 검색하는 방법이므로 저장소에 getUserByEmail 또는 기타와 같이 가져와야하는 모든 방법을 사용하십시오. – Muriano

+0

테이블'log_login'은'user' 테이블과 많은 관계로 연결되어 있습니다. 교리 관계를 사용할 수 있으며'user' 엔티티에는'addLogLogin()'메소드가 포함되어 있습니다. 'user' 엔티티에는'ArrayCollection' 유형의 'logLogin' 속성이 있습니다. [doc] (http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/association-mapping.html) – Daniel

답변

1

엔티티와 리포지토리는 완전히 다른 두 가지입니다. 저장소는 모델이 아닙니다. 엔티티는 모델을 나타냅니다. 리포지토리는 데이터베이스와 인터페이스합니다. 이전 프레임 워크는 Doctrine 2가 사용하는 데이터 맵퍼 접근 방식과 달리 액티브 레코드 방식을 사용했습니다. 재검토가 필요합니다.

질문에 대답하기 위해 logLogin은 데이터베이스를 업데이트하므로 리포지토리에 들어갈뿐만 아니라 이 엔티티가 데이터베이스에 연결되어 있지 않은 간단한 이유 때문에 엔티티에 들어갈 수 없습니다.

그래서 당신은 당신의 리스너에 저장소를 주입 것입니다 후, 로그인 이벤트가 당신이 주변에 올 때 :

$this->userRepository->logLogin($user); 
1

즉시 나타나지 않을 수도 있지만, 심포니에 당신은 서비스와 함께 일을. 로그인 메소드는 엔티티 또는 저장소에 속하지 않습니다.

  • 엔티티 : 데이터 구조를 다음과 같이

    일반적인 생각이다. 거의 접근자가 아닌 의미있는 메소드가 없습니다.

  • 저장소 : DB와 상호 작용하는 유일한 부분. 대부분의 경우 기본 설정을 사용하지만 특별한 검색어가 있으면 기본 설정이 필요합니다. 비즈니스 로직도 여기에 있지 않아야합니다.
  • 서비스 : 비즈니스 논리가 살아있는 곳. 그것들을 많이 가져라. 다른 서비스와 저장소를 사용하도록하십시오.

일반적인 컨트롤러는 대개 저장소 (또는 Doctrine)를 직접 건드리지 않고도 몇 가지 서비스를 호출합니다.

이 구조는 가능한 한 간단하고 간단하게하기 위해 일부 레이어를 잘라낸 많은 예제에서 분명하지 않습니다.

참고 : Symfony에는 이미 여러 구성 요소에 연결되어 있고 새로운 구성 요소를 다시 구현하지 않고 사용할 수있는 풍부한 로그인 시스템이 있습니다. 나는 외모를 가지고 싶습니다.

+0

에서 알 수 있듯이 desctibed됩니다. 저장소는 읽기 용입니다. DB. 그러나 엔티티 (new, set, flush, commit)를 삽입하기 위해, 이것은 어디로 가는가? [The docs] (https://symfony.com/doc/current/doctrine.html#persisting-objects-to-the-database)는 해당 코드를 컨트롤러에 저장합니다. – Windowpane

+0

보통 그들은 서비스를 시작합니다. 문서의 예제는 명확성을 우선 고려하기 때문에 최소한의 사용법을 나타내며 일반적인 사용 사례를 나타내지는 않습니다. – Rad80