====== Ключевые понятия контроллера Limb3 ====== **Контроллер** - широкое понятие, в целом, контроллер - отвечает за логику работы приложения. В Limb3 контроллер употребляется в 2-х смыслах: * **Front controller** - часть приложения, которая отвечает за самую общую логику работы приложения: старт сессии, разбор запроса, проверка кеширования, запуск конкретного кода, отвечающий за бизнес-логику текущей страницы, рендеринг шаблона и т.д. * **Page controller** (мы его часть называем просто контроллер) - классы, которые реализуют конкретную бизнес-логику приложения, например, удаление новости, аутентификация пользователей, создание документа и т.д. Когда мы говорим **контроллер - чаще всего имеем ввиду именно page controller**. **Front controller** или **ядро приложения** в приложениях, выполненных на базе WEB_APP, состоит из так называемой **цепочки фильтров (Filter chain)**. см. [[filter_chain|Использование цепочки фильтров для организации Front-Controller]]. С контроллером также следующие понятия: * **Request** - **Запрос**. Запрос содержит данные, которые пришли от клиента (пользователя) к системе. Для обычного сайта в Запросе хранятся POST и GET переменные, URI запроса, а также данные по отосланным файлам, если они есть. Объект запроса можно получить в любой точке приложения при помощи тулкита: $request = lmbToolkit :: instance()->getRequest(); * **Response** - **Ответ**. Ответ содержит данные, которые система отдает клиенту после полной обработки Запроса. Для обычного сайта в Ответе хранятся заголовки, текст ответа, куки и т.д. Объект ответа можно получить в любой точке приложения при помощи тулкита: $response = lmbToolkit :: instance()->getResponse(); * [[request_dispatching|Разбор Запроса (Request Dispatching)]]. Обязательный этап в работе почти любого приложения; используется для того, чтобы проанализировать Запрос (Request) и решить, что именно система должна сделать. Результатом работы системы является объект класса [[lmb_controller|lmbController]] , который хранится в тулките в виде $dispatched_controller (текущий контроллер). Текущий контроллер обычно имеет так называемое **текущее дествие** (current action). Текущий контроллер можно получить из тулкита: $dispatched_controller = lmbToolkit :: instance()->getDispatchedController(); * **%%PageController%%** - это группа действий, относящихся к какой-то предметной или функциональной области. Например, есть контроллер администрирования новостей %%AdminNewsController%%, в этот контроллер входят действия по отображения списка новостей, созданию новости, редактированию новости, удалению новости. Можно сказать, что контроллер страницы - это объект над которым, в рамках приложения, выполняются какие-то действия. Можно условно рассматривать контроллер как модуль системы. * **Action** (**Действие**). Функциональная единица приложения. Можно рассматривать действие как отдельную страницу или лучше как тип страницы. Действие обязательно принадлежит какому-либо контроллеру. Например, есть действие create контроллера %%AdminNewsController%% для создания новости. Простое отображение, например, списка новостей - есть действие display контроллера %%AdminNewsController%%. Действия чаще всего реализуются как методы классов контроллеров. В реализации действия обычно определяется, какие изменения над данными нужно произвести, какой шаблон должен будет отображен и т.д. * **Forward** (**Перенаправление**). Для случаев, когда в зависимости от запроса нужно выполнить другое действие, в %%PageController%% существует метод forward, который перенаправляет из текущего action в другой, в том числе и другого контроллера. Соотвественно обрабатываться будет шаблон перенаправленного action. Следует заметить, что название контроллера и действие должно писаться строчными буквами. Контроллер в общем можно расширять как вширь (делать более богатые функционально приложения), так и вглубь (делать более сложную логику работы приложения). То есть можно увеличивать количество контроллеров страниц, а можно регистрировать новые фильтры. Можно усложнить логику работы приложений и за счет выполнения более сложных действий. См. также: * [[.application_workflow|Схема работы типичного Limb3 приложения]] * [[.filter_chain|Использование цепочки фильтров для организации Front-Controller]]