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)
如您所见,控制器负责应用程序的"流程" - 即所谓的应用程序逻辑.它不关心数据存储和表示.它收集所有必要的数据(取决于当前的请求)并将其分配给视图...
请注意,这不适用于我所知道的任何框架,但我确信您知道这些函数应该做什么.