PHP支持MVP模式吗?

Ven*_*Ven 5 php asp.net mvp design-patterns

有很多例子解释使用ASP.NET的MVP模式,但没有找到任何使用PHP的东西.

我是PHP程序员,想知道我在哪里可以获得MVP模式PHP示例?

mar*_*rio 10

MVP和MVC 实际上都是用于GUI应用程序的.大多数PHP框架更多地使用"MVC"作为流行语.使用哑模型(仅数据库),非活动视图(=模板)和编排控制器的实际实现实际上已经匹配MVP.无论如何,功能方面的控制器通常充当演示者,将模型中的数据铲入视图中.(在适当的MVC中,模型和视图交互更多,视图实际上是活动组件).

但无论如何,有一些框架实际上意识到更新的术语和模式.


Yan*_*ang 10

简短的回答是:是的PHP.

(注意,它不完全是原始论文中描述的MVP,而是网络的变体)

MVC和MVP之间的区别在于,视图完全被动并且不知道模型层.在MVC中,它不是被动的并且意识到模型层.在适当的MVP中,View类(如果是)也不应该实现构造函数.

MVP的典型示例包括以下部分:

  1. 数据访问层(DataMappers,ORM等)
  2. 业务逻辑(如验证和计算)
  3. 被动视图类(它可能是一个模板,但坚持使用类更好)
  4. 将模型和视图连接起来的演示者

关于如何使用PHP实现Model-View-Presenter的示例

注意:实际场景中的模型不是类,而是抽象层,它包含许多用于处理应用程序逻辑的类.我将它称为"模型"用于演示目的.

class Model
{
   public function getSomeStuff()
   {
       return array('foo' => 'bar');
   }
}


class View
{
   public function render($path, array $vars = array())
   {
      ob_start();
      extract($vars);
      require($path);
      return ob_get_clean();
   }
}



class Presenter
{ 
     private $model;

     private $view;

     public function __construct(Model $model, View $view)
     {
         $this->model = $model;
         $this->view = $view; 
     }

     public function indexAction()
     {
        $data = $this->model->getSomeStuff();  

        // Variables are set now, render the HTML
        // And returns as a string
        return $this->view->render('path/to/template.phtml', $data);
     }
}
Run Code Online (Sandbox Code Playgroud)

文件:template.phtml

<!DOCTYPE html>
<html>
<head>
  <title>...</title>
</head>

<body>

  <?php foreach($vars as $key => $value): ?>
      <p><?php echo $key; ?> : <?php echo $value; ?></p>
  <?php endforeach; ?>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

用法是:

$model   = new Model();
$view    = new View();

$presenter = new Presenter($service, $view);

echo $presenter->indexAction();
Run Code Online (Sandbox Code Playgroud)

请注意,这是一个非常简化的示例.在实际场景中,任何基于MVP的应用程序也应该实现以下内容:路由器,SPL类自动加载器.


Poe*_*rin 0

检查这个库Mutant Vole PHP