mrKorg
@mrKorg
web developer

Как правильно написать Controller для блога на MVC PHP?

В качестве обучения пишу сайт на php с использованием mvc.
Упёрся в момент создания контроллера для записей блога.
Новость имеет url site/news/test_article
Уже реализовал функционал сохранения статьи из админки в БД, выполнил транслитерацию названия (заголовка), сохранил его в качестве алиаса.
Так вот как правильно описать контроллер для статьи?
По моей логике route считывает url, первая часть после доменного имени - это имя контроллера, вторая - это action. Но как быть, если использовать алиасы для url каждой записи?
Вот это написано для страницы новостей:
<?php
class NewsController extends Controller
{
    public function indexAction(){
        $news = new News();
        $data = $news->get_news();
        $this->view->render("news/index", ["news"=>$data]);
    }
}


Route.php
<?php

class Route // Для разбора одрессной строки
{
    // Стартовая функция
    public static function start(){

        // Autoload models
        spl_autoload_register(function($models){
            if(file_exists("app/models/".$models.".php")){
                include_once "app/models/".$models.".php";
            }
        });

        $baseController = "Index"; // Дефолтный controller
        $baseAction = "index"; // Дефолтный action
        $routs = explode("/", $_SERVER["REQUEST_URI"]); // Принимаем url и разбиваем его по слешам

        // Проверка части url после первого слеша (отвечающего за controller)
        if(!empty($routs[1])){
            $baseController = $routs[1]; // Переопределение controller
        }

        // Преобразование строки в нижний регистр + Преобразование первого символа строки в верхний регистр + "Controller"
        $baseController = str_replace("-", "_", $baseController);
        $baseController = ucfirst(strtolower($baseController)) . "Controller";
        $controllerPath = "app/controllers/" . $baseController . ".php"; // Полный путь к controller

        // Проверка части url после второго слеша (отвечающего за action)
        if(!empty($routs[2])){
            $baseAction = $routs[2]; // Переопределение action
        }

        // Преобразование строки в нижний регистр
        $baseAction = str_replace("-", "_", $baseAction);
        $baseAction = strtolower($baseAction) . "Action";

        // Проверка наличия файла
        if(file_exists($controllerPath)){
            include_once $controllerPath;
        } else {
            self::error404();
        }

        // Создание объекта controller
        $controller = new $baseController;

        // Проверка существования метода
        if(method_exists($controller, $baseAction)){
            $controller->$baseAction();
        } else {
            self::error404();
        }

    }

    public static function error404(){
        $host = "http://" . $_SERVER["HTTP_HOST"] . "/"; // Адрес сайта
        header("HTTP/1.1 404 Not Found"); // Заголовок
        header("Status 404 Not Found"); // Статус
        header("Location: " . $host . "error404"); // Редирект
    }
}
  • Вопрос задан
  • 3967 просмотров
Решения вопроса 1
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Если для обучения...
1) Автолоад в контроллере? За что? Хочешь пользоваться автолоадом - выведи в какой-то базовый бутстрап что-ли. Вообще сегодня уже неймспейсы можно юзать, говорят удобно и модно )
2) Акшн и контроллер нужно бы проверить на наличие левых символов. Например регулярными выражениями.
3) В идеале все возможные/допустимые роуты должны быть описаны, обычно в отдельном объекте route. Там же и прописываются правила для расшифровки, что(например алиас статьи в $routs[2]) и какое (например альфанумерик) значение лежит в путях. Он и передается в конструктор роутера. По этому он обычно не статик. Хотя тут у кого как реализовано.
4) Есть ненулевая вероятность существования переменных в урл ДО контроллера, например языковой префикс: www.mysite.com/ru/someaction/somecontroller
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Глянь данный репозиторий https://github.com/panique/mini
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы