Добрый день! Сейчас изучаю MVC и пытаюсь приспособить один из примеров (
habrahabr.ru/post/150267 ) под свой сайт новостей.
На главной странице есть список новостей, клик на "Читать дальше" (
<a href=/fullnews/{$v['id']}>)
пепрекидывает на dpwork.loc/fullnews/15 (хочу типу как здесь
https://toster.ru/q/265105) 15 это номер статьи.
Но, тогда роутер записывает 15 в название action(метода) и ничего не работает, число также должно передаться в метод, что б с помощью него получить нужную статью.
Используя костыли(рядом комметарий КАПСОМ) я немного подшаманил в роутере.
<?php
class Route
{
static function start()
{
// контроллер и действие по умолчанию
$controller_name = 'Main';
$action_name = 'index';
$id = "";
$routes = explode('/', $_SERVER['REQUEST_URI']);
// получаем имя контроллера
if ( !empty($routes[1]) )
{
$controller_name = $routes[1];
}
// получаем имя экшена
if ( !empty($routes[2]) )
{
$action_name = $routes[2];
if(is_numeric($action_name)) // ЕСЛИ action_name БЫЛ ЧИСЛОМ ПРИСВАИВАЛ ЕМУ имя по умолчания, после прописывал переменую с числом
{
$action_name = 'index';
$id = $routes[2];
}
}
// добавляем префиксы
$model_name = 'Model_'.$controller_name;
$controller_name = 'Controller_'.$controller_name;
$action_name = 'action_'.$action_name;
/*echo "Model: $model_name <br>";
echo "Controller: $controller_name <br>";
echo "Action: $action_name <br>";
echo $id;*/
// подцепляем файл с классом модели (файла модели может и не быть)
$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
{
Route::ErrorPage404();
}
// создаем контроллер
$controller = new $controller_name;
$action = $action_name;
if(method_exists($controller, $action))
{
if (!is_null($id))
{
$controller->id = $id; // ЕСЛИ после первой проверки данные записывались в переменную id, Перед основным действием значения передавалось в свойство класса контролера для получения по нему статьи
}
// вызываем действие контроллера
$controller->$action();
}
else
{
Route::ErrorPage404();
}
}
function ErrorPage404()
{
$host = 'http://'.$_SERVER['HTTP_HOST'].'/';
header('HTTP/1.1 404 Not Found');
header("Status: 404 Not Found");
header('Location:'.$host.'404');
}
}
контроллер
<?php
class Controller_fullnews extends Controller
{
public $id;
function __construct()
{
$this->model = new Model_fullnews;
$this->view = new View;
}
function action_index()
{
$data = $this->model->get_data($this->id);
$this->view->generate('fullnews_view.php','template_view.php',$data);
}
}
модель
<?
class Model_fullnews extends Model {
public function get_data($id) {
$cat_news = "SELECT * FROM `news` WHERE `id` = $id";
$getnews = DB::obj()->connect()->query($cat_news);
if(is_null($getnews)) {
return [];
}
return $getnews->fetchALL(PDO::FETCH_ASSOC);
}
}
После костылей переходя по такой ссылке dpwork.loc/fullnews/15, я получал нужную статью и общую разметку. Но, файл css перестал подгружаться, потом разобравшись понял, что загружается он не с index.php, а с template_view.php который находиться в другой папке.
Как правильно реализовать данный вопрос?
Или как довести до костыль(но это на самый крайний случай)?
P.S. Если вы хотите помочь ответом, но вам, что то не понятно, из за плохо описаной проблемы. Задайте доп. вопрос в комментариях, я сразу отвечу. Извините, если плохо описано.