Создаем точку входа

 

Всем доброго времени суток. Сегодня мы начнем наши первые шаги по созданию движка RS-MINI на котором мы будем собирать небольшой интернет-магазин. Первое с чего нам стоит начать, это организовать одну точку входа. Что эта за точка такая, и для чего она нужна читайте ниже.

Точкой входа является главный index.php. Реализуется данная точка с помощью файла .htaccess. Мы уже однажды говорили про этот файл, так что углубляться что он умеет я не буду.

Для чего нужна одна точка входа? Ответ прост: так проще прослеживать работу скрипта, контролировать его и отлаживать. Что бы человек не вбил в адресную строку, мы всегда попадем на index.php. Давайте я приведу упрощенный более менее понятный пример.

Представьте ситуацию когда мы имеем банковское хранилище с 5-тю дверями. Для того что бы обеспечить безопасность хранилища нам придется поставить пять охранников по одному к каждой двери (и это повезет если можно обойтись только простой охраной).

А теперь представьте то же хранилище, но уже с одной дверью. Согласитесь охранять такое банковское хранилище куда проще.

Как перенаправлять все запросы на index.php?

Как уже говорил реализацию перенаправления берет на себя файл .htaccess. Давайте я сразу приведу его код: (данный файл должен лежать в корне сайта)

# стандартные настройки
# кодировка сервера
AddDefaultCharset utf-8
# запрещаем показывать содержимое директорий если там нет файла index.php[html][htm]
Options -Indexes
# базовый URL для преобразований
RewriteBase /
# включаем реврайт
RewriteEngine on

# правило редиректа с зеркала
# если к сайту обращаются через www.
RewriteCond %{HTTP_HOST} ^www.mini\.test\.ru
# редиректим на домен без www.
RewriteRule ^(.*)$ http://mini.test.ru/$1 [R=301,L]

# перенаправление на, физически существующую, папку или файл
# если в адресную строку вбит путь к файлу, то открываем этот файл
RewriteCond %{REQUEST_FILENAME} !-f
# если в адресную строку вбит путь к папке, то открываем эту папку
RewriteCond %{REQUEST_FILENAME} !-d

# передаем управление точки входа системы RS-MINI
RewriteRule ^.*$ index.php

Да, кстати, сразу хочу сказать, что домен, на котором у меня лежит собираемая система, называется mini.test.ru. В статьях будет фигурировать именно этот домен, так что во избежания проблем настаиваю, что бы Ваш локальный домен назывался точно так же.

Так же в конце каждой статьи я буду выкладывать полный архив собираемой системы, и если Ваш домен будет mini.test.ru то Вам будет достаточно просто скопировать все что я Вам дам на свой локальный сервер, и у Вас сразу все заработает.

Ладно, я отвлекся. Подобно настроенный .htaccess позволяет перенаправлять любые данный введенные в адресную строку на один и тот же файл — index.php.

Точка входа

Давайте теперь создадим эту точку входа. Вот код: (данный файл должен лежать в корне сайта)

<?php

/*
 * @package RS-MINI
 * @copyright (c) 2015 Alexey Glumov aka Rio-Shaman (support@rio-shaman.ru)
 * @license GNU General Public License version 2; see LICENSE.txt
 *
 */

define('RS-MINI', TRUE);                                        // константа безопасности
 
ini_set('display_errors', 1);                                   // показывать ли ошибки на экране
error_reporting(E_ALL | E_STRICT);                              // ур-нь ошибок
mb_internal_encoding("UTF-8");                                  // кодировка
date_default_timezone_set('Europe/Moscow');                     // временая зона

define('SHORT_DIR_RSMINI',  '/rs-mini');                        // короткий путь к движку (от корня пользовательской папки)
define('SHORT_DIR_PROJECT', '/project');                        // короткий путь к проекту (от корня пользовательской папки)
define('DIR_RSMINI',        __DIR__ . SHORT_DIR_RSMINI);        // каталог где лежит система (полный путь)
define('DIR_PROJECT',       __DIR__ . SHORT_DIR_PROJECT);       // каталог где лежит проект (полный путь)

echo "Привет мир!";

Что мы тут имеем?

Ну для начала я объявил константу RS-MINI. У всех остальных файлов будет проверка на наличие этой константы, что позволит нам не беспокоится о том, что кто-то попытается вызвать что-то кроме точки входа.

