PHP include уязвимость: от теории к практике. Локальное и удалённое внедрение файлов: эксплуатация уязвимости и обход фильтров. Статичное внедрение удалённого файла

И снова, Здравствуйте друзья! Тема этой статьи — электронная почта со своим доменом с помощью Яндекса! Многие игнорируют эту вроде бы мелочь, а зря! Из каждой такой мелочи как известно, складывается общая картина — бренд!

Да и солидно это в конце концов, иметь со своим личным доменом, вы согласны?!.ru и будет Вам счастье!

Кстати в прошлой статье я рассказал как создать для мгновенного скроллинга по сайту. Если у Вас достаточно объемные статьи и Вы еще не реализовали такую возможность как скроллинг, то рекомендую прочитать...

Так вот о чем я?! Ах да! Я заметил что у основной массы блоггеров, обычные электронные адреса почтовых сервисов Майл и Google и прочих. Почему же лишь малая часть администраторов использует эту возможность?!

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

Надеюсь она поможет Вам и Вы без особого труда создать и настроить почту на своем домене с помощью любимого всеми Яндекса

Итак поехали...

Есть несколько вариантов реализовать нашу задумку, но лично для себя, я выбрал сервис Яндекса. Была у меня почта и на Google, но что то она мне не понравилась.
Дело вкуса так сказать, каждый сам имеет право выбора!

Так же как вариант можно создать почту непосредственно в панели управления хостингом, но такой вариант лично мне не подходит по нескольким причинам:

Во первых, мне нравиться использовать браузерный, понятный и функциональный клиент почты, с защитой от спама и прочими плюшками.

Во вторых, не хочу забивать свободное место хостинга, а за дополнительные «Гб» придется платить. Ну можно конечно производить периодическую чистку писем, но это не для меня!
Вот по этим причинам я решил создать почту на Яндексе, где меня все устраивает более чем

За длительное время использования только положительные эмоции — все просто, понятно и стабильно! В общем я рекомендую использовать именно Яндекс, хотя решать только Вам!

  • Много, много, много места;
  • Защищенность от спамеров и вирусов;
  • Доступ через браузер, а так же по POP3/IMAP;
  • Органайзер и прочие фишки;
  • Более 1000 адресов на одном домене;
  • Можно разместить свой лого;
  • Настройка оформления и темы. (Мне больше нравиться тема с погодой — днем светлая, ночью темная).

Создание, настройка, подключение.

Что же друзья, переходим к самому интересному, а именно к пошаговой инструкции. Я постараюсь максимально понятно рассказать и вспомнить о всех тонкостях этого процесса! Раньше я думал что это сложно, но как оказалось на практике — все довольно просто!

Прочтите мою статью — выбор и , если у вас его нет. Стоимость всего 100 рублей в год и возможность купить доменное имя, есть у каждого.

1. Переходим на официальный сайт Яндекса ;

2. Вводим свое имя домена и тыкаем — подключить! Авторизуемся на сайте, либо создаем новый аккаунт.

3. Теперь нужно подтвердить права, выбирайте удобный способ. Я выбрал загрузить файл в корневую систему хостинга, имя файла и текст внутри документа у всех свои.

После того как Вы разместили файл на сервере хостинга, нажимаем кнопку «Проверить». В случае успешной проверки, переходим к этапу 2.

4. Теперь нужно настроить MX записи в панели управления Вашего хостинга.

Переходим в панель управления хостингом (тут у всех разные методы, смотря какой хостинг). На примере моего хостинга AdminVPS — раздел доменные имена — видим настройки MX записей.

Прописываем такую запись, как показано на картинке, если нет поля для ввода приоритета, то пишем так — 10 mx.yandex.ru. (точка на конце обязательна).

5. После успешной проверки записей MX, видим следующую картину:

Теперь придумайте красивое имя почты, сложный пароль, добавьте логотип и в принципе ВСЕ! Дальше я думаю сами разберетесь, что к чему

Еще один момент — чтобы ваши письма не улетали в СПАМ при отправке кому либо, рекомендую сделать цифровую подпись.

Для этого — в правой колонке, в самом низу, есть блок «Цифровая подпись DKIM», берем от туда данные и создаем еще одну TXT запись в панели управления хостингом.

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

