Yii2. Создаем свой контроллер

24.02.2019

Теги: PHPWeb-разработка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

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.