0

我试图了解传递变量是如何工作的。

我设置了一个控制器:

class indexController
{
    public function calling()
    {
        $route = new Route():
        $route->title = 'Register user';
        $route->getview('users','register');
    }
}

还有一个模型:

class Route
{
    public function getview($module,$filename)
    {
        require_once('templates/'.$module.'/'.$filename.'.phtml');
    }
}

还有一个类似这样的视图文件:

<div class="title"><?php echo $this->title; ?></div>

如何设置视图的标题?我应该在控制器中“公开”这个变量,并在构建模型以在我的视图文件中使用时获取它吗?

4

2 回答 2

1

您的设计存在问题,但忘记这些问题是您可以做到的。

public function var( $var, $val ) {
    $this->vars[$var] = $val; // should disallow _view as a $var
}

public function getview($module,$filename)
{
    $_view = 'templates/'.$module.'/'.$filename.'.phtml';
    extract( $this->vars );  //creates variables for 
    require_once( $_view );
}

像这样使用它

    $route = new Route():
    $route->var( 'title', 'Register user' );
    $route->getview('users','register');
于 2013-09-24T19:36:16.673 回答
1

是什么让您觉得您正在实施 MVC?因为从哪里看,看起来你已经混淆了模式每个部分的职责。

这是基础知识..

MVC是一种架构设计模式,是SoC原理的体现。它将模型层(负责实现领域业务逻辑)与表示层分开。在表示层中,它将处理用户输入(控制器)的部分与生成用户界面(视图)的逻辑分开。

将此模式应用于 Web 时,信息流如下所示:

  • 控制器接收用户的请求
  • 控制器改变模型层的状态和(也许)当前视图
  • 从模型层查看请求必要信息
  • 视图对用户产生响应

你所拥有的不是一个视图,而只是一个模板。你所拥有的不是模型,而只是一个类。

现在你的问题是:

如何设置视图的标题?

您的视图应该从模型层请求它需要的信息:

namespace Views;

class Doclument 
{
    // ... some code

    public function foobar()
    {
        $library = $this->serviceFactory->acquire('Library');

        $title = $library->getCurrentDocument('title');
        $content = $library->getCurrentDocument('content');
        
        $this->template['main']->assign([
           'title' => $title,
           'body'  => $content,
        ]);
    }

    // ... some more code 

    public function render()
    {
       /*
           if any templates have been initialized,
           here you would put code for combining them and
           return html (or some other format)
       */
    }
}

当然,您需要知道用户想要查看的文档......应该在控制器中完成:

namespace Controllers;

class Document
{
    // ... again, some code, that's not important here

    public function getFoobar( $request )
    {
        $library = $this->serviceFactory->acquire('Library');
        $library->useLanguage( $request->getParameter('lang') );
        $library->locateDocument( $request->getParameter('id') );
    }
}

$serviceFactory将在控制器和视图之间共享,因为这是您与模型层交互的方式。这也为您提供了一种只初始化每个服务一次的方法,而不会产生对全局状态的依赖。

我应该在控制器中“公开”这个变量,并在构建模型以在我的视图文件中使用时获取它吗?

不。

模型层(是的,它应该是层而不是类)不应该知道表示层的实现中的任何内容。实际上,视图也不应该知道控制器的。

实际上,在 OOP 中使用公共变量被认为是一种不好的做法(除非您正在创建数据结构......想想:像二叉树这样的东西)。它会导致您的代码泄漏封装

附言

我试图了解传递变量是如何工作的。

这就是 OOP 的基础。如果您没有很好地掌握 OOP 概念、实践和方法论,那么您不应该玩弄像 MVC 模式这样的高级结构。

查找称为“依赖注入”的东西。

于 2013-09-25T02:18:58.810 回答