gpt4 book ai didi

php - MVC验证建议

转载 作者:行者123 更新时间:2023-12-03 08:03:21 25 4
gpt4 key购买 nike

我目前正在验证“胖 Controller ”中的输入和返回错误,如下所示:

class SomeController
{
public function register()
{
// validate input
$username = isset($_POST['username']) && strlen($_POST['username']) <= 20 ? $_POST['username'] : null;

// proceed if validation passed
if (isset($username)) {
$user = $this->model->build('user');
if ($user->insert($username)) {
$_SESSION['success'] = 'User created!';
} else {
$_SESSION['error'] = 'Could not register user.';
}
} else {
$_SESSION['failed']['username'] = 'Your username cannot be greater than 20 characters.';
}

// load appropriate view here
}
}

class SomeModel
{
public function insert($username)
{
// sql for insertion
// ...

return $result;
}
}

尽管这可行并且很容易实现,但我理解这是不正确的,因为验证属于模型,我正尝试使用“胖模型”来进行纠正,如下所示:
class SomeController
{
public function register()
{
$user = $this->model->build('user');
$user->insert($_POST['username']);

// load appropriate view here
// ...
}
}

class SomeModel
{
public function insert($username)
{
// validate input
$error = false;
$username = trim($username) != '' && strlen($username) <= 20 ? $username : null;

// proceed if validation passed
if (isset($username)) {
// sql for insertion
// ...

$_SESSION['success'] = 'User created!';
} else {
// store error in session
$error = true;
$_SESSION['error']['username'] = 'Your username cannot be greater than 20 characters ';
}

return $error ? false : true;
}
}

我在这里看到的问题是该模型应该是可移植的,因为它永远不需要更改。但是,如果对 $username长度的要求发生了变化,那么显然我将不得不更改我的模型。

我觉得这可能是一个非常普遍的问题,但是我还没有找到直接的答案。在没有实现任何额外的“层”,“映射器”或任何其他令人困惑的术语的情况下,如何修改提供的示例伪代码以正确处理此事务? (例如,验证输入,如果验证失败,则返回错误)?

最佳答案

Without implementing any extra "layers", "mappers" or whatever



您应该将“模型”视为应用程序 而不是单个类。术语“层”可以被认为是引用MVC三明治的M条的一种简单方法。因此,要获得所需的灵活性,就需要创建它。

可以进行许多清晰的分离。我将考虑具有三个抽象:服务,数据映射器和实体。

服务将向 Controller 公开并执行所请求的服务。
// some controller
function register() {
$service = $this->getUserService();
$user = $service->register($_POST['first_name'], $_POST['last_name']);
if ($user instanceof \My\Entity\User) {
// set user in view
} else {
// redirect to error
}
}

任务一完成, Controller 现在对寄存器中发生的任何事情都无能为力,它只想知道如何解决适当的结果。如果有一个用户对象,则成功,否则返回false表示出错。

服务类本身将封装所提供的服务:
// class UserService.php
function register($firstname, $lastname) {
// validate arguments
if ($this->isValidUsername(....
$userMapper = $this->getUserMapper();
$user = new My\Entity\User();
$user->setFirstName($firstname);
$user->setLastName($lastname);
return $userMapper->save($user);
}
return false;
}

我们处理参数的验证,并创建新用户,将其传递给 数据映射器,该映射器将执行“实际保存”,提取数据库操作。
// UserMapper
function save($user) {
// save $user to db
$sql = 'INSERT INTO ....

return true;
}

关于php - MVC验证建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19351502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com