Далее идут 4-и строчки настоек сервера. А именно:

  • правило о выводе ошибок,
  • кодировка в которой будет работать наш проект
  • и временная зона.

Следующие 4-и строки, объявляют константы с путями до системных папок. Например для записи файлов через менеджер файлов (который мы обязательно будем писать) нам понадобится полный путь к папке с этими файлами. А для того что бы отобразить ссылки на эти файлы, достаточно будет короткого пути.

Ну и последняя строчка, это тест, на работоспособность Улыбаюсь

Теперь, если все правильно настроено, при вызове, например, вот такого адреса:

http://mini.test.ru/test-url/

Мы попадет на index.php и увидим наше «привет мир!»

тест точки входа

Заключение

В общем-то что бы мы не ввели (кроме физически существующих папок или файлов) после .ru мы попадем на наше тестовое сообщение.

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

На сегодня все, до скорых встреч!

Ищите где можно посмотреть новые мультики? Есть один очень интересный портал, на котором Вы можете совершено легально, и в большинстве случаев бесплатно, посмотреть мультфильмы онлайн

Прикрепленные файлы

 

Возможно Вам будут интересны следующие заметки

Комментарии (9)

Ваше имя *
Сайт
Ваш E-mail *
Ваше сообщение *
 
Вы не подтвердили условия политики конфиденциальности.
dlegame, 14 Июля 2015 г. 13:32 пишет:
Читатель
Рекомендую, использовать __DIR__ не так, а писать вот так:
str_replace('\\', '/', dirname(__DIR__))
Алексей, 14 Июля 2015 г. 14:31 пишет:
Автор

Это я подозреваю для винды. Но насколько я помню (могу конечно ошибаться), даже такой корявый путь как у винды не мешает корректно записывать и обращаться к файлам.

Ответ для пользователя: dlegame
dlegame, 14 Июля 2015 г. 17:18 пишет:
Читатель

Я бы например так реализовал index.php

<?php
if (!defined('RS_MINI')) {
  define('RS_MINI', true);
  define('ROOT_DIR', dirname(__DIR__));
  define('ENGINE_DIR', ROOT_DIR . '/rs-mini/');
  define('PROJECT_DIR', ROOT_DIR . '/project/');
}
# проверяем существование сессии
if (!isset($_SESSION)) {
  session_start();
}
# включаем буферизацию
@ob_start();
@ini_set('display_errors', 1);
@ini_set('html_errors', 0);
error_reporting(E_ALL);
date_default_timezone_set('Europe/Moscow');

echo "Hello world!";
Ответ для пользователя: Алексей
Алексей, 14 Июля 2015 г. 17:39 пишет:
Автор
Ну в моем случае при переходе на index.php константа RS-MINI точно не существует. Так же я не планировал использовать буферизацию. Да и сессии стартоваться будут не в точке входа, а в системном модуле доступа.
А так, да, можно было бы использовать и Ваш подход.
Ответ для пользователя: dlegame
dlegame, 14 Июля 2015 г. 18:27 пишет:
Читатель
Еще можно дам вам совет)
Не используйте функцию count()
Например:
for($i = 0; $i < count($_SERVER); $i++) {
  echo $_SERVER[$i];
}
быстрее будет с функцией sizeof:
for($i = 0; $i < sizeof($_SERVER); $i++) {
  echo $_SERVER[$i];
}
Ответ для пользователя: Алексей
Анатолий, 14 Июля 2015 г. 22:30 пишет:
Гость
Шаман) как на линухе живется? норм?) стоит на нее переходить?)
Алексей, 15 Июля 2015 г. 00:28 пишет:
Автор
Ну агитировать не хочу, но я уже пол года сижу на линуксе, и вроде нормально...
Ответ для пользователя: Анатолий
Алексей, 15 Июля 2015 г. 10:06 пишет:
Автор
Я предпочитаю либо:
for ($i = 0; isset($_SERVER[$i]); $i++) {
    echo $_SERVER[$i];
}
либо
for ($i = 0; $server = isset($_SERVER[$i]) ? $_SERVER[$i] : FALSE; $i++) {
    echo $server;
}
Ответ для пользователя: dlegame
Дмитрий, 15 Июля 2015 г. 10:14 пишет:
Гость
sizeof всего-лишь псевдоним count-а, даже не наоборот, не вводите людей в заблуждение)
Ответ для пользователя: dlegame