Кстати кто что думает на счет динамики роста доллара? Каков Ваш прогноз? Интересно послушать мнения по этому поводу. Дурак я что доллар не купил когда он еще был по 35 рублей, не плохо бы заработал сейчас! Ну да ладно профукал момент, сам виноват!

Сейчас наверное большинство блоггеров и я в том числе, ждут результаты конкурса , да?! Довольно любопытно, кто же займет призовые места!

Хочу пожелать всем и себе в частности — удачи и не опускать руки если не повезет! Значит есть к чему стремится, что улучшить и что допилить! Мы молодцы уже в том, чего достигли на данный момент, не каждому это дано — ведение личного блога!

P.S: А не хотели бы Вы научится грамотно и профессионально вести свои рассылки, а так же зарабатывать на них не прилично большие деньги, я хочу посоветовать Вам хорошие курсы: Рассылка которая делает деньги — часть 1 и часть 2 !

Лично мне эти курсы помогли избежать кучу ошибок, которые я мог бы наделать без них. Особенно мне понравилась 2 часть — в настоящее время эта информация наиболее актуальна!

Да кстати, я еще помогу Вам сэкономить на их покупке Просто напишите мне письмо и я расскажу что нужно сделать!


С уважением, Владимир Савельев

Премиум-уроки от клуба webformyself

Это новый революционный продукт в области обучения сайтостроительству! Все лучшие видео-уроки собраны в одном месте и разделены на категории: WordPress, Joomla, PHP, HTML, CSS и JavaScript... База постоянно пополняется и уже сейчас в ней более 200 уроков! Всего за один год - Вы сможете стать опытным веб-мастером "с полного нуля"!

Подробнее

Электронная почта сейчас необходима фактически для любого действия: регистрации в социальной сети, ведения бизнеса. В свою очередь, предприниматели в основном имеют свой личный сайт, где предлагают различного рода услуги. Чтобы смотреться более солидно и конкурентно, пригодится почта со своим доменом для рекламы предлагаемого продукта. В случае если пользователей становится слишком много, данный сервис тоже понадобится.

Домен электронной почты - это множество почтовых ящиков, которые связаны одним именем. Не считая основного, у него могут быть и другие названия. Они являются синонимами главного наименования домена. Исходя из этого, все без исключения почтовые ящики имеют одну общую часть, которая начинается после символа @ и является главным именем или его синонимом.

Причины создания почты для домена вне своего хоста

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

Зачастую такой перенос осуществляется, чтобы сэкономить место. Базовая емкость, которую предоставляет хост, имеет строгий лимит и равна примерно 10 ГБ памяти. Такого количества не хватит даже на сотню адресов, не говоря уже о тысячах. Исходя из этого, нецелесообразно тратить столь мизерное пространство на почтовые адреса, а наилучшим вариантом будет оставить это место для нужд ресурса.

Особая нужда в большом объеме для почтовых адресов появляется, когда пользователей становится более 2-3 сотен. Усугубляет ситуацию переписка зарегистрированных посетителей сайта между собой, в которой используется большой объем данных. Наиболее распространенный пример пересылки друг другу такого количества информации - это общение сотрудников коммерческого сайта, связанного с продажами.

По этим причинам для домена почта имеет важное значение, и создание ее на посторонних ресурсах даст особые преимущества, такие как:

  1. Большой объем выделяемой памяти. Обычно на всех ресурсах выделяется довольно значительный объем информации. Поэтому на них проще организовать общение с большим количеством передаваемой информации между пользователями.
  2. Широкие возможности управления. В различных ресурсах есть особые фильтры и настройки внешнего вида, что упрощает работу.
  3. Привычный внешний вид. Зачастую именно крупные системы поиска оказывают услуги по предоставлению места для домена. Почта у них смотрится довольно узнаваемо, поэтому не нужно тратить много времени на то, чтобы освоиться в интерфейсе.
  4. Бесплатное свободное место. Сервисы, которые оказывают услуги по предоставлению места для почты, в основном бесплатны. Хотя есть и платные варианты, но услуги у них почти те же.

«Яндекс.Почта» для домена

В целом для домена почта «Яндекса» полностью подойдет. Этот сервис обладает рядом преимуществ:

  1. Вложения денег не требуется.
  2. Несмотря на то что количество почтовых ящиков ограничено 1000, можно подать заявку для их увеличения. Основные условия — это быть владельцем крупного интернет-портала, который должен быть подключен к «Яндекс.Почте», а количество ящиков либо приблизилось к лимиту, либо наблюдалась высокая активность пользователей.
  3. Для владельца домена сервис предоставляет простой интерфейс и настройки аккаунтов зарегистрированных пользователей.
  4. Сервис дает возможность поставить логотип сайта на все привязанные к этому домену аккаунты.
  5. Объем каждого зарегистрированного ящика неограничен.
  6. Календарь, который можно синхронизировать со своим рабочим расписанием, а также еженедельник.
  7. Специальные инструменты, чтобы работать с офисными документами.

Как и во многих популярных сервисах, здесь есть такие варианты доступа к почте:

  • через сайт;
  • с мобильного телефона;
  • посредством других почтовых сервисов.

Gmail почта

Этот сервис имеет следующие отличия:

  1. Дает возможность доступа к почте с мобильных телефонов.
  2. Адрес пишется в форме «имя@название домена.ру».
  3. Имеется интеграция со всеми функциями Google Apps. Наименьшая цена за ее использование для одного человека равна 5$.
  4. Поддерживает протоколы IMAP и POP, а также SMTP.
  5. Бесплатно дается лишь 10 ГБ пространства под почтовые ящики.

Mail.ru: почтовый сервис

Отличительные нюансы:

  • возможность подключить до 5 тыс. ящиков для почты;
  • объем неограничен;
  • доступен вход на почту с телефона;
  • просмотр документов в режиме онлайн.

Кроме того, есть возможность общаться посредством Mail.ru-агента, а также есть встроенный календарь и до 100 ГБ киберпространства для каждого зарегистрированного аккаунта.

Настройка почты для домена от «Яндекса»

Чтобы настроить «Яндекс.Почту», нужно зайти на pdd.yandex.ru/domains_add и написать наименование своего домена.

  • dns1.yandex.net;
  • dns2.yandex.net.

После чего потребуется подтверждение, что выполняющий эту процедуру является хозяином домена. Теперь можно воспользоваться почтой домена, введя в браузере: mail.yandex.ru/for/название домена.

Такой способ является наиболее простым, но одним из самых популярных и эффективных.

Выбор для домена

По своим характеристикам наилучшими вариантами являются «Яндекс» и Mail.Ru, а версия, которая была представлена Google, финансово невыгодна.

В целом каждый сервис имеет свои преимущества, и выбирать необходимо, основываясь на том, какие услуги для портала будут необходимы, а какие вовсе не пригодятся.

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

Попробуйте бесплатный сервис «Яндекс.Почта для домена».

О том как создать, настроить и пользоваться данным сервисом читайте в нашей сегодняшней статье.

Яндекс.Почта для домена - что это?

«Яндекс.Почта для домена» - это сервис, позволяющий интегрировать доменное имя с бесплатным сервисом «Яндекс.Почта», получая все преимущества работы последнего.

Данный сервис может понадобиться владельцу доменного имени, который хочет сделать свою почту уникальной, например «имя_пользователя@имя_домена».

Преимущества такого решения очевидны и после подключения сервиса пользователь получает:

    возможность создания 1000 почтовых ящиков (большое количество возможно после подачи заявки на увеличение лимита);

    удобный веб-интерфейс для управления почтовыми аккаунтами (блокировка аккаунта в случае увольнения сотрудника, создания нового, пр.), а также различные дополнительные возможности, например: создания aлиаса, списка рассылок, импорт почты с других почтовых серверов , пр.;

    инструменты для работы с письмами посредством веб-интерфейса (просмотр офисных документов, прослушивание вложенных.mp3 файлов в браузере).

    защиту от спама и вирусов;

    возможность доступа с веб-интерфейса, почтовых программ и мобильных устройств;

    возможность установки логотипа своей организации в веб-интерфейсе и выбор множества различных тем для интерфейса;

    за счет большего доверия от других почтовых серверов, письма Яндекс.Почты не так часто попадают в спам-листы.

    календарь для организации рабочего дня.

Также к списку следует добавить отсутствие необходимости в содержании в штате системного администратора.

А если вам все же понадобятся его услуги для настройки сервиса, цена будет минимальной.

На данный момент сервис обслуживает около 300 тыс. доменных имен и около 4 млн. почтовых ящиков.

Создаем и настраиваем Яндекс.Почту для домена

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

Шаг 1. Подключение и проверка домена. На этом этапе лицо, которое хочет воспользоваться сервисом, должно доказать, что является владельцем доменного имени.

Проверка, как правило, занимает не более 24 часов и как только домен подтвержден, администратор имеет доступ ко всем функциям.

Переходим на страницу подтверждения и выбираем один из предложенных способов для подтверждения:

    создание субдомена с определенным именем, которое сгенерировала система;

    смена адреса контактного email-адреса, на адрес содержащий доменное имя, для которого производится регистрация.

Первые два способа более простые, нежели последний. В нашем примере мы воспользуемся первым способом.

Создаем в блокноте файл (называем его так, как указала система), помещаем в него сгенерированный системой текст, переименовываем в.html и загружаем в корневой каталог сайта.

После выполнения этих манипуляций жмем кнопку «Проверить владение доменом».

Шаг 2. Настройка MX-записей или делегирование домена Яндекса .

В случае если доменное имя было зарегистрировано лишь с целью использования уникального названия домена для почтовых адресов компании или в личных целях (чтобы подчеркнуть индивидуальность), рекомендуется воспользоваться делегированием домена Яндекса.

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

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

Для удобства пользователей, компания разместила на официальном сайте информацию по настройке домена для наиболее популярных регистраторов и интернет-провайдеров.

Настройка MX-записи

Настройка MX-записи различная для каждого сервиса, поэтому ограничимся общим описанием без привязки к интерфейсу хостинг-провайдера либо регистратора.

Перейдя в панель администрирования необходимо удалить все существующие МХ-записи не указывающие на серверы Яндекса, после чего следует создать новую выбрав приоритет - 10, а в поле назначение (данные) указать mx.yandex.net.

Результаты настройки можно увидеть пройдя по ссылке . Если вы все сделали правильно статус «Ожидаем установки МХ-записей» сменится на «Подключен».

Обратите внимание! В некоторых случаях хостинг-провайдеры интегрируют настройки для наиболее популярных сервисов в т.ч. и для Яндекс.Почты, в таком случае настройка сводится лишь к установке флажка в нужное поле и сохранить изменения.

После настроек МХ-записей можно зайти на страницу Мои домены и убедится в правильности настроек.

В случае делегирования домена Яндексу, его работоспособность будет обеспечиваться серверами компании.

Настройка состоит из двух этапов редактирования на стороне Яндекса и на стороне регистратора имен или хостинг-провайдера.

Для делегирования необходимо зайти на страницу Мои домены , выбрать домен для делегирования на Яндекс, пройти по ссылке «Редактор DNS» и убедится, что в списке DNS-записей прописаны все необходимые данные.

Важно! Если какой-либо записи не хватает, добавьте ее воспользовавшись соответствующей кнопкой.

На стороне регистратора домена необходимо изменить NS-настройки домена, указав первичным и вторичным DNS-сервером dns1.yandex.net и dns2.yandex.net соответственно.

Если в интерфейсе вашего регистратора есть поля для IP-адресов, их следует оставить пустыми.

Через некоторое время ваш домен будет делегирован на Яндекс. Для этого посетите страницу Мои домены .

В этом руководстве Вы узнаете, как построить простую систему по архитектуре MVC (Model-View-Controller, Модель-Отображение-Контроллер) на PHP 5.1 с использованием возможностей библиотеки SPL (Standard PHP Library, Стандартная Библиотека PHP).

Введение

Добро пожаловать в первое полноценное руководство для PHP 5. Вам понадобится PHP 5.1 с установленной библиотекой SPL, так как мы воспользуемся некоторыми из самых последних возможностей PHP 5.

