서로 다른 종속성에 필요한 동일한 기능을 제공하는 두 구성 요소


9

Zend Framework 1과 Doctrine2를 ORM 레이어로 사용하여 PHP로 응용 프로그램을 작성하고 있습니다. 모든 것이 잘 진행되고 있습니다. 이제 ZF1과 Doctrine2는 모두 자체 캐싱 구현과 함께 제공됩니다. 나는 두 가지 모두를 평가했으며, 각각 고유의 장단점이 있지만, 내 단순한 요구를 위해 다른 것보다 우월하지는 않습니다. 두 라이브러리 모두 구현이 아닌 해당 인터페이스에 대해 작성된 것으로 보입니다.

이것이 문제라고 생각하는 이유는 응용 프로그램을 부트 스트랩하는 동안 각각 고유 한 구문으로 두 개의 캐싱 드라이버를 구성해야하기 때문입니다. 이러한 방식으로 불일치가 쉽게 발생하므로 이로 인해 캐싱 백엔드에 두 개의 연결을 설정하는 것이 비효율적입니다.

최선의 방법이 무엇인지 파악하려고 노력하고 있으며 귀하가 제공 할 수있는 통찰력을 환영합니다.

지금까지 내가 생각한 것은 네 가지 옵션입니다.

  1. 캐싱 기능을 제공하는 두 개의 클래스가 있음을 인정하십시오.
  2. 젠드의 인터페이스를 Doctrine의 캐싱 구현에 적용하는 Facade 클래스를 만듭니다.
  3. 다른 방법으로 옵션 2-Zend Framework 백엔드에 Doctrine의 인터페이스를 매핑하는 Facade를 만듭니다.
  4. 다중 인터페이스 상속을 사용하여 하나의 인터페이스를 만들어 모든 인터페이스를 지배하고 겹치지 않도록기도하십시오 (예 : 둘 다 "저장"방법이있는 경우 PHP로 인해 동일한 순서로 매개 변수를 승인해야합니다). 적절한 다형성의 부족).

어떤 옵션이 가장 좋습니까, 아니면 내가 알지 못하는 "위에 해당하지 않는"변형이 있습니까?


3
PHP, ZF 또는 Doctrine을 모르는 사람들을 위해보다 일반적인 소프트웨어 디자인 의미로 문제를 설명해야 할 것입니다. 두 라이브러리가 같은 것을 캐싱합니까? 그렇다면 왜 하나의 캐시를 비활성화하지 않습니까? 그렇지 않다면 무엇이 문제입니까? 그런 종류의 것.
idoby

이전에는 자체 ORM 및 데이터베이스 액세스 캐시 공급자가있는 .NET CMS에서 작업했습니다. 그런 다음 CMS를 완전히 다른 캐싱 공급자를 사용하는 비즈니스 플랫폼과 통합해야했습니다. 비즈니스 플랫폼 캐시 공급자가 확장 할 수 있었을 때 CMS 내의 캐시 공급자를 웹 팜으로 확장 할 수 없었기 때문에 문제가 발생했습니다. 그래도 어떤 문제에 직면하고 있습니까?
CodeART

Symfony2와 이들이 어떻게이 문제를 해결했는지 살펴보십시오.
nietonfir

답변:


7

별도의 프로젝트가 서로 다른 캐시를 오염시키지 않고 자신의 공간에서 작업하는 한 중복 프로젝트가있을 수 있다는 점을 인정 하지 마십시오 . Doctrine은 Zend가 캐싱을 알고 있음을 알고 있지만 Zend에 의존하고 싶지 않으며 그 반대도 아닙니다. 모든 사람들이 젠드와 교리를 사용하고 싶지는 않습니다.

Doctrine 코드가 자체적 인 것을 사용하고 다른 모든 것에 ZF를 사용하게했습니다. 이 방법으로 ZF 수업 만 알면됩니다. 교리 캐시는 데이터베이스 개체에 대한 교리에 의해 내부적으로 만 사용해야합니다. ZF에는 html 페이지 캐싱 프런트 엔드와 같이 ORM 외부에 유용한 프런트 엔드가 더 있습니다.

다른 레이어를 만드는 것이 이상적이지만 프로젝트에 다른 종속성을 추가하므로 유지 관리에 적합하지 않습니다.

부트 스트랩에서 여러 캐시를 설정하기 위해 중복되어 보일 수 있음을 알고 있습니다. ZF1, Doctrine 및 ZF2를 동시에 사용하려고하면 상황이 악화 될 수 있습니다. 그러나 아직 백엔드에 연결하지 않고 변수 만 설정하므로 시간이 매우 짧습니다.

따라서 프로그래밍, 유지 관리 및 운영 관점에서 나는 그것들을 내버려 두었습니다.


3

이것이 문제라고 생각하는 이유는 응용 프로그램을 부트 스트랩하는 동안 각각 고유 한 구문으로 두 개의 캐싱 드라이버를 구성해야하기 때문입니다. 불일치는이 방법으로 쉽게 생성 되며,이 때문에 캐싱 백엔드에 두 개의 연결을 설정하는 것은 비효율적입니다.

"구성을보다 편리하게"관점에서 문제를 해결하는 이유는 무엇입니까?

다시 말해, 구성 데이터를 승인 한 새 클래스를 작성하여이를 두 캐싱 드라이버에 적용하십시오. 물론 유연하지는 않지만 잘못 될 가능성도 적습니다.


0

각 프레임 워크에 특화된 인터페이스 추상화를 작성해보십시오. 필자는 필요한 방법으로 자체 캐시 컨트롤러를 작성하여 두 캐시를 캡슐화합니다. 그런 다음 잊어 버리고 컨트롤러와 만 대화 할 수 있습니다. 그 솔루션에 문제가 있습니까?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.