<MyRusakov.ru />

Создание Интернет-магазина на PHP и MySQL

Создание Интернет-магазина на PHP и MySQL

Видеокурс "Создание Интернет-магазина на PHP и MySQL" - это уникальный курс по созданию Интернет-магазина с нуля. Особенностью данного курса является то, что создание идёт с самого начала, то есть от идеи. Далее создаётся дизайн всех необходимых страниц, после делается их вёрстка. Затем создаётся движок на PHP и MySQL, после делается Admin-панель и, наконец, готовый сайт размещается в Интернете.

Адрес созданного в этом курсе сайта: http://storedvd.ru

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

Подробнее
Подписка

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Каким движком Вы предпочитаете пользоваться?

Создание движка на MVC. Пишем роутер.

Создание движка на MVC. Пишем роутер.

Привет всем! Вот и наступила вторая статья из серии, посвященной созданию движка на MVC. Сегодня мы создадим роутинг. Поехали!

Для начала разберемся, как будет работать наш роутинг. У нас будет единая точка входа - index.php. Туда будут отправляться все запросы. URL будет такого вида:

http://site.ru/controller/method/param

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

Думаю, как это будет работать, вы поняли. Теперь откроем файл .htaccess и пропишем следующее:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

Разберемся, что мы здесь написали. Сначала включаем движок перезаписи, потом задаем 3 условия: если это не физическая директория, файл или ссылка, то берем весь URL и отправляем на файл index.php(нашу единую точку входа), передав GET параметр url со значением нашего URL.

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

<?php
  $url = $_GET['url'];
  echo $url;
?>

Теперь вы увидите ваш url. Давайте создадим контроллер index.php в папке controllers.

<?php
  class Index {
   public function __construct() {
    echo "Мы в контроллере INDEX";
   }
  }
?>

Теперь в нашем главном файле index.php подключим его

<?php
  $url = $_GET['url'];
  echo $url;
  require_once 'controllers/'.$url.'.php';
  $controller = new $url;
?>

Теперь мы увидим надпись, которую выводит конструктор нашего класса. Создадим еще один контроллер help.php в папке controllers.

<?php
  class Help {
   public function __construct() {
    echo "Мы в контроллере HELP";
   }
  }
?>

Теперь если в адресной строке после названия сайта(домена) ввести '/help', вы увидите, что сработал контроллер Help.

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

<?php
  $url = $_GET['url'];
  $url = rtrim($url, '/');
  $url = explode('/', $url);
  require 'controllers/'.$url[0].'.php';
  $controller = new $url[0];
  if(isset($url[2])) {
   $controller->$url[1]($url[2]);
  }
  else {
   if(isset($url[1])) {
    $controller->$url[1]();
   }
  }
?>

Вот такой вот получился файл index.php. Сначала мы получаем наш url адрес и записываем его в переменную $url. Дальше наш нужно удалить последний слэш, иначе у нас будет ошибка. Для этого мы воспользовались функцией rtrim, куда первым параметром передаем, что мы хотим удалить, а вторым - где. После, используя функцию explode мы разбиваем нашу строку на массив по слэшу. Теперь первым параметром у нас будет название контроллера, который мы и подключаем строчкой ниже и создаем его объект. Теперь проверяем, есть ли параметры. Если да, то вызываем переданный метод и передаем параметр, а если нет, то просто вызываем наш метод.

Давайте теперь в нашем контроллере help.php создадим метод other.

<?php
  class Help {
   public function __construct() {
    echo "Мы в контроллере HELP";
   }

   public function other() {
    echo "Мы в методе other контроллера Help";
   }
  }
?>

Теперь напишем в адресной строке следующее: ваш_домен.ru/help/other

И у нас вызовится метод other контроллера help.

Теперь изменим наш метод other

<?php
  class Help {
   public function __construct() {
    echo "Мы в контроллере HELP";
   }

   public function other($arg = false) {
    echo "Мы в методе other контроллера Help";
    echo "Параметры: ".$arg;
   }
  }
?>

Теперь в адресной строке браузера напишем так: ваш_домен.ru/help/other/10 В метод передастся 10, и он это выведит.

Итак, вот мы уже и сделали наш роутер рабочим. Конечно, это только начало, но оно уже положено. Дальше будет только интересней. Спасибо за внимание!

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

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

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (15):

tutala tutala 22.06.2014 21:50:51

Ссылку на наработанный материал прилепляй. Люди спасибо скажут.

Ответить

php_programmer php_programmer 23.06.2014 01:59:14

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

