Fork me on GitHub

Модели

Это набор классов, который обеспечивает работу с базой данных.

Для тестирования и проверки реализовано три технологии работы с базой данных:

Рассмотрим основные возможности этих технологий на основе создания нового сообщения (поста).

Для работы с базами данных создан набор классов в папке app/Models/ доступ к которым обеспечивается провайдером app/Providers/ModelsServiceProvider.php с помощью метода load.

public function load($modelName, $modelMethod = null, $data = array()) {
    if (isset($this->app["models.{$modelName}"])) {
        $Model = $this->app["models.{$modelName}"];
    } else {
        $modelClass = "\\Models\\{$modelName}Model";
        $Model = new $modelClass();
        $Model->setApp($this->app);
        $this->app["models.{$modelName}"] = $Model;
    }
    return $Model->$modelMethod($data);
}

В нашем случае мы будем использовать класс модели PostModel app/Models/PostModel.php для работы с таблицей post в базе данных app/Resources/db/app.db.

Пример такого обращения к модели можно видеть здесь.

// Create new post
$models->load('Post', 'newPost', array('username' => $username, 'new_post' => $ormPost));

Doctrine(DBAL)

Пример добавления записи в таблицу post с помощью метода newPost класса PostModel app/Models/PostModel.php можно видеть здесь.

/**
 * newPost
 * Add post for current user
 * 
 * @param array $data
 * @return void
 */
public function newPost($data) {
    $db = $this->app['db'];
    //--------------------

    $username = $data['username'];
    $ormPost = $data['new_post'];
    // Transform the date to format 'Y-m-d'
    $date = new \DateTime($ormPost->getCreated());
    $ormPost->setCreated($date->format('Y-m-d'));
    $arrPost = $ormPost->getValues();

    // Get user's id
    $sql = "SELECT * FROM user WHERE username = ?";
    $user = $db->fetchAssoc($sql, array($username));
    if ($user === FALSE) {
        $this->app->abort(404, "Not find user for this username \"{$username}\"");
    }
    $arrPost['user_id'] = $user['id'];
    $db->insert('post', $arrPost);
}

Здесь переменная $ormPost является объектом данных класса Post app/Models/ORM/Post.php, который создан на основе Doctrine(DBAL) технологии.

Примеры объектов данных для работы с таблицами базы данных app/Resources/db/app.db можно посмотреть здесь app/Models/DBAL/.

Примеры работы с базой данных с помощью консольных команд можно посмотреть здесь app/Cosole/Commands/DBAL/.

Doctrine(ORM)

Пример получения всех сообщений (постов) для пользователя из таблицы post с помощью метода getPostsForUser класса PostModel app/Models/PostModel.php можно видеть здесь.

/**
 * getPostsForUser
 * Get posts for user
 * 
 * @param string $userName
 * @return array
 */
public function getPostsForUser($userName) {
    $em = $this->app['em'];
    $repo = $em->getRepository('Models\ORM\User');
    //--------------------
    $user = $repo->findOneByUsername($userName);

    if ($user === NULL) {
        $this->app->abort(404, "Not find user for this username \"{$userName}\"");
    }
    $posts = $user->getPosts();

    // Data for user's posts
    $data = array('username' => $user->getUsername(), 'posts' => $posts->toArray());

    return $data;
}

Примеры объектов данных для работы с таблицами базы данных app/Resources/db/app.db можно помотреть здесь app/Models/ORM/.

Примеры работы с базой данных с помощью консольных команд можно посмотреть здесь app/Cosole/Commands/ORM/.

PHP ActiveRecord

Пример получения всех сообщений (постов) из таблицы post с помощью метода postsAction класса TestController app/Controllers/TestController.php можно видеть здесь.

/**
 * Action - test/posts
 * receive posts written by the user
 * 
 * @param string $userName 
 * @param int $page 
 * @return string
 */
public function postsAction($userName, $page) {
    $app = $this->app;
    $db = $this->app['ar'];
    //--------------------
    try {
        ...
        // Get posts
        if ($userName) {
            ...
        } else {
            $posts = array();
            // Get user's posts
            $users = $db->find('user', 'all', array('select' => 'id, username'));
            foreach ($users as $user) {
                $posts[$user->username] = $user->post;
            }
            // Data for user's posts
            $data = array('posts' => $posts);
        }
        return $this->showView($data);
    } catch (\Exception $exc) {
        return $this->showError($exc);
    }
}

Доступ к работе с этим примером возможен в меню Testing/PHP ActiveRecord/User posts, если вы зайдете в приложение как Admin.

Примеры объектов данных для работами с таблицами базы данных app/Resources/db/app.db можно помотреть здесь app/Models/AR/.