Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
构建MVC for work(PHP)-类结构_Php_Model View Controller_Oop - Fatal编程技术网

构建MVC for work(PHP)-类结构

构建MVC for work(PHP)-类结构,php,model-view-controller,oop,Php,Model View Controller,Oop,PHP-MVC问题: 这是一个关于构建MVC的高层次问题。我有一个名为page的类,它需要为模型、视图和控制器引入类。还有一个Route类,它主要具有与路径有关的属性:/class/Method/arg1/arg2等 现在,页面将该路由对象作为其构造函数参数拉入 模型、视图和控制器是否应该扩展页面?虽然M、V和C需要来自Route对象的某些信息,但我认为从逻辑上讲,例如,模型不会扩展页面——因为虽然它是页面的一部分,但它不是不同类型的页面,而且我不确定M、V和C是否需要彼此如此亲密 但我想我还是

PHP-MVC问题: 这是一个关于构建MVC的高层次问题。我有一个名为page的类,它需要为模型、视图和控制器引入类。还有一个Route类,它主要具有与路径有关的属性:/class/Method/arg1/arg2等

现在,页面将该路由对象作为其构造函数参数拉入

模型、视图和控制器是否应该扩展页面?虽然M、V和C需要来自Route对象的某些信息,但我认为从逻辑上讲,例如,模型不会扩展页面——因为虽然它是页面的一部分,但它不是不同类型的页面,而且我不确定M、V和C是否需要彼此如此亲密

但我想我还是会问的。我发现自己正在做的是,页面将在实例化该路由对象时将其传递给控制器,然后对模型、视图等进行同样的处理

我知道,每当你发现自己在做这样多余的事情时,也许是时候退后一步,在你在这条道路上做太多工作之前重新思考一下了

但是,在我看来,M、V和C并不是一个页面的形式,它更多的是一个组成部分

想法


谢谢

您的模型和视图可能不应该扩展页面

当涉及到MVC的工作方式时,您必须将这三个关注点划分为它们的逻辑基础

在我看来,您的路由是另一个独立的实体,它将引导程序指向控制器中包含的操作

控制器处理用户的输入,如果它表示一种类型的控件(如页面),那么扩展基本页面控制器以实现页面生成过程中必须执行的所有公共功能是有意义的

控制器接受用户的交互并与模型交互。这两个人不太可能有共同的祖先。模型充当业务逻辑和数据的接口,控制与持久存储的交互并转换数据

模型中生成并由控制器实例化的数据/转换被传递给视图

视图控制有关如何向用户显示数据的显示逻辑。在理想情况下,层中不应发生数据转换

因此,在我的MVC中,我有由子类继承的基本模型、视图和控制器类

M、 V和C需要来自路由对象的某些信息

然后将所需数据注入这些对象中

class Controller
{
    protected $router;

    public function __construct(Router $router)
    {
        $this->router = $router;
    }
}

$router = new Router();
$controller = new Controller($router);

除此之外,若页面是前端控制器,那个么它可能根本不应该实例化模型和视图。如果要扩展控制器,它可以通过
render
方法处理视图实例化,并在那里传递路由信息


模型应该完全不知道路由,只提供业务功能。他们不应该关心请求是来自网站还是桌面应用程序。

如果我理解正确,your
Page
类实际上是autoloader、mvc factory和整个应用程序容器的混合体。这是三种不同的责任,其中一种完全没有意义。PHP不是Java。。我们不使用“包含”类

此外,您应该询问,为什么您的
模型
视图
需要访问
路线
。好的,如果您也使用它来生成新的URL,我可以在视图中看到它的原因,但是在模型中与
Route
无关

控制器的职责是接受请求,并在此基础上执行正确的命令(操作)。然后它改变模型层的状态,并将
域对象
从所述层绑定到视图实例或其他形式的响应。然后控制器返回该视图实例

至于其他部分,控制器将从模型层启动结构,但控制器中应该有
新的
操作符。这将创建与结构名称的紧密耦合。相反,您应该为控制器实例配备一个模型工厂。然后,该工厂负责从模型层初始化结构。它还允许您在控制器外部初始化单个DB连接(可能还有一些缓存对象),然后将其提供给工厂。现在您可以确保每个模型层处理数据访问的项已经初始化了DB连接。您可以在所有数据访问对象之间共享相同的连接

关于如何将路由传递到控制器实例:

class Controller
{
    protected $route = null;

    public function setRoute( $route )
    {
        $this->route = $route;
    }
}
因为您很可能会这样使用它:

class FooBarController extends Controller{}
在bootstrap.php中的某个地方:

您必须记住,PHP中的构造函数不是继承的


另外,您可能会发现与您的研究相关。

PS-我们不使用预构建的MVC的原因是,雇主希望我们a)非常了解系统,b)了解更多关于MVC的信息。因此,明智的做法是首先学习适当的OOP。这就是要理解什么是LoD和SOLID原则。什么是依赖注入,什么是全局状态,为什么它不好。然后再浏览一些流行的框架,看看它们是如何解决这个问题的。这将给你必要的洞察力来完成这件事。
$controller = new $controllerName;
$controller->setRoute( $route );