Действие Home в PHP: от простого к сложному
Реализация экшена 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, переданные через контроллер.