<MyRusakov.ru />

Фреймворк Yii 2.0 с нуля. Пример создания сайта

Фреймворк Yii 2.0 с нуля. Пример создания сайта

Видеокурс "Фреймворк Yii 2.0 с нуля. Пример создания сайта" обучит Вас созданию профессиональных сайтов с использованием фреймворка Yii. В курсе есть 2 раздела: теоретический и практический. В теоретическом разделе будут разобраны возможности фреймворка Yii с примерами их использования, а в практической части будет создан сайт Blog.MyRusakov.ru с помощью полученных знаний из теоретического раздела.

Так же почти ко всем урокам идут упражнения для закрепления материала из урока на практике.

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

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

Подписавшись по 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; }

Ответить

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