В этом руководстве я собираюсь показать, как построить простую MVC-систему (архитектура MVC является наиболее распространённым шаблоном проектирования для больших web-приложений). Я проведу Вас через все шаги от начала и до конца создания полноценной MVC-системы.

Одна точка входа

Одной из важных вещей в MVC является одна точка входа в приложение вместо кучи PHP-файлов, делающих примерно следующее:

У нас будет один файл, обрабатывающий все запросы. Это значит, что нам не придётся мучиться с подключением global.php каждый раз, когда нам нужно создать новую страницу. Эта «одна точка входа» будет называться index.php и на данный момент будет такой:

Как Вы можете заметить, этот скрипт пока ещё ничего не делает, но погодите минутку.

Чтобы направить все запросы на главную страницу, мы воспользуемся mod_rewrite и установим в.htaccess директиву RewriteRule. Вставим следующий код в файл.htaccess и сохраним его в той же директории, что и index.php:

RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?route=$1

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

Если у Вас нет возможности использовать.htaccess или mod_rewrite, то Вам придётся вручную адресовать все запросы к index.php. Другими словами, все ссылки должны будут иметь вид «index.php?route=[здесь-идёт-запрос]». Например, «index.php?route=chat/index».

Теперь, когда все запросы идут через одну точку входа, мы можем начать написание скрипта index.php. Первая вещь, которую мы должны сделать, это инициализация системы. Создадим директорию includes, а в ней файл startup.php (он будет у нас файлом инициализации). Вставим следующий код в index.php:

В этом примере мы объявляем некоторую константу, узнаём, где лежат файлы системы, а также проверяем, что версия PHP, ну, хотя бы, 5.1.

Следующая вещь, которую необходимо сделать, это объект Registry (журнал, реестр) для хранения глобальных значений. Он будет передаваться в отдельные объекты системы и использоваться для доступа к глобальным значениям, причём без необходимости обозначать переменные как «global» или обращаться к массиву $GLOBALS. Почитайте статью «Использование глобальных значений в PHP» для более подробной информации об объекте реестра.

Добавьте следующий код в файл startup.php после того кода, что приведён в предыдущем примере:

$registry = new Registry;

Если сейчас попробовать запустить систему, то можно увидеть следующую ошибку:

Fatal error: Class "Registry" not found in g:\Projects\PHP\content\simple mvc php5\demo\includes\startup.php on line 12

Это, конечно, не большой сюрприз для нас, ведь мы ещё не написали сам класс Registry. Файл с классом можно было бы просто подключить, используя функцию include() (Прим. пер.: кстати говоря, include() не такая уж и функция, а всё-таки выражение языка, управляющая структура, если смотреть по ману), но давайте воспользуемся одной из новых возможностей PHP 5: __autoload().

Волшебная функция __autoload() используется для динамической загрузки классов. Когда PHP обнаруживает несуществующий класс, он сначала вызывает функцию __autoload() и только затем выдаёт ошибку. Мы можем воспользоваться такой возможностью для загрузки классов «на лету».

Вставьте этот код перед кодом из предыдущего примера:

// Загрузка классов «на лету» function __autoload($class_name) { $filename = strtolower($class_name) . ".php"; $file = site_path . "classes" . DIRSEP . $filename; if (file_exists($file) == false) { return false; } include ($file); }

Наша функция __autoload() берёт имя класса, переданное ей как аргумент, и проверяет, существует ли файл с похожим именем в директории с классами. Если файла нет, то функция просто вернёт false и выскочит фатальная ошибка. Но если файл существует, он будет загружен. Т.е. объявится необходимый класс, и никакой ошибки не будет.

Мы ещё не создали сам класс Registry, поэтому ошибка всё ещё будет появляться. Давайте же займёмся этим.

Создание класса Registry

Класс Registry используется для передачи глобальных значений между отдельными объектами. Это на самом деле довольно простой класс, в котором нужно реализовать несколько маленьких методов.

Для начала создадим директорию classes и в ней файл registry.php. Вставим следующий код в registry.php:

Теперь у нас есть «скелет» класса Registry и нужно нагрузить его методами. Напишем 2 метода: set(), чтобы устанавливать значения и get(), чтобы значения получать. Также можно написать метод remove() для удаления значений. Добавим эти методы в класс Registry:

