Получение данных для шаблона

Шаг 2, движение к MVC.

MVC – model view controller. В шаге 1, мы сделали с вами первый контроллер. Но он был «неправильный» и обладал массой недостатков. Попробуем это немного исправить.

И так открываем наш контроллер.

/system/modules/hello/controllers/Index.php

И начинаем писать в нем по другому.

  1. Укажем ему .
  2. Скажем что это , который,наследуется от основного контроллера системы.
  3. В итоге у вас должен получиться следующий вид:
<?php

namespace modules\hello\controllers;
use core\Controller;

class Index extends Controller {   

}
  1. Обратите внимание на две вещи:
    • Название класса = названию файла.
    • Он наследуется от контроллера «из ядра». На что указывает строка ….

И так отлично, но теперь при попытке открыть УРЛ /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.