MVC控制器的一个示例

BDu*_*elz 39 php model-view-controller

我一直在阅读很多关于如何以及为什么在应用程序中使用MVC方法的内容.我已经看到并理解了一个模型的例子,我已经看到并理解了View的例子....但我仍然在控制器上有点模糊.我真的很想看到一个完整的控制器示例.(如果可能,使用PHP,但任何语言都会有帮助)

谢谢.

PS:如果我能看到一个index.php页面的例子,它会决定使用哪个控制器以及如何使用它.

编辑:我知道控制器的工作是什么,我只是不知道如何在OOP中实现这一点.

Fra*_*anz 62

请求示例

把这样的东西放在你的index.php:

<?php

// Holds data like $baseUrl etc.
include 'config.php';

$requestUrl = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$requestString = substr($requestUrl, strlen($baseUrl));

$urlParams = explode('/', $requestString);

// TODO: Consider security (see comments)
$controllerName = ucfirst(array_shift($urlParams)).'Controller';
$actionName = strtolower(array_shift($urlParams)).'Action';

// Here you should probably gather the rest as params

// Call the action
$controller = new $controllerName;
$controller->$actionName();
Run Code Online (Sandbox Code Playgroud)

真的很基本,但你明白了......(我也没有注意加载控制器类,但我想这可以通过自动加载或者你知道如何去做.)

简单的控制器示例(controllers/login.php):

<?php    

class LoginController
{
    function loginAction()
    {
        $username = $this->request->get('username');
        $password = $this->request->get('password');

        $this->loadModel('users');
        if ($this->users->validate($username, $password))
        {
            $userData = $this->users->fetch($username);
            AuthStorage::save($username, $userData);
            $this->redirect('secret_area');
        }
        else
        {
            $this->view->message = 'Invalid login';
            $this->view->render('error');
        }
    }

    function logoutAction()
    {
        if (AuthStorage::logged())
        {
            AuthStorage::remove();
            $this->redirect('index');
        }
        else
        {
            $this->view->message = 'You are not logged in.';
            $this->view->render('error');
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,控制器负责应用程序的"流程" - 即所谓的应用程序逻辑.它不关心数据存储和表示.它收集所有必要的数据(取决于当前的请求)并将其分配给视图...

请注意,这不适用于我所知道的任何框架,但我确信您知道这些函数应该做什么.

  • +1我最近一直在阅读和搜索MVC,而且(对我而言)是我认为我已经看过的控制器最明显的例子. (16认同)
  • 或者只是将其视为AuthController.:) (4认同)
  • 值得注意的是,此示例不考虑安全性,这一点至关重要.该示例未实现任何使脚本处于攻击状态的编码和特殊字符.为什么?因为脚本将url中的任何内容(`$ _SERVER ['REQUEST_URI']`)注入到PHP脚本中.虽然好而清晰的MVC控制器示例. (2认同)