Модель в MVC

Модель



МОДЕЛЬ (class News)



К ней мы будем обращаться в наших контроллерах для получения данных.


Допустим нам нужны десять последних новостей для страницы с новостями "Список новостей" и одна новость для страницы "Просмотр одной новости" из базы данных test2:


Таблица news базы данных test2:


MVC-4-1




Добавляем модель для новостей, для этого мы создаем файл News.php в папке models.


Файловая структура сайта test2:


MVC-4-2




В этом классе будет два метода:


public static function getNewsItemById($id) - этод метод возвращает одну новость по индификатору

public static function getNewsList() - этод метод возвращает список новостей


Для того, чтобы использовать нашу модель News в контроллере NewsController.php, ее нужно подключить:


// подключение модели - используется путь к файлу News.php относительно корня проекта

include_once ROOT . '/models/News.php';


Теперь мы можем использовать в наших экшенах (class NewsController) методы модели News.php

Мы будем обращаться к ним статически, так как это статические методы.

Получать из них какие-то данные и распечатывать результаты:


Файл NewsController.php


-- файл NewsController.php --

<?php
// подключение модели:
// используется путь к файлу News.php относительно корня проекта
include_once ROOT . '/models/News.php';
class NewsController
{
// Список новостей
public function actionIndex()
{
$newsList = array();

// обращение к статическому методу модели
$newsList = News::getNewsList();

echo '<pre>';
print_r($newsList);
echo '</pre>';

return true;
}

// Просмотр одной новости
public function actionView($id)
{
if ($id)
{
// обращение к статическому методу модели
$newsItem= News::getNewsItemById($id);

echo '<pre>';
print_r($newsItem);
echo '</pre>';

// echo 'actionView';
}
}
?>





Также нам необходимо обновить наши роуты, для того, чтобы они соответствовали написанным экшенам:


Файл routes.php


-- файл routes.php --

<?php
// маршруты
return array
(
'news/([0-9]+)' => 'news/view/$1', // actionView в NewsController
'news' => 'news/index', // actionIndex в NewsController
);
// - где 'news' - строка запроса
// 'news/index' - имя контроллера и экшена для обработки этого запроса (путь обработчика)
?>





Реализуем метод getNewsList() модели News:


Файл News.php


-- файл News.php --

<?php
..........
..........
..........
// этод метод возвращает список новостей
public static function getNewsList()
{
// Запрос к БД
// Параметры соединения:
// работаем с локальным хостом,
$host = 'localhost';
// и будем соединяться с локальной БД (локальная база данных test2)
$dbname = 'test2';
$user = 'root';
$password = '';

// Создаем объект класса PDO, передав в конструктор параметры соединения
// при помощи этого объекта ($db), мы будем общаться с БД
$db = new PDO("mysql:host=$host; dbname=$dbname", $user, $password);

// После этого, создаем пустой массив для результатов
$newsList = array();

// описываем нужный запрос к базе данных
// (Выбрать 10 последних новостей из таблицы "новости")
$result = $db->query('SELECT id, title, date, short_content'
. 'FROM news'
. 'ORDER BY date DESC'
. 'LIMIT 4');

// В цикле обращаемся к методу fetch() объекта в переменной $result
// при этом в цикле мы будем получать доступ к переменной $row,
// которая символизирует строку из БД
// (При работе с PDO - используется Объектно-Ориентированный Подход)
// В цикле мы записываем необходимые полученные данные в массив результата
// и далее, возвращаем этот массив: return $newsList

$i = 0;
while ($row = $result->fetch()){
$newsList[$i]['id'] = $row['id'];
$newsList[$i]['title'] = $row['title'];
$newsList[$i]['date'] = $row['date'];
$newsList[$i]['short_content'] = $row['short_content'];
$i++ ;
}
return $newsList ;
}
..........
..........
..........
?>





В нашем контроллере (NewsController.php) мы уже обратились к методу getNewsList() :


$newsList = News::getNewsList();


поэтому можем проверить на практике, как работает наш метод.

- в адресной строке введем: test2/news

В результате получим массив в котором содержатся все новости.


Далее реализуем следующий метод getNewsItemById($id) модели News:


Файл News.php


-- файл News.php --

<?php
..........
..........
..........
// этод метод возвращает одну новость по индификатору в запросе ($id)
public static function getNewsItemById($id)
{
// Запрос к БД
$id = intval($id);
if ($id){
$host = 'localhost';
$dbname = 'test2';
$user = 'root';
$password = '';

// Создаем объект класса PDO, передав в конструктор параметры соединения
// при помощи этого объекта ($db), мы будем общаться с БД
$db = new PDO("mysql:host=$host; dbname=$dbname", $user, $password);
$result = $db->query('SELECT * FROM news WHERE id=' . $id);

// Чтобы данные из базы данных не дублировались,
// (ключами в массиве являются и названия колонок, и позиция колонок),
// используем специальную константу:
// ::setFetchMode —
// - устанавливает режим выборки по умолчанию для объекта запроса

// $result->setFetchMode(PDO::FETCH_NUM); -
// - оставит идексы номеров колонок

$result->setFetchMode(PDO::FETCH_ASSOC);
// - оставит индексы в виде названий
$newsItem = $result->fetch();
return $newsItem;
}
}
..........
..........
..........
?>





- в адресной строке введем: test2/news/1

В результате получим массив одной новости.



Код подключения к БД - повторяется в методах getNewsItemById($id) и getNewsList(), кроме того, при необходимости поменять пароль, надо будет менять его во всех методах.

Код для получения объекта класса PDO, мы можем прописать в статическом методе getConnection у класса Db:


Создадим класс Db в папке components и перенесем туда наш код:


Файл Db.php


-- файл Db.php --

<?php
class Db
{
public static function getConnection()
{
// получаем параметры соединения
// из отдельного файла db_params.php в папке config
$paramsPath = ROOT . '/config/db_params.php';
$params = include($paramsPath);

// создаем объект класса PDO
$dsn = "mysql:host={$params['host']}; dbname={$params['dbname']}";
$db = new PDO($dsn , $params['user'], $params['password']);

return $db;
// возвращаем объект класса PDO, мы его получим в классе News:
// - $db = Db::getConnection
}
}
?>





НЕ ЗАБЫВАЕМ в FRONT CONTROLLER подключить класс Db !!! :


require_once (ROOT.'/components/Db.php'); // Установка соединения с БД



Класс Db находится в папке components и относится непосредственно к нашему каркасу. Здесь есть статический метод getConnection(), в котором мы используем параметры соединения к базе данных.

Параметры соединения вынесем в отдельный файл, для того, чтобы не нужно было искать их каждый раз - точно такой же прием, как и с роутами.


Создадим файл db_params.php в папке config:


Файл db_params.php


-- файл db_params.php --

<?php
// Массив с параметрами соединения
return array(
'host' => 'localhost',
'dbname' => 'test2',
'user' => 'root',
'password' => '',
};
?>





В итоге объект класса PDO мы получаем в наших методах getNewsItemById($id) и getNewsList() класса модели (class News):


$db = Db::getConnection;


и далее можем с ними работать.


Окончательно в классе модели (News.php) получаем :


Файл News.php


-- файл News.php --

<?php
// МОДЕЛЬ

class News
{

// этод метод возвращает одну новость по индификатору в запросе ($id)
public static function getNewsItemById($id)
{
$id = intval($id);
if ($id){
// получаем объект класса PDO из класса Db
$db = Db::getConnection();

$result = $db->query('SELECT * FROM news WHERE id=' . $id);

// - оставит индексы ввиде названий
$result->setFetchMode(PDO::FETCH_ASSOC);
$newsItem = $result->fetch();
return $newsItem;
}
}

// этод метод возвращает список новостей
public static function getNewsList()
{
// получаем объект класса PDO из класса Db
$db = Db::getConnection();
$newsList = array();

// Описываем нужный запрос к базе данных
// (Выбрать 4 последние новости из таблицы "новости",
// отсортировать по дате)
$result = $db->query('SELECT id, title, date, short_content'
. ' FROM news '
. 'ORDER BY date'
.' DESC LIMIT 4');

// В цикле обращаемся к методу fetch() объекта в переменной $result
// при этом в цикле мы будем получать доступ к переменной $row,
// которая символизирует строку из БД
// (При работе с PDO - используется Объектно-Ориентированный Подход)
// В цикле мы записываем необходимые полученные данные в массив результата
// и далее, возвращаем этот массив: return $newsList

$i = 0;
while($row = $result->fetch()) {
$newsList[$i]['id'] = $row['id'];
$newsList[$i]['title'] = $row['title'];
$newsList[$i]['date'] = $row['date'];
$newsList[$i]['short_content'] = $row['short_content'];
$i++ ;
}
return $newsList ;
}
}
?>





Файловая структура сайта test2:


MVC-4-3






Наверх Наверх