Yii2 basic: Что такое MVC, controller и action (контроллеры и экшины)?

· Yii2 basic · 3 мин чтения

В этой записи, вы научитесь как создавать controller’ы, action’ы в Yii2 basic, как они работают и что нужно всегда помнить при их создании.

Эта запись относится к курсу Yii2 basic.

Словарь

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

  • controller — контроллер
  • action — экшин
  • view — шаблон
  • model — модель

MVC

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

Я распишу, как MVC используется в Yii2.

  • View — это, как правило HTML файлы, которые находятся в папке views и внутренняя структура зависит от названия контроллера. Допустим, если контроллер называется SiteController, то берется часть до Controller — «Site», меняется в нижний регистр, и, тем самым, путь до шаблонов этого контроллера становится — views/site.
  • Controller — это класс, который указывает приложению «что нужно делать». С его помощью вы создаёте action’ны и каждый из них будет выводить нужный шаблон (HTML файл — view), но не всегда.

Например, RESTful и консольные контроллеры, которые не имеют view, так как оба выполняют другие функции в отличии от обычного контроллера. Но тема этой записи не об этом, поэтому упустим это.

Допустим, если вы сейчас зайдете на сайт http://yii.loc/site/login, то можете заметить, что название ссылка состоит из контроллера — site и action — login.

Код этого контроллер вы можете найти в controllers/SiteController.php — это стандартный контроллер, который идёт после  установки Yii2 basic или advanced. Внутри будет action — actionLogin, который отвечает за отображение страницы авторизации.

Controller, action, view на живом примере

Возьмем страницу site/login и детальнее рассмотрим её.

Как я уже выше описывал, используется SiteController, потому что site — это название контроллера, а login — название action.

Опять же, есть такие исключения как urlManager, в котором можно изменить правила отображения ссылок. То есть название ссылки может значительно или вовсе отличаться от настоящего имени контроллера и/или экшина.

Дальше заходим в файл SiteController в папке controllers и находим метод actionLogin(), который отвечает за отображение страницы site/login.

Выглядит этот метод следующим образом:

/**
 * Login action.
 *
 * @return Response|string
 */
public function actionLogin()
{
    if (!Yii::$app->user->isGuest) {
        return $this->goHome();
    }

    $model = new LoginForm();
    if ($model->load(Yii::$app->request->post()) && $model->login()) {
        return $this->goBack();
    }
    return $this->render('login', [
        'model' => $model,
    ]);
}

Разбить этот его можно на три основных части.

Часть первая: проверяем если пользователь авторизован, то возвращаем его на главную страницу, тем самым не давая вернуться на страницу авторизации.

if (!Yii::$app->user->isGuest) {
    return $this->goHome();
}

Часть вторая: используем модель LoginForm() для проверки полей, которые находятся в третьей части, когда action начинает рендерить (используя render() метод)  login.php шаблон с данными из $model. Строчка $model->load(Yii::$app->request->post()) && $model->login() проверяет если ли $_POST запрос связанный именно с формой авторизации и если «да», то логика if() продолжается на методе login() из LoginForm() и если все успешно (логин и пароль верны и удалось создать сессию для пользователя), то его перекидывает на главную страницу и он становится авторизованным.

$model = new LoginForm();
if ($model->load(Yii::$app->request->post()) && $model->login()) {
   return $this->goBack();
}

Часть третья: используем views/site/login.php для вывода информации о странице. Но кроме вывода, туда пускаются еще данные о модели ('model' => $model), которая будет использоваться для проверки полей формы авторизации.

return $this->render('login', [
    'model' => $model,
]);

Как правило, в каждом action есть модель, которая обрабатывает его, потом проверяется если запрос, например $_POST и далее происходит какая-либо логика приложения и, конечно же, указывается имя шаблона, которое используется для отображения. В этой и заключается MVC в Yii2.

 

Читать далее — Yii2 basic: Создаем контроллер, форму, делаем валидацию, миграцию, сохраняем в базу