我对 MVC 有一些了解,尽管我仍在弄清楚很多细节。我写了一些小的个人项目来学习,虽然我仍然不太确定如何做的一件事是优雅地处理三个之间的逻辑以确定我应该加载什么视图。
例如,想象一个基本的用户注册系统。每个用户都需要有一个用户名、密码和一些其他详细信息来识别他们。我会像这样对模型进行编码:
namespace Model;
class NewUser extends Model
{
public $username;
public $password;
public $other_details;
public function __construct(array $data)
{
if ($this -> CheckData($data))
{
// Add data to some database table.
$this -> InsertData($data);
}
}
private function CheckData(array $data)
{
if (!isset($data['username']) || empty($data['username']))
{
return FALSE;
}
// !isset() and empty() checks on other required information.
if (strlen($data['password']) < 8)
{
return FALSE;
}
// Make sure data meets other requirements, return FALSE if not.
return TRUE;
}
}
所以这很简单。NewUser::CheckData() 确保传入的数据符合新用户的要求。所有信息必须非空,密码至少八个字符等。如果不满足要求,则失败并且不添加数据。如果满足,则将新用户添加到系统中。
控制器处理客户端发出的 HTTP 请求,请求适当的数据,然后“给”客户端 HTTP 响应,因此我将编写控制器代码如下:
namespace Controller;
class NewUser extends Controller
{
public $new_user;
public function __construct()
{
if (isset($_POST) && !empty($_POST['username']))
{
$this -> new_user = new \Model\NewUser($_POST);
// How should I handle what View to load in this case?
}
else
{
$this -> DefaultView();
}
}
private function DefaultView()
{
$this -> LoadView('header.php');
$this -> LoadView('signup.php');
$this -> LoadView('footer.php');
}
private function MissingDataView()
{
$this -> LoadView('header.php');
$this -> LoadView('missing-data.php');
$this -> LoadView('footer.php');
}
private function PasswordTooShortView()
{
$this -> LoadView('header.php');
$this -> LoadView('password-too-short.php');
$this -> LoadView('footer.php');
}
}
再次,非常简单。如果 $_POST 未设置,则调用 DefaultView()。正如评论所指出的,在设置 $_POST 的情况下,我对如何确定要加载的视图感到困惑。过去$error
,我的模型中有一个额外的变量,然后我会检查控制器中设置的内容,并根据其值调用适当的方法。这似乎是一种糟糕的处理方式,所以如果有人能指出我正确的方向,我将不胜感激。