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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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
Php 控制器之间的切换(MVC)_Php_Oop_Model View Controller - Fatal编程技术网

Php 控制器之间的切换(MVC)

Php 控制器之间的切换(MVC),php,oop,model-view-controller,Php,Oop,Model View Controller,我试图理解并找出一种在自定义框架中的控制器之间切换的好方法。下面的例子就是我目前所想的,为了演示的目的而简化了,但是如果有更好的方法,我真的非常感谢一些专家的建议 class BaseController() { function __construct() { $this->model = new ModelFactory(); $this->view = new View(); if(isset($_SERVER['QUE

我试图理解并找出一种在自定义框架中的控制器之间切换的好方法。下面的例子就是我目前所想的,为了演示的目的而简化了,但是如果有更好的方法,我真的非常感谢一些专家的建议

class BaseController() {
    function __construct() {
        $this->model = new ModelFactory();
        $this->view = new View();

        if(isset($_SERVER['QUERY_STRING'])) {
            list($controller, $action) = explode('=', $_SERVER['QUERY_STRING']);
            self::process($controller);
        }
    }

    public function process($controller) {
        switch($controller) {
            case 'user':
                $user = new UserController($action);
            break;

            case 'forum':
                $forum = new ForumController($action);
            break;

            default:
                // use base controller
                switch($action) {
                    case 'contact':
                        $this->view->load($action);
                    break;
                }
        }
    }
}

// inside UserController.php
switch($action) {
    case 'register':
    break;

    case 'login':
    break;
}

// inside ForumController.php
switch($action) {
    case 'new_thread':
    break;

    case 'edit_post':
    break;
}

这确实是一个部分答案,希望能给你一些好的建议。我相信有人会有更好的答案

  • 您的示例中的
    BaseController
    可能命名错误。您所拥有的使它看起来更像一个控制器工厂,而不是所有其他控制器类可能派生的基础控制器。看起来这更像是一个“路由”类,所以你应该考虑给它一个更合适的名字来命名它的工作。

  • 如果希望框架用户使用自定义操作创建自定义控制器:

    a) 您肯定希望至少为所有要实现的控制器类创建一个接口。称它为
    IController
    或类似的东西。这将在下一步中使用

    b) 您必须满足于使用字符串作为类名创建对象。IE
    $controllerObject=new$controller()在“路由”处理程序类中。原因是要运行的控制器和操作名称直接来自请求URL。有很多方法可以给这部分加上别名,但这完全是另一个问题。不要忘记验证和/或白名单这些从客户端传入的“控制器”类名。要验证:请使用PHP函数
    class\u exists($controller)
    ,如果
    true
    ,请检查以确保controller类使用PHP内置的
    class\u implements($controller)
    实现
    IController
    。只有这样,您才能执行
    $controllerObject=new$controller()
    以实际创建控制器对象

    然后,您的“路由”
    过程
    方法变得更像(请记住,这是一个非常简化的示例):

    c) 不要让您的控制器声明任何方法(即使用
    $action
    的值命名),您不希望客户端直接使用上述设计模式执行。希望您的框架用户也能理解这一点。只要确保正确地记录这在内部是如何工作的,以使您的框架用户知道


  • 当然还有更多的方法,但这取决于你——框架设计师。此外,行动应该对使用什么“视图”拥有最终决定权。如果操作没有明确说明要使用的视图,则可以设置默认值。但是,这又是另一个问题。

    你真的应该从阅读MVC的实际内容开始。我建议从福勒的开始。因为有一件事是非常确定的——你所拥有的不是它

    看起来,您所命名的
    BaseController
    ,实际上是在处理路由问题。它是用户的请求URL,并根据您从该URL检索到的内容包含一个文件。这既不是面向对象编程,也不是过程编程。你所拥有的被称为

    为了避免这种疯狂,您应该创建一个单独的类,为您的应用程序实现路由机制。根据您用上述结构提取的数据,您应该启动特定的控制器实例,并对其调用一个方法

    比如:

    $request = new Request('QUERY_STRING');
    
    $router = new Router;
    $router->import('/path/to/routing/config.file');
    $router->route( $request );
    
    $klass = $request->getParameter('controller');
    
    if (class_exists( $controller ))
    {
        $command = $request->getMethod() . $request->getParameter('action');
    } 
    else 
    {
        $klass = 'Error';
        $command = 'getMessage';
    }
    
    $controller = new $klass;
    $controller->{$command}( $request );
    
    这当然是一个极其简化的版本。MVC模式旨在为大型项目带来一些秩序。如果你用它来创建一个简单的博客/名片网站,那就太过分了(假设页面没有增长)

    p.S.您可能会发现以下链接对您的学习很有用:,和


    你打算允许你的框架用户实现带有自定义操作的自定义控制器吗?@bob the destroyer如果这会使代码更通用,我想会的,那么是的。重命名类+1。假设控制器有一个父基类,那么名称的选择就更好了。
    $request = new Request('QUERY_STRING');
    
    $router = new Router;
    $router->import('/path/to/routing/config.file');
    $router->route( $request );
    
    $klass = $request->getParameter('controller');
    
    if (class_exists( $controller ))
    {
        $command = $request->getMethod() . $request->getParameter('action');
    } 
    else 
    {
        $klass = 'Error';
        $command = 'getMessage';
    }
    
    $controller = new $klass;
    $controller->{$command}( $request );