MVC 控制器示例

2022-08-30 11:54:17

我一直在阅读很多关于如何在应用程序中使用MVC方法以及为什么使用MVC方法的信息。我看过并理解了模型的例子,我看到并理解了视图的例子。但我在控制器上仍然有点模糊。我真的很想看到一个足够全面的控制器示例。(如果可能的话,在PHP中,但任何语言都会有所帮助)

谢谢。

PS:如果我可以看到一个索引.php页面的示例,该页面决定使用哪个控制器以及如何使用,那也很棒。

编辑:我知道控制器的工作是什么,我只是不太明白如何在OOP中做到这一点。


答案 1

请求示例

将类似这样的东西放入您的 :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();

真的很基本,但你明白了...(我也没有负责加载控制器类,但我想这可以通过自动加载来完成,或者你知道怎么做。

简单控制器示例(控制器/登录.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');
        }
    }
}

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

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


答案 2

想象一下 UI 中的三个屏幕,一个是用户输入一些搜索条件的屏幕,一个是显示匹配记录摘要列表的屏幕,另一个是选择记录后显示记录以供编辑的屏幕。将有一些与初始搜索相关的逻辑

if search criteria are matched by no records
    redisplay criteria screen, with message saying "none found"
else if search criteria are matched by exactly one record
    display edit screen with chosen record
else (we have lots of records)
    display list screen with matching records

这种逻辑应该去哪里?肯定不在视图或模型中?因此,这是控制器的工作。控制器还将负责获取条件并调用模型方法进行搜索。


推荐