Function set($key, $var) { if (isset($this->vars[$key]) == true) { throw new Exception("Unable to set var `" . $key . "`. Already set."); } $this->vars[$key] = $var; return true; } function get($key) { if (isset($this->vars[$key]) == false) { return null; } return $this->vars[$key]; } function remove($var) { unset($this->vars[$key]); } ?>

Эти методы простые, они устанавливают, получают и удаляют элементы из массива $vars, который является атрибутом класса. В методе set() мы заодно проверяем, не существует ли уже значение с указанным ключом, и, если существует, то мы генерируем исключение. Это нужно, чтобы избежать случайной перезаписи значений.

Теперь у нас есть полноценный класс Registry, но мы не будем останавливаться на этом. Воспользуемся одной из возможностей библиотеки SPL: ArrayAccess. SPL (сокращённо от Standard PHP Library, Стандартная Библиотека PHP) - это коллекция интерфейсов и классов, предназначенных для решения стандартных проблем. Один из интерфейсов SPL, ArrayAccess, может быть использован, чтобы предоставить доступ к объекту, как к обычному массиву. Посмотрим на такой пример:

set ("name", "Dennis Pallett"); // Получаем значение, используя get() echo $registry->get ("name"); // Получаем значение, используя доступ как к массиву echo $registry["name"] ?>

Фокус в том, что $registry становится как бы массивом, хотя на самом деле это объект. Конечно, ArrayAccess не даёт никаких особых преимуществ, но он позволяет сократить объём кода, так как не придётся каждый раз писать «->get()». Чтобы воспользоваться этим интерфейсом, нужно исправить первую строчку класса («Class Registry») таким образом:

Class Registry Implements ArrayAccess {

Ключевое слово «Implements» говорит интерпретатору, что этим классом мы реализуем интерфейс, чем на самом деле ArrayAccess и является.

Класс, реализующий интерфейс ArrayAccess, должен иметь следующие методы:

Function offsetExists($offset) { return isset($this->vars[$offset]); } function offsetGet($offset) { return $this->get($offset); } function offsetSet($offset, $value) { $this->set($offset, $value); } function offsetUnset($offset) { unset($this->vars[$offset]); }

Эти методы должны быть понятны сами по себе. Дополнительную информацию можно найти в документации SPL.

Теперь, реализовав интерфейс ArrayAccess, мы можем обращаться к объекту, как к обычному массиву. Это наглядно продемонстрировано, как в предыдущем примере, так и в этом:

get ("name"); // Получаем значение, используя доступ как к массиву echo $registry["name"] ?>

Класс Registry теперь завершён, и, если попробовать запустить систему, всё должно заработать (хотя ещё ничего не будет выводиться). Мы закончили с файлом инициализации и можно приступать к следующему шагу написания нашей MVC-системы: реализация доступа к базе данных, что в архитектуре MVC называется «Model» («Модель»).

Модель

«M» или модель – часть MVC-системы, которая отвечает за запросы к базе данных (или другому внешнему источнику) и предоставление информации контроллеру. Можно было бы загружать необходимую модель в зависимости от запроса, но я предпочитаю немного стереть границы между моделью и контроллером именно в этом месте, т.е. контроллер работает с БД непосредственно через библиотеку взаимодействия с БД, нежели чем через отдельную модель. Может быть, Вам захочется сделать это по-другому, тут дело вкуса.

Нам нужно написать код, необходимый для установки соединения с БД и поместить его в index.php. Существует множество замечательных библиотек для работы с БД (включая мою собственную, AutoCRUD), но в PHP 5 уже есть такая библиотека – PDO. Поэтому нет нужды использовать какую-либо другую.

Вставим следующий код в файл index.php (после подключения файла инициализации):

# Соединяемся с БД $db = new PDO("mysql:host=localhost;dbname=demo", "", ""); $registry->set ("db", $db);

В этом примере мы сначала создаём новый экземпляр библиотеки PDO и соединяемся с нашей БД MySQL. Потом делаем переменную $db доступной глобально при помощи нашего класса Registry.

Модельная компонента нашей системы готова, поэтому давайте перейдём к написанию контроллера.

Написание контроллера подразумевает также и написание класса Router, ответственного за загрузку нужного контроллера в зависимости от запроса (вспомните, в index.php через URL передаётся переменная $route).

Класс Router

Класс Router будет разбирать запрос, а потом загружать требуемый контроллер. Создадим «скелет» класса:

registry = $registry; } } ?>

