gpt4 book ai didi

ViewHelper 新/可注入(inject)的困境

转载 作者:行者123 更新时间:2023-12-03 11:13:38 27 4
gpt4 key购买 nike

我正在尝试按照 Misko Heverys insights 设计一个应用程序.这是一个有趣的实验,也是一个挑战。目前我正在为我的 ViewHelper 实现而苦苦挣扎。

ViewHelper 将模型与 View 分离。在我的实现中,它包装模型并提供 API 供 View 使用。我正在使用 PHP,但我希望每个人都可以阅读该实现:

class PostViewHelper {
private $postModel;

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

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

在我的模板( View )文件中,可以这样调用:
<h1><?php echo $this->post->title(); ?></h1>

到现在为止还挺好。我遇到的问题是当我想将过滤器附加到 ViewHelpers 时。我想要过滤 title() 调用输出的插件。该方法将变成这样:
public function title() {
return $this->filter($this->postModel->getTitle());
}

我需要让观察者在那里,或者一个 EventHandler,或者任何服务(在我看来是一个新的,所以它需要通过堆栈传递)。我怎样才能按照 Misko Hevery 的原则做到这一点?我知道没有它我怎么能做到这一点。我对如何接受它很感兴趣,目前我没有看到解决方案。 ViewHelper 也可以是可注入(inject)的,但是将模型放入其中是个问题。

最佳答案

我没有发现您引用的博客文章非常有趣或有见地。

您所描述的似乎更像是 Decorator与依赖注入(inject)无关。依赖注入(inject)是构建对象图的方式,而不是它们的状态 一旦建成。

也就是说,我建议采用您的装饰器模式并使用它运行。

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);
}
}

使用这种类型的装饰器,我可以有选择地覆盖提供装饰功能所需的任何方法。任何我没有覆盖的东西都会传回底层对象。在维护底层对象的接口(interface)的同时,可以发生多种装饰。

关于ViewHelper 新/可注入(inject)的困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2074317/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com