문제

다음에 응용 프로그램을 설계하려고합니다 Misko Heverys 통찰력. 흥미로운 실험과 도전입니다. 현재 저는 ViewHelper 구현으로 어려움을 겪고 있습니다.

ViewHelper는보기에서 모델을 분리합니다. 내 구현에서는 모델을 감싸고 뷰를 사용할 수 있도록 API를 제공합니다. PHP를 사용하고 있지만 모든 사람이 구현을 읽을 수 있기를 바랍니다.

class PostViewHelper {
    private $postModel;

    public function __construct(PostModel $postModel) {
         $this->postModel = $postModel;
    }

    public function title() {
         return $this->postModel->getTitle();
    }
}

내 템플릿 (보기) 파일에서 이것은 다음과 같이 호출 될 수 있습니다.

<h1><?php echo $this->post->title(); ?></h1>

여태까지는 그런대로 잘됐다. 내가 가진 문제는 필터를 뷰 헬퍼에 부착하고 싶을 때입니다. Title () 호출의 출력을 필터링하는 플러그인을 원합니다. 이 방법은 다음과 같습니다.

public function title() {
    return $this->filter($this->postModel->getTitle());
}

관찰자를 거기에, 이벤트 핸들러 또는 모든 서비스 (새로운 것으로 보는 것에서 스택을 통해 전달되어야 함)를 가져와야합니다. Misko Hevery의 원칙에 따라 어떻게해야합니까? 나는 그것없이 어떻게 이것을 할 수 있는지 알고 있습니다. 나는 그것을 가져갈 수있는 방법에 관심이 있고 현재 솔루션이 보이지 않습니다. ViewHelper도 주입 할 수 있지만 모델을 얻는 문제가 있습니다.

도움이 되었습니까?

해결책

나는 당신이 매우 흥미롭거나 통찰력있는 블로그 게시물을 찾지 못했습니다.

당신이 묘사하는 것은 더 비슷해 보입니다 데코레이터 의존성 주입과 관련된 것보다. 의존성 주입입니다 어떻게 당신은 객체 그래프가 아니라 객체 그래프를 구성합니다 상태 일단 건설.

즉, 나는 당신의 데코레이터 패턴을 가져 와서 실행하는 것이 좋습니다.

interface PostInterface
{
    public function title();
}

class PostModel implements PostInterface
{
    public function title()
    {
        return $this->title;
    }
}

class PostViewHelper implements PostInterface
{
    public function __construct(PostInterface $post)
    {
        $this->post = $post;
    }

    public function title()
    {
        return $this->post->title();
    }
}

class PostFilter implements PostInterface
{
    public function __construct(PostInterface $post)
    {
        $this->post = $post;
    }

    public function title()
    {
        return $this->filter($this->post->title());
    }

    protected function filter($str)
    {
        return "FILTERED:$str";
    }
}

이 객체 그래프를 그렇게 만들기 위해 필요한 DI 프레임 워크를 사용하면 다음과 같이 사용합니다.

$post = new PostFilter(new PostViewHelper($model)));

나는 복잡한 중첩 물체를 구축 할 때 종종이 접근법을 사용합니다.

당신이 겪을 수있는 한 가지 문제는 당신의 "너무 많은"기능을 정의하는 것입니다. PostInterface. 그것은 될 수 있습니다 통증 모든 데코레이터 클래스에서이를 구현해야합니다. 나는 이것을 돌아 다니기 위해 PHP 마법 기능을 활용합니다.

interface PostInterface
{
    /**
     * Minimal interface. This is the accessor
     * for the unique ID of this Post.
     */
    public function getId();
}


class SomeDecoratedPost implements PostInterface
{
    public function __construct(PostInterface $post)
    {
        $this->_post = $post;
    }

    public function getId()
    {
        return $this->_post->getId();
    }

    /**
     * The following magic functions proxy all 
     * calls back to the decorated Post
     */
    public function __call($name, $arguments)
    {
        return call_user_func_array(array($this->_post, $name), $arguments);
    }

    public function __get($name)
    {
        return $this->_post->get($name);
    }

    public function __set($name, $value)
    {
        $this->_post->__set($name, $value);
    }

    public function __isset($name)
    {
        return $this->_post->__isset($name);
    }

    public function __unset($name)
    {
        $this->_post->__unset($name);
    }
}

이 유형의 데코레이터를 사용하면 장식 된 기능을 제공하는 데 필요한 모든 방법을 선택적으로 무시할 수 있습니다. 내가 무시하지 않는 것은 기본 물체로 다시 전달됩니다. 기본 물체의 인터페이스를 유지하면서 여러 장식이 발생할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top