Скриншоты для нетерпеливых: https://yadi.sk/d/NRTFA5ZYoWLFP
Пример простого сайта на PHP, созданный в обучающих целях. Данный сайт призван быть хорошим примером для начинающих PHP-разработчиков. В нём собраны лучшие практики разработки, которые должны сразу приучить к хорошему. Прежде всего, сайт написан с использованием ООП и знакомит новичка с наследованием, инкапсуляцией, работой с исключениями. Примеров полиморфизма, правда, нет. Код сайта оформлен в соответствии со стандартами PSR-1 и PSR-2. Комментарии к коду оформлены в соответствии со стандартом PHPDoc (в будущем PSR-5). Сайт написан с применением концепции MVC, позволяющей уменьшить ненужную зависимость логики приложения от внешнего представления. Правда суть буквы "M" (Model) сведена лишь к существованию отдельного класса для работы с базой данных, нет классов моделей как таковых. В данном сайте намеренно не использовано никаких фреймворков, чтобы помочь новичку разобраться в основах программирования на PHP. Предполагается, что знание этих основ позже поможет ему лучше понять как использовать фреймворки.
В данном сайте реализована поддержка ЧПУ с роутером запросов и генерацией URL по имени маршрута и параметрам. Для взаимодействия с базой данных (MySQL) применяется простой класс-наследник от стандартного класса mysqli
. Для загрузки классов применяется упрощённый автозагрузчик PSR-4 (с одним корнем). Многие вещи в данном сайте намеренно упрощены для лучшего понимания на начальном этапе.
Данный сайт содержит главную страницу, 4 раздела и по несколько страниц в каждом разделе. При этом основные разделы отображаются в виде меню сверху, а страницы в текущем разделе в виде бокового меню слева. Текущий раздел и выбранная страница выделяются цветом. Первый раздел является каталогом пицц, их список, цены и описание берутся из базы данных. Картинки берутся с сайта местной службы доставки еды. Остальные разделы являются простыми текстовыми страницами, тексты которых берутся из PHP-шаблонов в каталоге app/views
. Сами тексты и картинки в них взяты из Википедии.
Для работы сайта требуется PHP версии не ниже 5.4, лучше 5.6. Работа на PHP 7 ещё не проверялась.
- Создайте директорию проекта:
mkdir demosite
и перейдите в неё. - Склонируйте данный проект к себе в созданную директорию:
git clone git@github.com:gugglegum/demosite.git .
- Создайте базу данных MySQL и загрузите в неё дамп из файла
mysqldump.sql
. - Скопируйте файл
config.php
вconfig.local.php
и отредактируйте последний в соответствии со своими нуждами, прописав там параметры подключения к созданной базе данных. Неизменённые параметры можно удалить, они возьмутся изconfig.php
. Загружаются оба конфига, но локальный имеет приоритет. Исходный файлconfig.php
изменять не надо. - Настройте на своём веб-сервере виртуальный хост таким образом, чтобы корнем сайта (DocumentRoot) являлся каталог
www
в проекте, а запросы к несуществующим в каталогеwww
файлам перенаправлялись наindex.php
.
Если вы запускаете сайт на локальной машине и вам нужны, например, сообщения об ошибках, то вам нужно включить режим разработчика. Для этого создайте в корне проекта файл init.local.php
со следующим содержанием:
<?php
define('APPLICATION_ENV', 'development');
Для корректной работы ЧПУ на данном сайте необходим механизм реврайтинга URL, который заключается в переопределении соответствия между запрашиваемым URL и файлом на диске. По умолчанию между URL и файлом на диске есть прямая связь: часть адреса после имени домена и до символа "?" или "#" (если есть) добавляется к DocumentRoot текущего хоста и если по получившемуся пути найден файл, то он отправляется в качестве ответа, если нет, то выдаётся ошибка 404. При реврайтинге, среди прочего, у нас есть возможность определить правило, которое звучит так: если запрашиваемый URL не существует, то вызвать index.php
. А уже index.php
определит какой URL изначально был запрошен и либо выдаст нужную страницу, либо выдаст свою собственную страницу с ошибкой 404. Однако настройка реврайтинга в разных веб-серверах различна. Приведу описание для 2-х хорошо известных мне.
Реврайтинг URL в Apache реализуется при помощи подключаемого модуля "mod_rewrite". Модуль mod_rewrite включён в базовый дистрибутив Apache, но отключен по умолчанию. Для его включения, как правило, достаточно раскомментировать строчку LoadModule rewrite_module modules/mod_rewrite.s
и перезапустить Apache. Также вам потребуется вручную создать файл www/.htaccess
со следующим содержимым:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !^favicon\.ico$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php [L,QSA]
Если после этого при запросе любой страницы, кроме главной, вы всё равно получаете ошибку 404, то скорее всего веб-сервер игнорирует файл .htaccess
. Проверьте значение опции AllowOverride
. В целях безопасности она обычно стоит в значении None, необходимо переопределить её в значение All
, хотя бы для директории с сайтом.
Поддержка реврайтинга URL в nginx включена изначально. Однако nginx не поддерживает файлы .htaccess
, поэтому правила реврайтинга необходимо описать внутри конфига виртуального хоста. Приведу полностью пример такого конфига:
server {
listen 80;
server_name demosite.dev;
set $project_root D:/Users/Pavel/Workspace/demosite;
root $project_root/www;
location / {
try_files $uri @index-php;
gzip on;
gzip_types text/css application/javascript;
expires 2w;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location @index-php {
rewrite ^/(.*)$ /index.php last;
}
}
Я думаю, вы догадаетесь что здесь надо подправить, чтобы всё заработало.
Если у вас нет доменного имени для вашего сайта, то можете выбрать любое, например, "demosite.dev", прописав его в своём локальном файле /etc/hosts
. В Windows этот файл находится в %SystemRoot%\System32\drivers\etc\hosts
. Отредактируйте его, добавив в него всего одну строчку:
127.0.0.1 demosite.dev
Теперь при попытке обращения браузером на сайт http://demosite.dev
, ваш браузер будет обращаться к вашему локальному веб-серверу, сидящему на 80-м порту. В некоторых случаях, если вы пробовали заходить по этому адресу до того, как прописали его в /etc/hosts
, может потребоваться перезапуск браузера. Если вы пользуетесь браузером Chrome и вместо открытия вашего сайта открывается поиск Google, то просто добавьте к адресу на конце слэш: http://demosite.dev/
.