Мой PHP контроллер структурирован неправильно?Код в неправильном месте - PullRequest
0 голосов
/ 15 мая 2011

Я довольно новичок в 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 ]

2 голосов
/ 15 мая 2011

Попробуйте полностью перенести соединение mysql в модель, контроллеры не должны знать, какую базу данных вы используете и как вы к ней подключаетесь. Попробуйте думать об этом так:

  • При просмотре отображаются только страницы для пользователей;
  • Контроллеры отвечают на запросы, выполняя вычисления, взаимодействуя с моделями и загружая представления;
  • Вы всегда должны иметь возможность изменять любой из компонентов, не затрагивая те, которые взаимодействуют с ним;
0 голосов
/ 15 мая 2011

Судя по всему, какой-то код, который звучит, входит в контроллер.

Вот разбивка 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.

Таким образом, модели не должны иметь наибольшее количество кодов.По моему мнению, у контроллеров было бы много кода, но это полностью зависит от сложности того, что вы строите.

Надеюсь, что это прояснит для вас.

0 голосов
/ 15 мая 2011

Как вы сказали, Модель - это место, где вы должны поместить свой код базы данных выше. Контроллер обрабатывает то, что видит пользователь. В PHP контроллер часто не является классом, но для практического применения - это просто php-файл, к которому перемещается пользователь, который управляет тем, что происходит для этого представления. Контроллеру не нужно знать, как реализована БД или даже что она используется, поэтому, например, иметь информацию о транзакции нехорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...