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