PHP MVC
Модель
МОДЕЛЬ (class News)
К ней мы будем обращаться в наших контроллерах для получения данных.
Допустим нам нужны десять последних новостей для страницы с новостями "Список новостей" и одна новость для страницы "Просмотр одной новости" из базы данных test2:
Таблица news базы данных test2:
Добавляем модель для новостей, для этого мы создаем файл News.php в папке models.
Файловая структура сайта test2:
В этом классе будет два метода:
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 . '/models/News.php';
class
{
// Список новостей
public function ()
{
$newsList = array();
// обращение к статическому методу модели
$newsList = ();
echo '<pre>';
($newsList);
echo '</pre>';
return true;
}
// Просмотр одной новости
public function ($id)
{
if ($id)
{
// обращение к статическому методу модели
$newsItem= ($id);
echo '<pre>';
($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 ()
{
// Запрос к БД
// Параметры соединения:
// работаем с локальным хостом,
$host = 'localhost';
// и будем соединяться с локальной БД (локальная база данных test2)
$dbname = 'test2';
$user = 'root';
$password = '';
// Создаем объект класса PDO, передав в конструктор параметры соединения
// при помощи этого объекта ($db), мы будем общаться с БД
$db = new ("mysql:host=$host; dbname=$dbname", $user, $password);
// После этого, создаем пустой массив для результатов
$newsList = array();
// описываем нужный запрос к базе данных
// (Выбрать 10 последних новостей из таблицы "новости")
$result = $db-> ('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-> ()){
$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 ($id)
{
// Запрос к БД
$id = ($id);
if ($id){
$host = 'localhost';
$dbname = 'test2';
$user = 'root';
$password = '';
// Создаем объект класса PDO, передав в конструктор параметры соединения
// при помощи этого объекта ($db), мы будем общаться с БД
$db = new ("mysql:host=$host; dbname=$dbname", $user, $password);
$result = $db-> ('SELECT * FROM news WHERE id=' . $id);
// Чтобы данные из базы данных не дублировались,
// (ключами в массиве являются и названия колонок, и позиция колонок),
// используем специальную константу:
// ::setFetchMode —
// - устанавливает режим выборки по умолчанию для объекта запроса
// $result->setFetchMode(PDO::FETCH_NUM); -
// - оставит идексы номеров колонок
$result-> ( ::FETCH_ASSOC);
// - оставит индексы в виде названий
$newsItem = $result-> ();
return $newsItem;
}
}
..........
..........
..........
?>
- в адресной строке введем: test2/news/1
В результате получим массив одной новости.
Код подключения к БД - повторяется в методах getNewsItemById($id) и getNewsList(), кроме того, при необходимости поменять пароль, надо будет менять его во всех методах.
Код для получения объекта класса PDO, мы можем прописать в статическом методе getConnection у класса Db:
Создадим класс Db в папке components и перенесем туда наш код:
Файл Db.php
-- файл Db.php --
<?php
class
{
public static function ()
{
// получаем параметры соединения
// из отдельного файла db_params.php в папке config
$paramsPath = . '/config/db_params.php';
$params = include($paramsPath);
// создаем объект класса PDO
$dsn = "mysql:host={$params['host']}; dbname={$params['dbname']}";
$db = new ($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
{
// этод метод возвращает одну новость по индификатору в запросе ($id)
public static function ($id)
{
$id = ($id);
if ($id){
// получаем объект класса PDO из класса Db
$db = :: ();
$result = $db-> ('SELECT * FROM news WHERE id=' . $id);
// - оставит индексы ввиде названий
$result-> ( ::FETCH_ASSOC);
$newsItem = $result-> ();
return $newsItem;
}
}
// этод метод возвращает список новостей
public static function ()
{
// получаем объект класса PDO из класса Db
$db = :: ();
$newsList = array();
// Описываем нужный запрос к базе данных
// (Выбрать 4 последние новости из таблицы "новости",
// отсортировать по дате)
$result = $db-> ('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-> ()) {
$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:
Наверх Наверх