Действие Home в PHP: от простого к сложному

Раздел: Разработка веб-приложений -> MVC архитектура

Реализация экшена home в PHP MVC

Основной подход: простой роутер и контроллер

Наиболее эффективное решение для действия home в PHP MVC - использование фронт-контроллера, который маршрутизирует запрос к корню сайта на метод контроллера. Это обеспечивает единую точку входа и гибкость.


// index.php - фронт-контроллер
require 'vendor/autoload.php';

$uri = $_SERVER['REQUEST_URI'];
$method = $_SERVER['REQUEST_METHOD'];

if ($uri === '/' && $method === 'GET') {
    $controller = new \App\Controllers\HomeController();
    $controller->index();
} else {
    http_response_code(404);
    echo 'Страница не найдена';
}

Home php action (действие home в php)


// app/Controllers/HomeController.php
namespace App\Controllers;

class HomeController
{
    public function index()
    {
        $data = ['title' => 'Главная'];
        include __DIR__ . '/../Views/home.php';
    }
}

Home php code (код home в php)


// app/Views/home.php
<!DOCTYPE html>
<html>
<head>
    <title><?= htmlspecialchars($data['title']) ?></title>
</head>
<body>
    <h2>Добро пожаловать!</h2>
</body>
</html>

Models home php (модели home в php)

Шаги: подключение автозагрузчика Composer, получение URI, проверка условия, вызов метода контроллера, подключение вида с экранированием данных. Такой подход минимизирует накладные расходы и легко расширяется.

Как реализовать home action без использования классов?

Можно обработать запрос прямо во фронт-контроллере с помощью анонимной функции.


$uri = $_SERVER['REQUEST_URI'];
if ($uri === '/') {
    $render = function() {
        echo '<h2>Главная страница</h2>';
    };
    $render();
}

Home php view (представление home в php)

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

Как использовать шаблонизатор Twig для home action?

Установите Twig через Composer, создайте шаблон и передайте данные из контроллера.


// composer require twig/twig
$loader = new \Twig\Loader\FilesystemLoader(__DIR__ . '/templates');
$twig = new \Twig\Environment($loader);
echo $twig->render('home.html.twig', ['title' => 'Главная']);

Index php controller (контроллер в php (mvc))

Преимущество: автоматическое экранирование, наследование шаблонов.

Как добавить middleware перед home action?

Можно использовать цепочку вызовов. Например, проверка авторизации.


function authMiddleware($next) {
    if (!isset($_SESSION['user'])) {
        header('Location: /login');
        exit;
    }
    $next();
}

authMiddleware(function() {
    // home action
    echo 'Добро пожаловать, ' . $_SESSION['user'];
});

Php action view view (представление (view) в действии php)

Это позволяет отделить проверки от бизнес-логики.

Как организовать home action для REST API?

Вместо HTML возвращается JSON.


header('Content-Type: application/json');
echo json_encode(['status' => 'ok', 'message' => 'Home API']);

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

Типичные ошибки и их решение

  • 404 при правильном URI - проверьте, что точка входа index.php обрабатывает все запросы. Настройте веб-сервер (Apache: RewriteRule, Nginx: try_files).
  • Проблемы с namespace - убедитесь, что автозагрузка настроена в composer.json (psr-4).
  • XSS в представлении - всегда используйте htmlspecialchars() или экранирование шаблонизатора.
  • Неверный путь к файлу вида - используйте абсолютные пути через __DIR__ или корень приложения.
  • Маршрутизация ломается при добавлении GET-параметров - правильно извлекайте путь без query string (parse_url).

Подробный пример реализации home action с полной структурой

Структура проекта

Пример

project/
├── app/
│   ├── Controllers/
│   │   └── HomeController.php
│   ├── Models/
│   │   └── User.php
│   ├── Views/
│   │   └── home.php
│   └── Core/
│       └── Router.php
├── public/
│   └── index.php
├── vendor/
├── composer.json
└── .htaccess

Шаг 1: Файл .htaccess (в public/)

Пример

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]

Перенаправляет все запросы на index.php.

Шаг 2: composer.json

Пример

{
    "autoload": {
        "psr-4": {
            "App\\": "app/"
        }
    }
}

Затем composer dump-autoload.

Шаг 3: Фронт-контроллер public/index.php

Пример

<?php
require __DIR__ . '/../vendor/autoload.php';

use App\Core\Router;

$router = new Router();
$router->add('GET', '/', 'HomeController@index');
$router->dispatch($_SERVER['REQUEST_METHOD'], $_SERVER['REQUEST_URI']);

Шаг 4: Роутер app/Core/Router.php

Пример

<?php
namespace App\Core;

class Router
{
    private $routes = [];

    public function add($method, $path, $handler)
    {
        $this->routes[] = [
            'method' => $method,
            'path' => $path,
            'handler' => $handler
        ];
    }

    public function dispatch($method, $uri)
    {
        $uri = parse_url($uri, PHP_URL_PATH);
        foreach ($this->routes as $route) {
            if ($route['method'] === $method && $route['path'] === $uri) {
                list($controller, $action) = explode('@', $route['handler']);
                $class = "App\\Controllers\\$controller";
                $instance = new $class();
                $instance->$action();
                return;
            }
        }
        http_response_code(404);
        echo '404 Not Found';
    }
}

Шаг 5: Контроллер app/Controllers/HomeController.php

Пример

<?php
namespace App\Controllers;

use App\Models\User;

class HomeController
{
    public function index()
    {
        $user = new User();
        $users = $user->getAll(); // пример работы с моделью
        $data = [
            'title' => 'Главная страница',
            'users' => $users
        ];
        include __DIR__ . '/../Views/home.php';
    }
}

Шаг 6: Представление app/Views/home.php

Пример

<!DOCTYPE html>
<html>
<head>
    <title><?= htmlspecialchars($data['title']) ?></title>
</head>
<body>
    <h2><?= htmlspecialchars($data['title']) ?></h2>
    <ul>
        <?php foreach ($data['users'] as $user): ?>
            <li><?= htmlspecialchars($user['name']) ?></li>
        <?php endforeach; ?>
    </ul>
</body>
</html>

Результат при GET запросе к /




    Главная страница


    

Главная страница

  • Иван
  • Мария
  • Петр

В выводе присутствуют данные из модели User, переданные через контроллер.

Действие home в PHP - comments

En
Home php action (php)