我对PHP MVC相当新,而且我没有100%销售我以最合乎逻辑的方式做到这一点。这是我的一个控制器的一段代码。一位朋友说这个代码的大部分都应该转移到模型中?是这样吗?
现在我有一个DataAccess层来完成所有SQL工作。对于用户工作,我有一个UserDataAccess对象,它将创建,更新和删除。看来我正在使用Data Mapper模式的一些东西。我的Model类直接映射到给定表上的数据库列,就是这样。
我不断对每段代码应该去的地方感到困惑。
// Posted values passed all checks.
if(count($errors) == 0)
{
try
{
// Get a Connection.
$connection = ConnectionFactory::GetConnection('mysql');
try
{
$connection->beginTransaction();
// Create DataAccess object.
$uda = new UserDataAccess();
// Check if username and email are avail.
if(count($uda->CheckUsername($connection, $user->Username)) > 0)
$errors['username_taken'] = "Username is taken";
if(count($uda->CheckEmail($connection, $user->Email)) > 0)
$errors['email_taken'] = "Email is taken";
if(count($errors) == 0)
{
// Perform Create.
$userId = $uda->CreateUser($connection, $user->GetArray());
// Add User to Rookie Role.
$uda->AddUserToRole($connection, 1, $userId);
// Commit connection.
$connection->commit();
}
// Clear connection.
$connection = null;
// Redirect user.
if(count($errors) == 0)
header('location: /' . $user->Username);
}
catch(PDOException $e)
{
$connection->rollBack();
$errors['internal'] = "Opps: There was an error processing the request.";
}
}
catch(Exception $e)
{
$errors['internal'] = "Opps: There was an error processing the request.";
}
}
}
答案 0 :(得分:2)
尝试将mysql连接完全移动到模型,控制器不应该知道您正在使用什么类型的数据库以及如何连接它。试着用这种方式来思考它:
答案 1 :(得分:0)
正如你所说,模型是你应该把你的dabatase代码放在上面的地方。控制器处理用户看到的内容。在PHP中,控制器通常不是一个类,而是为了保持实用,只是用户导航到的php文件,它控制该视图发生的事情。控制器不需要知道数据库是如何实现的,甚至不需要知道数据库的使用情况,因此例如交易信息不好。
答案 2 :(得分:0)
从外观上看,似乎有些代码会进入控制器。
这是MVC的细分:
这可能听起来很抽象。视图的一般概念是它们是HTML模板,具有最少的代码,优选地仅回显页面的某些动态元素(不是HTML,通常是纯文本)和/或一些if和foreach循环。例如:
.... Your HTML code
<?php foreach ($page->users as $user): /* Loops through all the users */ ?>
<li><?php echo $user->name; /* echo their name */ ?></li> /
<?php endforeach; ?>
.... Your HTML Code
控制器背后的想法是如何让您的页面实际工作,通过处理逻辑,获取输入等。例如:
class Controller extends BaseController{
function indexpage($args=array()){
if ($args[0] == 'user') $user = UserModel::listUsers(); // If the argument to the controller is 'user' (could be provided by GET, or just the URL, we won't go into that), list all users.
$this->render('yourViewPage', array('user' => $user)); // renders the view file named yourViewPage.php and pass the value of $user into a variable named 'user'. As shown by above accessed via $page->user.
}
}
虽然上面只是一个简单的例子,但你明白了。 render()
呈现页面并传递数组中的key => value
对,以便视图可以访问它们。
模型是数据库交互。它允许您在不使用SQL(最好)的情况下访问数据库。例如:
class UserModel{
public $name;
public $openid;
public static function listUsers($offset=0, $max=20){
global $persister;
return $persister->list('UserModel', 0, 20, array('order'=>'NAME DESC'));
}
}
// Create a new user. This usually goes into the controller
$user = User();
$user->name = 'Your User'; // sets name
$user->openid = 'htto://theiropenidprovider.com/openid'; // sets openid
$persister->track($user); // Adds the user to be tracked. (the tracking info is usually written in XML, but we won't go into that).
$persister->flushAll(); // Saves to the database (kinda like commit)
// Gets the user.
$persister->find('UserModel', 'name', 'Your User') // Find the user that has the name of "Your User" in all UserModel instanced tracked.
因此,模型不必拥有最多的编码。在我看来,控制器会有很多代码,但这完全取决于你正在构建的复杂性。
希望能为你清除它。