Ответить

kruty kruty 23.06.2014 14:41:55

Краще використовуйте nginx. Там і синтаксис реврайтів простіший і швидше працює. Для тестування на віндовс є - winginx.

Ответить

Samy Samy 23.06.2014 19:53:45

Михаил а возможно ли создать видео урок по теме MVC на основе этой серии статей мне механизм MVC мало понятен ,то есть теоретически да но как практически это действует не очень, а на основе практического маленького движка в видео формате ,в видео мне понятней, может и пойму!!! ПЛИЗ ПЛИЗ ПЛИЗ!!!

Ответить

logaut logaut 23.06.2014 20:27:58

Михаил, у вас на - этой странице опечатка. У вас так: вы увидите, что сработвал контроллер Help. А надо так: вы увидите, что сработал контроллер Help. Кстати, Михаил, а почему бы не соединять файлы таким образом: $this->load->view('header_view'); тогда и require не понадобится. И ещё... Почему не отображается моё имя, а в место него выводиться логин?

Ответить

andrei123 andrei123 16.10.2014 17:28:21

$url = $_GET['url']; не ноходить url

Ответить

Jey-Val-Star Jey-Val-Star 02.12.2014 11:42:38

Здравствуйте, а как сделать чпу как в joomla? Роутинг не совсем подходит так как нужна динамика ссылок 2-го уровня.

Ответить

mpamop mpamop 22.05.2015 22:07:40

Добрый день, Михаил. Подскажите пожалуйста, скопипастил код, но url в _GET массив не попадает - это не отрабатывает htaccess? Как его нужно поправить? Спасибо

Ответить

Amilo Amilo 27.05.2015 15:37:13

Здравствуйте. Очень классный сайт и очень мне помог. Но в вашем примере главного файла index.php есть такая проблема: если мы переходим по ссылке site.com/index то открывает файл который находится в controllers/index.php. Но а что если файл в controllers/index.php главная страница и нужно чтобы по адресу site.com/ открывался файл controllers/index.php? В данном примере автора если перейти на site.com то отображает ошибку "Warning: require(controllers/.php): failed to open stream: No such file or directory" Вот решение. В моем случае главный файл index.php: <?php $url = $_GET['url']; $url = rtrim($url, '/'); $url = explode('/', $url); if (file_exists('controllers/'.$url[0].'.php')) { require 'controllers/'.$url[0].'.php'; $controller = new $url[0]; } else { require 'controllers/index.php'; $controller = new index; } if(isset($url[2])) { $controller->$url[1]($url[2]); } else { if(isset($url[1])) { $controller->$url[1](); } } ?>

Ответить

atamvova atamvova 24.07.2015 01:20:31

Тут в коде главного файла ошибка, после: <?php $url = $_GET['url']; не хватает: if (!$url) $url = 'index';

Ответить

Web-дизайнер. Web-дизайнер. 21.12.2015 13:01:33

Да, после добавления вашей подсказки ( if (!$url) $url = 'index'; ) сработало. До ннеё выводилась ошибка: Warning: require(controllers/.php): failed to open stream: No such file or directory in E:\OpenServer\domains\my-mvc\index.php on line 6 Fatal error: require(): Failed opening required 'controllers/.php' (include_path='.;e:/openserver/modules/php/PHP-5.5;e:/openserver/modules/php/PHP-5.5/PEAR/pear') in E:\OpenServer\domains\my-mvc\index.php on line 6. Теперь выводится такая строчка: Мы в контроллере INDEX

Ответить

lutchin lutchin 14.05.2016 20:09:19

тогда зачем городить...проще сразу написать $url = 'index'; ))) вопрос почему php $url = $_GET['url']; это не работает?

Ответить

cheponya cheponya 14.10.2015 12:38:06

прям со старта не заводятся) в $url не передается гет

Ответить

skymd2 skymd2 26.04.2016 13:08:04

Присоединюсь к выше сказанному, тогда уже вот так: [code] $url = $_GET['url']; define('DS', '/'); define('ROOT', $_SERVER['DOCUMENT_ROOT']); define('CTRL', ROOT . DS . 'controllers'); $url = isset($url) ? strtolower($url) : 'index'; require_once(CTRL.DS.$url.'.php'); $controller = new $url; [/code]

Ответить

gerz gerz 25.12.2015 09:03:02

Если вместо Apache используется NGINX, то .htaccess не вариант. Для NGINX надо добавить в конфиг: location / { try_files $uri $uri/ /index.php?url=$request_uri; }

Ответить

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.