Yii2. Создаем свой контроллер
24.02.2019
Теги: PHP • Web-разработка • Yii2 • Теория • Фреймворк
Контроллеры являются частью MVC архитектуры. Это объекты классов, отвечающие за обработку запроса и формирование ответа. Контроллеры состоят из действий, к которым можно обращаться, чтобы запросить исполнение какого-то функционала. В контроллере может быть одно или несколько действий.
Контроллер для страниц публичной части сайта
Создаем файл контроллера /controllers/PageController.php
:
<?php namespace app\controllers; use yii\web\Controller; class PageController extends Controller { public function actionIndex() { return $this->render('index'); } }
Создаем файл шаблона /views/page/index.php
:
<?php /* @var $this yii\web\View */ use yii\helpers\Html; $this->title = 'Страница'; $this->params['breadcrumbs'][] = $this->title; ?> <div class="page-index"> <h1><?= Html::encode($this->title) ?></h1> <p>Вы можете изменять эту страницу, редактируя файл шаблона:</p> <code><?= __FILE__ ?></code> </div>
Эта страница доступна по адресу http://www.server.com/web/index.php?r=page/index
.
Если имя действия состоит из двух слов, тогда делаем так:
class PageController extends Controller { public function actionAboutCompany() { // файл шаблона /views/page/about-company.php return $this->render('about-company'); } }
<?php /* @var $this yii\web\View */ use yii\helpers\Html; $this->title = 'Страница'; $this->params['breadcrumbs'][] = $this->title; ?> <div class="page-about-company"> <h1><?= Html::encode($this->title) ?></h1> <p>Вы можете изменять эту страницу, редактируя файл шаблона:</p> <code><?= __FILE__ ?></code> </div>
Эта страница будет доступна по адресу http://www.server.com/web/index.php?r=page/about-company
.
Передача данных из контроллера в шаблон
Контроллер должен получать данные от модели и передавать их в шаблон, но пока модель не используем. Просто определяем переменую $data
и передаем ее из контроллера в шаблон. Эта переменная будет доступна в шаблоне под именем $lorem
:
<?php namespace app\controllers; use yii\web\Controller; class PageController extends Controller { public function actionIndex() { $data = 'Lorem ipsum dolor sit amet'; return $this->render('index', ['lorem' => $data]); } }
И выводим переменную $lorem
в шаблоне:
<?php /* @var $this yii\web\View */ use yii\helpers\Html; $this->title = 'Страница'; $this->params['breadcrumbs'][] = $this->title; ?> <div class="page-index"> <h1><?= Html::encode($this->title) ?></h1> <p>Переменная, полученная от контроллера: <?= $lorem; ?></p> <p>Вы можете изменять эту страницу, редактируя файл шаблона:</p> <code><?= __FILE__ ?></code> </div>
Передаем массив из контроллера в шаблон:
<?php namespace app\controllers; use yii\web\Controller; class PageController extends Controller { public function actionIndex() { $data = 'Lorem ipsum dolor sit amet'; $users = [ ['surname' => 'Иванов', 'email' => 'ivanov@mail.ru'], ['surname' => 'Петров', 'email' => 'petrov@mail.ru'] ]; return $this->render('index', ['lorem' => $data, 'users' => $users]); } }
И выводим этот массив в шаблоне:
<?php /* @var $this yii\web\View */ use yii\helpers\Html; $this->title = 'Страница'; $this->params['breadcrumbs'][] = $this->title; ?> <div class="page-index"> <h1><?= Html::encode($this->title) ?></h1> <p>Переменная, полученная от контроллера: <?= $lorem; ?></p> <?php if (!empty($users)): ?> <h3>Пользователи</h3> <ul> <?php foreach ($users as $user): ?> <li>Фамилия <?= $user['surname']; ?>, e-mail <?= $user['email']; ?></li> <?php endforeach; ?> </ul> <?php endif; ?> <p>Вы можете изменять эту страницу, редактируя файл шаблона:</p> <code><?= __FILE__ ?></code> </div>
PageController
и шаблоны для них. Тогда мы получим несколько разных страниц сайта. Собственно, мы создали упрощенный аналог класса SiteController
, который доступен сразу после установки Yii2.
Контроллер для страниц административной части сайта
Создаем файл контроллера для панели управления /controllers/admin/PageController.php
:
<?php namespace app\controllers\admin; use yii\web\Controller; class PageController extends Controller { public function actionIndex() { return $this->render('index'); } }
Создаем файл шаблона /views/admin/page/index.php
:
<?php /* @var $this yii\web\View */ use yii\helpers\Html; $this->title = 'Страница'; $this->params['breadcrumbs'][] = $this->title; ?> <div class="admin-page-index"> <h1><?= Html::encode($this->title) ?></h1> <p>Вы можете изменять эту страницу, редактируя файл шаблона:</p> <code><?= __FILE__ ?></code> </div>
Дополнительный класс контроллера
Создадим дополнительный класс контроллера, который будет родителем для всех контроллеров нашего приложения. В таком классе удобно определить методы, которые могут потребоваться во всех дочерних классах.
<?php /* * Файл /controllers/AppController.php */ namespace app\controllers; use yii\web\Controller; class AppController extends Controller { protected function debug($data, $return = false) { $result = '<pre>' . print_r($data, true) . '</pre>'; if ( ! $return) { echo $result; } return $result; } }
И внесем изменения в дочерние классы:
<?php /* * Файл /controllers/PageController.php */ namespace app\controllers; class PageController extends AppController { public function actionIndex() { return $this->render('index'); } public function actionAboutCompany() { return $this->render('about-company'); } }
<?php /* * Файл /controllers/admin/PageController.php */ namespace app\controllers\admin; use app\controllers\AppController; class PageController extends AppController { public function actionIndex() { return $this->render('index'); } }
Поиск: PHP • Web-разработка • Yii2 • Фреймворк • Контроллер • Controller • Представление • Шаблон • View • MVC • Framework