Skip to content

Latest commit

 

History

History
104 lines (79 loc) · 7.26 KB

controllers.md

File metadata and controls

104 lines (79 loc) · 7.26 KB

Контроллеры

Контроллеры в OkayCMS нужны для обработки маршрутов. Контроллеры делятся на фронт-контроллеры (клиентская часть) и бек-контроллеры (админ часть). Также эти контроллеры делятся на стандартные (которые присутствуют в системе по умолчанию) и модульные (которые добавляются из модулей).

Общий порядок работы контроллеров. Сразу зайдя на страницу роутер создает экземпляр контроллера, затем вызывает метод onInit после него вызывает метод контроллера, указанный в роуте.

В методе контроллера стоит установить контент, который должен возвращаться пользователю. Для этого вызовите метод Response::setContent().

Фронт-контроллеры

По умолчанию контроллеры лежат в неймспейсе Okay\Controllers\ и МОГУТ наследоваться от Okay\Controllers\AbstractController.

В большинстве случаем желательно наследоваться от AbstractController, чтобы у вас уже был проинициализирован дизайн, валюты, языки etc. Но в случае, когда нужно сделать "лёгкий" контроллер (например для обработки не сложных ajax запросов), можно не наследоваться, но в таком случае если нужен дизайн или еще что-то что инициализировалось в AbstractController, его нужно получать отдельно в методе контроллера через инъекцию зависимости. Также можно определить свои методы onInit() и afterController().

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

Получение сервисов из контейнера

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

Например:

namespace Okay\Controllers;

use Okay\Entities\BlogEntity;
use Okay\Helpers\CommentsHelper;

class BlogController extends AbstractController
{
    public function fetchPost(
        BlogEntity $blogEntity,
        CommentsHelper $commentsHelper
    ) {
        //...abstract
    }
}

Получение параметров из марштута

Чтобы получить параметры из маршрута в контроллере, нужно в методе контроллера указать аргумент, одноимённый с параметром маршрута (указанным в поле slug), при этом type hint не указывается. Если роут предполагает что параметр является опциональным, в методе стоит ему тоже задать значение по умолчанию.

Например для slug роута /cart/{$variantId} в методе можно ловить переменную $variantId

Пример:

namespace Okay\Controllers;

use Okay\Core\Cart;

class CartController extends AbstractController
{
    public function addItem(Cart $cartCore, $variantId)
    {
        //...abstract
    }
}

Бек-контроллеры

Контроллеры админ-части по умолчанию лежат в неймспейсе Okay\Admin\Controllers (это директория backend/Controllers). Все контроллеры админки должны наследоваться от Okay\Admin\Controllers\IndexAdmin. У контроллеров админ-части по умолчанию вызывается метод fetch(). Если нужно вызвать другой метод контроллера, нужно в урле название контроллера указать как ControllerName@methodName. Например: backend/index.php?controller=OrdersAdmin@myFunc вызовется метод myFunc контроллера OrdersAdmin. Имя метода может содержать только символы a-zA-Z0-9 Зависимости можно получать также, как и для фронт-контроллеров. Параметров маршрута для контроллера админки не бывает. Разве что $_GET параметры.

Фронт-контроллеры модулей

Контроллеры модулей стоит размещать в директории Okay/Modules/Vendor/Module/Controllers, в остальном, они ничем не отличаются от стандартных фронт-контроллеров. Роут к ним также прописывается в файле Init/routes.php.

Бек-контроллеры модулей

Бек-контроллеры модулей, полностью соответствуют стандартным бек-контроллерам, но располагаются в директории Okay/Modules/Vendor/Module/Backend/Controllers. Еще одно отличие в использовании: стандартный контроллер в админ панели доступен по урлу https://demookay.com/backend/?controller=ProductsAdmin, контроллеры модулей имеют немного инной формат. Название контроллера должно состоять из имени поставщика, имени модуля и названия самого контроллера разделённых точкой.

Например: https://demookay.com/backend/index.php?controller=OkayCMS.FAQ.FAQsAdmin, об этом стоит помнить, когда пишете URL на контроллер в tpl файле модуля.