我正在尝试使用OO设计来改进一些PHP脚本(它现在是带有一些OO部分的过程)。澄清一下,我并不是在尝试构建一个完整的MVC应用程序,而是在尝试尽可能地分离各个部分。我以前从未在PHP中使用过MVC(在Java中只使用过一点点)。
当使用谷歌时,我发现100种不同的PHP MVC方法,我找不到一本关于这个主题的好书。如果有人能给我推荐一本关于PHP中OO设计的好书,我将不胜感激。
目前,将用户添加到数据库的部分(假设用户现在只包含名字)看起来像这样(users.php):
$validator = new UserValidator();
if ($validator->validate($_POST['user_firstname']))
$result = $db->execute("INSERT INTO `users` (`user_firstname`) VALUES (?)", $_POST['user_firstname']);
知道添加用户可能在多个地方完成,我不希望代码重复,我将创建一个usermodel。这个类将包含一个addUser()方法。我有点困惑的是验证。UserValidator将检查是否所有字段都被正确填写。
我可以这样做:
$validator = new UserValidator();
if ($validator->validate($_POST['user_firstname']))
$result = $user->addUser($_POST['user_firstname']);
但是我也可以这样做:
$result = $user->adduser($_POST['user_firstname'];
现在,user -类将包含验证器,addUser()方法将执行此验证。假设上面的代码是控制器,那么哪个选项是最好的呢?将验证功能委托给模型还是在控制器中进行?
同样的问题也适用于获取某个用户的信息。不是每个人都能得到这个信息,所以我的代码看起来像这样:
if ($user->hasAccess($_SESSION['id'], $_GET['id'])
$user->getUserById($_GET'id']);
(hasAccess()-方法将检查登录的用户是否可以查看特定用户id的详细信息)
但是我也可以调用getUserById()然后检查你是否在那个方法中有访问权。哪个选项是最好的?
谢谢!
在您的第一个示例中,将验证逻辑放在调用$result = $user->adduser($_POST['user_firstname'];
中是更简洁的方法。让你的控制器保持苗条,让你的模型处理尽可能多的逻辑。理想情况下,你的控制器负责协调将传递给你的"视图"的数据,无论它是什么。
你的第二个例子不太清楚。您可能在hasAccess()
中有不属于getUserById()
的逻辑,或者您可能为getUserById()
创建了比该方法有意义的更多的工作。尽可能保持相似的功能总是最好的,但是有一些假设不能仅仅通过查看您发布的两行来做出。
我经常使用CakePHP,这是一个PHP的MCV框架,在这种情况下,UserValidator将被分解成一个称为"组件"的单独实体。控制器将在保存之前调用组件进行验证,然后,如果所有验证都通过,则将数据发送到模型进行保存。
我认为创建一个单独的验证器类,可以检查控制器中的数据可能是可行的方法。