Затем добавим следующие строки в index.php:

# Загружаем router $router = new Router($registry); $registry->set ("router", $router);

Первая вещь, которую мы напишем, это метод setPath() для установки директории, где будут лежать все наши контроллеры. Метод выглядит следующим образом и должен быть добавлен в класс Router:

Function setPath($path) { $path = trim($path, "/\\"); $path .= DIRSEP; if (is_dir($path) == false) { throw new Exception ("Invalid controller path: `" . $path . "`"); } $this->path = $path; }

Потом добавим следующие строки в index.php:

$router->setPath (site_path . "controllers");

Теперь, когда мы установили путь до наших контроллеров, напишем сам метод, ответственный за загрузку контроллера. Этот метод будет называться delegate(), он и будет анализировать запрос. Первый кусочек этого метода такой:

Function delegate() { // Анализируем путь $this->getController($file, $controller, $action, $args);

Как Вы можете видеть, он использует ещё один метод, getController(), чтобы получить название контроллера и несколько других переменных. Этот метод выглядит так:

Private function getController(&$file, &$controller, &$action, &$args) { $route = (empty($_GET["route"])) ? "" : $_GET["route"]; if (empty($route)) { $route = "index"; } // Получаем раздельные части $route = trim($route, "/\\"); $parts = explode("/", $route); // Находим правильный контроллер $cmd_path = $this->path; foreach ($parts as $part) { $fullpath = $cmd_path . $part; // Есть ли папка с таким путём? if (is_dir($fullpath)) { $cmd_path .= $part . DIRSEP; array_shift($parts); continue; } // Находим файл if (is_file($fullpath . ".php")) { $controller = $part; array_shift($parts); break; } } if (empty($controller)) { $controller = "index"; }; // Получаем действие $action = array_shift($parts); if (empty($action)) { $action = "index"; } $file = $cmd_path . $controller . ".php"; $args = $parts; }

Пробежимся по этому методу. Сначала он берёт значение переменной $route из запроса, потом разбивает его на части с помощь функции explode(). Например, запрос «members/view» преобразуется в такой массив: array(‘members’, ‘view’).

Потом при помощи цикла foreach он проходит по каждой части и проверяет, является ли эта часть директорией. Если является, то он приписывает её к пути до файла и проверяет следующую часть. Это позволяет поместить контроллеры в поддиректориях и, таким образом, получить иерархию контроллеров. Если же текущая часть запроса не является директорией, но является файлом, она сохраняется в переменную $controller, и мы выходим из цикла, так как нашёлся контроллер, который нам нужен.

После цикла мы проверяем переменную с именем контроллера. Если она пустая, то используем контроллер «index», который будет у нас контроллером по умолчанию. Потом метод определяет действие, которое необходимо выполнить. Контроллер – это класс, который состоит из нескольких методов. Действие же указывает на конкретный метод. Если действие не указано, будем использовать «index» - действие по умолчанию.

И, наконец, получаем полный путь до файла контроллера, объединяя три переменные: путь, имя контроллера и расширение «php».

Теперь, когда мы проанализировали запрос, пора вызывать метод delegate() для загрузки контроллера и выполнения действия. Полностью метод delegate() выглядит так:

Function delegate() { // Анализируем путь $this->getController($file, $controller, $action, $args); // Файл доступен? if (is_readable($file) == false) { die ("404 Not Found"); } // Подключаем файл include ($file); // Создаём экземпляр контроллера $class = "Controller_" . $controller; $controller = new $class($this->registry); // Действие доступно? if (is_callable(array($controller, $action)) == false) { die ("404 Not Found"); } // Выполняем действие $controller->$action(); }

Проанализировав запрос при помощи метода getController(), мы проверяем, существует ли в действительности файл, и, если нет, то возвращаем простое сообщение об ошибке.

После этого мы подключаем файл с контроллером и создаём экземпляр его класса, называться который должен «Controller_[имя]». Чуть позже мы поговорим о контроллерах более подробно.

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

Написав полностью метод delegate(), добавим следующую строчку в файл index.php:

$router->delegate();

Если попробовать сейчас запустить систему, то мы увидим следующую ошибку (разумеется, если директории controllers ещё нет):

Fatal error: Uncaught exception "Exception" with message "Invalid controller path: `g:\Projects\PHP\content\simple mvc php5\demo\controllers\`" in g:\Projects\PHPit\content\simple mvc php5\demo\classes\router.php:18 Stack trace: #0 g:\Projects\PHP\content\simple mvc php5\demo\index.php(13): Router->setPath("g:\Projects\PHP...") #1 {main} thrown in g:\Projects\PHP\content\simple mvc php5\demo\classes\router.php on line 18

Или же мы увидим ошибку «404 Not Found», так как ещё нет ни одного контроллера. Но этим-то мы сейчас и займёмся.

Контроллер

Контроллеры в нашей MVC-системе будут достаточно простыми и потребуют совсем немного времени. Во-первых, удостоверимся, что директория controllers существует. Создадим файл controller_base.php в директории classes и вставим в него следующий код:

registry = $registry; } abstract function index(); } ?>

Этот абстрактный класс будет родительским классом для всех наших контроллеров. Он будет делать всего лишь две вещи: сохранять локальную копию класса Registry и при помощи абстрактного метода index() заставлять все дочерние контроллеры реализовывать этот метод.

Напишем наш первый контроллер. Создадим файл index.php в директории controllers и вставим в него такой код:

Только что мы создали наш первый контроллер и, если попробовать запустить систему, то можно увидеть следующее:

Это означает, что класс Router выполнил свою работу и запустил требуемое действие из требуемого контроллера. Давайте напишем ещё один контроллер, который будет соответствовать запросу «members/view». Создадим файл members.php в директории контроллеров и вставим в него такой код:

Теперь зайдём в нашу MVC-систему по запросу «members/view» или же «index.php?route=members/view». Мы должны увидеть такой результат:

Только лишь написанием нового контроллера и добавлением в него метода, мы смогли создать новую страницу, и ничего не пришлось менять в самой системе. Кроме того, нашим контроллерам не нужно подключать файл global.php или делать что-нибудь в таком роде.

Теперь, когда у нас есть контроллеры, осталась лишь одна вещь: «V» или «View» («Отображение»).

Отображение

Как и в случае с моделями, есть несколько различных вариантов создания компоненты View в MVC-системе. Мы могли бы научить класс Router автоматически загружать ещё один файл, названный как-нибудь так: «view_{имя}.php». Но чтобы сделать руководство более понятным, напишем класс Template, который будет заниматься выводом шаблонов.

Сначала создадим файл template.php в директории classes и вставим в него следующий код:

registry = $registry; } } ?>

Теперь у нас есть основная структура нашего класс Template. Следующим шагом добавим такой код в файл index.php прямо перед строками, связанными с классом Router:

# Создаём объект шаблонов $template = new Template($registry); $registry->set ("template", $template);

Так как нам понадобится использовать значения из моделей и контроллеров, то напишем метод set() для установки переменных, доступных в шаблонах. Посмотрим на пример:

Function set($varname, $value, $overwrite=false) { if (isset($this->vars[$varname]) == true AND $overwrite == false) { trigger_error ("Unable to set var `" . $varname . "`. Already set, and overwrite not allowed.", E_USER_NOTICE); return false; } $this->vars[$varname] = $value; return true; } function remove($varname) { unset($this->vars[$varname]); return true; }

Методы set() и remove() достаточно простые и используются, соответственно, для установки и удаления переменных.

Займёмся написанием метода show(), который будет отображать шаблоны. Простейший путь – это создать отдельную директорию templates, где хранить все файлы шаблонов, и использовать include() для вывода шаблона. Разумеется, Ваш собственный метод show() может быть совершенно другим и загружать шаблоны из базы данных или делать что-нибудь ещё. Посмотрим на кусо

Голосов: 745 | Просмотров: 8082