Шаг 2, движение к MVC.
MVC – model view controller. В шаге 1, мы сделали с вами первый контроллер. Но он был «неправильный» и обладал массой недостатков. Попробуем это немного исправить.
И так открываем наш контроллер.
/system/modules/hello/controllers/Index.php
И начинаем писать в нем по другому.
- Укажем ему .
- Скажем что это , который,наследуется от основного контроллера системы.
- В итоге у вас должен получиться следующий вид:
<?php
namespace modules\hello\controllers;
use core\Controller;
class Index extends Controller {
}
- Обратите внимание на две вещи:
- Название класса = названию файла.
- Он наследуется от контроллера «из ядра». На что указывает строка ….
И так отлично, но теперь при попытке открыть УРЛ /hello мы увидим ошибку, так как нет ни одного метода-действия. Создадим первое действие:
<?php
namespace modules\hello\controllers;
use core\Controller;
class Index extends Controller
{
public function actionIndex()
{
}
}
Снова открываем URL и получаем белый экран. Так как теперь у нас есть обработчик, но нет ничего для работы в нем, и несмотря на то, что он выполнился, на экране пусто, что логично.
Но уже есть важное отличие, попробуем открыть урл /hello/cool , раньше он у нас открывался, а теперь вернул ошибку! Потому, как обработчика на этот урл нет. Как же его сделать?
Создадим еще один метод в классе, и назовем его actionCool. Отлично! И оно заработало! При этом для других урлов, обработчика нет, и они отображают ошибку.
ВАЖНО: чтобы метод был обработчиком, он должен иметь префикс “action”
Попробуем сделать так, чтобы наш ACTION начал обрабатывать.
Изменим метод:
public function actionIndex($id)
{
}
Как видим, мы потребовали, чтобы $id был обязательным параметром. Поэтому, если мы откроем ссылку, /hello то получим ошибку! Но если передадим параметр например
/hello/111
То страница откроется. Но есть нюанс. Теперь мы считаем, что если открыть ссылку
/hello/cool то мы увидим, параметр cool и экшен Cool. Но это не так, по приоритету сначала идет экшен, затем параметры. Поэтому откроется соответствующий экшен Cool.
Теперь попробуем открыть ссылку
/hello/123 и у нас правильно откроется actionIndex и параметр будет равен 123.
Но что если мы хотим сделать параметр необязательным, или больше параметров добавить? В этом случае мы делаем так:
public function actionIndex($id, $id2=false)
{
echo $id;
}
В этом случае, $id является обязательным, а $id2 необязательным.
Соответственно
/hello/123 -- корректный
/hello/12/34 -- корректный
/hello -- ОШИБКА
Когда хочется чуточку большего
Иногда хочется, чтобы контроллер реагировал только на определенные методы как GET или POST, в этом случае вы может писать так:
public function getInn(){
//отдать инн из БД
}
public function postInn(){
//записать инн в БД
}
При таком написании, методы будут отдаваться только на указанный тип запроса.
Вот так коротко мы сделали первый, более ПРАВИЛЬНЫЙ контроллер.
Продолжаем развитие, в шаге 3.