我的PHP控制器是否构造错误?代码在错误的地方

时间:2011-05-15 01:24:09

标签: php mysql model-view-controller

我对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.";   
            }                               
        }   
    }

3 个答案:

答案 0 :(得分:2)

尝试将mysql连接完全移动到模型,控制器不应该知道您正在使用什么类型的数据库以及如何连接它。试着用这种方式来思考它:

  • 视图仅向用户显示页面;
  • 控制器通过执行计算,与模型交互并加载视图来回答请求;
  • 您应该始终能够更改任何组件,而不会影响与之交互的组件;

答案 1 :(得分:0)

正如你所说,模型是你应该把你的dabatase代码放在上面的地方。控制器处理用户看到的内容。在PHP中,控制器通常不是一个类,而是为了保持实用,只是用户导航到的php文件,它控制该视图发生的事情。控制器不需要知道数据库是如何实现的,甚至不需要知道数据库的使用情况,因此例如交易信息不好。

答案 2 :(得分:0)

从外观上看,似乎有些代码会进入控制器。

这是MVC的细分:

  • 模型:访问数据库,最好使用面向对象的方法来处理像对象这样的数据。
  • 查看:页面的HTML。
  • 控制器:允许构建动态网页的逻辑。

这可能听起来很抽象。视图的一般概念是它们是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.

因此,模型不必拥有最多的编码。在我看来,控制器会有很多代码,但这完全取决于你正在构建的复杂性。

希望能为你清除它。