Чтобы показать вам как сложно писать сайты без PHP-фреймворка, здесь мы создадим очень простой веб-сайт, состоящий из трех HTML-страниц: Home (Домашняя), Login (Вход) and Logout (Выход). Для данного примера мы не будем пользоваться никаким фреймворком и постараемся использовать только "чистый" PHP.
Не дайте ввести себя в заблуждение - писать сайты с PHP-фреймворком тоже может быть сложно, но с фреймворком вы будете делать это в упорядоченной и безопасной манере.
Когда вы пишете веб-сайт на PHP, вы помещаете свой код в файл с расширением .php. Такой файл также называется скриптом PHP.
Сначала давайте реализуем страницу Home для веб-сайта. Чтобы это сделать, создайте скрипт index.php в корневой директории документов Apache и поместите туда следующий код:
Чтобы понимать код, приведенный ниже, вам нужен опыт работы с PHP. Если у вас его нет, было бы хорошо, если бы вы обратились к руководству по PHP, например к w3schools.com.
<?php
// index.php
session_start();
// If user is logged in, retrieve identity from session.
$identity = null;
if (isset($_SESSION['identity'])) {
$identity = $_SESSION['identity'];
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Home page</title>
</head>
<body>
<h1>Home</h1>
<?php if ($identity==null): ?>
<a href="login.php">Sign in</a>
<?php else: ?>
<strong>Welcome, <?= $identity ?></strong> <a href="logout.php">Sign out</a>
<?php endif; ?>
<p>
This is a simple website to demonstrate the advantages of a PHP framework
and disadvantages of "pure" PHP.
</p>
</body>
</html>
Если вы теперь введете "http://localhost/index.php" в ваш браузер (например Google Chrome или Firefox), вы должны увидеть страницу, как приведена ниже:
Далее давайте создадим страницу Login. Такая страница обычно имеет форму с полями E-mail и Password. Когда пользователь отправляет форму, он проходит процедуру аутентификации и его личность сохраняется в сессию PHP. Наш скрипт бы выглядел следующим образом:
<?php
// login.php
session_start();
// If user is logged in, redirect him to index.php
if (isset($_SESSION['identity'])) {
header('Location: index.php');
exit;
}
// Check if form is submitted.
$submitted = false;
if ($_SERVER['REQUEST_METHOD']=='POST') {
$submitted = true;
// Extract form data.
$email = $_POST['email'];
$password = $_POST['password'];
// Authenticate user.
$authenticated = false;
if ($email=='admin@example.com' && $password=='Secur1ty') {
$authenticated = true;
// Save identity to session.
$_SESSION['identity'] = $email;
// Redirect the user to index.php.
header('Location: index.php');
exit;
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Login page</title>
</head>
<body>
<h1>Sign in</h1>
<?php if ($submitted && !$authenticated): ?>
<div class="alert">
Invalid credentials.
</div>
<?php endif; ?>
<form name="login-form" action="/login.php" method="POST">
<label for="email">E-mail</label>
<input type="text" name="email">
<br>
<label for="password">Password</label>
<input type="password" name="password">
<br>
<input type="submit" name="submit" value="Sign In">
</form>
</body>
</html>
Если вы откроете URL "http://localhost/login.php" в браузере, то увидите следующую страницу:
Чтобы войти, испольуйте
admin@example.com
иSecur1ty
как ваш E-mail и пароль, соответственно.
И, наконец, давайте создадим страницу Logout которая будет убирать личность пользователя из сессии:
<?php
// logout.php
session_start();
unset($_SESSION['identity']);
header('Location: index.php');
exit;
Полный код, приведенный выше, можно найти в примере Pure PHP, идущем в комплекте с данной книгой.
Вышеприведенные скрипты - это не только типичный пример кода на "чистом" PHP. Это пример того, как вам не нужно писать свои веб-сайты (даже самые простые). Что в нем плохого?
Скрипты index.php и login.php плохи тем, что в них весь код слит в один единственный файл. Здесь нет никакого разделения ответственности. Интуитивно вы понимаете, что было бы удобнее разделить код, ответственный за аутентификацию пользователя и код, ответственный за презентацию (отображение HTML).
URL веб-страниц выглядят уродливо (например, "http://localhost/index.php"). Нам бы хотелось спрятать это расширение файлов .php. И что произойдет, если пользователь попытается посетить страницу, которая не существует? Нам бы хотелось перенаправить пользователя на специальную страницу ошибки в данном случае.
Что будет, когда ваш сайт вырастет в размерах? Как вы будете организовывать свой код? Будете создавать новый PHP-скрипт на новую страницу? А что если вы захотите использовать некоторые из ваших PHP-скриптов в других сайтах? Интуитивно вы возможно уже понимаете, что было бы полезно организовать код в виде неких модулей.
И index.php, и login.php содержат практически одинаковый код HTML-разметки. Почему мы должны копировать и вставлять этот общий лэйаут в каждый PHP-скрипт? Мы бы хотели использовать повторно некий "главный" лэйаут на всех (или почти всех) страницах.
Скрипт login.php имеет проблемы с безопасностью, так как мы не реализовали никакую валидацию переменных POST. PHP-сессия также может быть взломана. И кроме того, скрипт login.php будет помещаться в корневой директории документов Apache что не очень безопасно (было бы безопасней вынести его из директории документов). Скрипт index.php также не безопасен, потому что мы не экранировали выводимую на страницу PHP-переменную (здесь возможны XSS-атаки).
Эти скрипты не используют классы PHP. Инкапсуляция кода в классы в теории сделала бы код более структурированным и простым в поддержке.
В данных скриптах вам приходится писать свою собственную реализацию аутентификации пользователя (и многого другого). Зачем изобретать колесо, и не воспользоваться хорошо написанной библиотекой для этого?
Все вышеперечисленные проблемы могут быть легко решены, когда вы пишете веб-сайт внутри фреймворка (такого как Zend Framework 3):
В ZF3 вы используете шаблон проектирования Model-View-Controller разделяя ваш PHP-код на модели (код, ответственный за аутентификацию пользователей, пойдет сюда), презентацию (код, отвечающий за рендеринг разметки HTML, пойдет сюда) и контроллеров (код, ответственный за извлечение переменных POST, пойдет сюда).
Маршрутизация ZF3 позволяет сделать URL веб-страниц выглядящим профессионально, скрывая расширения файлов .php. То, как будут выглядеть URL страниц, задается строгими правилами. Если пользователь попытается получить доступ к несуществующей странице, он автоматически будет перенаправлен на стандартную страницу ошибки.
В ZF3 вы можете использовать концепцию модулей. Это позволяет удобно выделить ваши модели, контроллеры и презентацию в автономную единицу (модуль) и легко использовать этот модуль в другом проекте.
В ZF3 вы можете задать общий шаблон для лэйаута и использовать его на всех (или на большинстве) веб-страниц.
ZF3 предоставляет различные средства безопасности, такие как фильтры и валидаторы форм, экранировщики вывода валидаторы сессии, криптографические алгоритмы и т.д. В веб-сайте на ZF3 только скрипт index.php доступен веб-пользователям, все остальные скрипты PHP находятся вне директории документов Apache.
В сайте на ZF3 вы помещаете свой код в классы, что делает его хорошо организованным.
ZF3 предоставляет множество компонентов, которые вы можете использовать в своем веб-сайте: компонент для аутентификации, компонент для работы с формами и т.д.
Теперь вы возможно имеете лучшее представление о преимуществах Zend Framework 3 и о том, что он может дать вам. В следующих разделах мы опишем ZF3 подробнее.