Берём простой случай. Требования к сайту:
- динамическая генерация страниц
- блок новостей
То есть по идее должны быть две CRUD модели. Понятно, что редактирование, обновление и удаление доступно админу, чтение - всем пользователям.
Вопросы в следующем:
1) как правильно организовать модели и контроллеры?
2) как взаимодействовать с базой?
Все запросы будут отправляться файлу index.php, в нём создаваться экземпляр класса Route, в котором вызывается метод start
static function start($mRequestUri)
{
// контроллер и действие по умолчанию
$controller_name = 'Page';
$action_name = 'index';
$routes = explode('/', $mRequestUri);
// получаем имя контроллера
if ( !empty($routes[1]) )
{
$controller_name = $routes[1];
}
// получаем имя экшена
if ( !empty($routes[2]) )
{
$action_name = $routes[2];
}
// добавляем префиксы
$model_name = 'Model_'.$controller_name;
$controller_name = 'Controller_'.$controller_name;
$action_name = 'action_'.$action_name;
// подцепляем файл с классом модели (файла модели может и не быть)
$model_file = strtolower($model_name).'.php';
$model_path = "application/models/".$model_file;
if(file_exists($model_path))
{
include "application/models/".$model_file;
}
// подцепляем файл с классом контроллера
$controller_file = strtolower($controller_name).'.php';
$controller_path = "application/controllers/".$controller_file;
if(file_exists($controller_path))
{
include "application/controllers/".$controller_file;
}
else
{
/*
правильно было бы кинуть здесь исключение,
но для упрощения сразу сделаем редирект на страницу 404
*/
Route::ErrorPage404();
}
// создаем контроллер
$controller = new $controller_name;
$action = $action_name;
if(method_exists($controller, $action))
{
// вызываем действие контроллера
$controller->$action();
}
else
{
// здесь также разумнее было бы кинуть исключение
Route::ErrorPage404();
}
}
Контроллер страницы вероятно должен выглядеть следующим образом
class Controller_Page extends Controller {
function __construct()
{
$this->model = new Model_Page();
$this->view = new View();
}
function action_index()
{
$data = $this->model->get_data();
$this->view->generate('index_view.php', 'template_view.php', $data);
}
}
Класс Модели
class Model
{
public function get_data()
{
}
}
Для упрощения модель страницы описал так
<?php
class Model_Page extends Model {
function get_data() {
$mysqli = new mysqli('localhost', 'root', 'pass', 'dbname');
$result = $mysqli->query("SELECT * FROM ru_pages WHERE id=1");
$row = $result->fetch_object();
return array ('title' => $row->title);
$result->close();
}
}
Еще раз вопросы:
как правильно организовать модель и контроллер?
как вытащить обращение к базе в отдельный класс?