Где поставить отдельный класс или классы бизнес-логики в CakePHP 3?

Я разрабатываю новое приложение и планирую использовать CakePHP 3. Как правило, при разработке приложения поверх фреймворка PHP MVC (CakePHP, CodeIgniter) я реализовал отдельный набор классов, представляющих бизнес-уровень или уровень обслуживания ( в зависимости от того, какие слова вы хотите использовать). Таким образом, стек:

- Представления

- Контроллеры [действительно просто другая часть просмотров; код с земли С#]

- бизнес-уровень [где бизнес-логика идет, потому что бизнес-логика охватывает несколько доменных объектов и не подходит для одной модели /DAO ]

- Модели [aka Объекты доступа к данным]

... с объектами домена (теперь "Объекты" в Cake PHP 3), проходящие между слоями.

Я вижу, что Cake PHP 3 по-прежнему не имеет концепции бизнес-уровня в архитектуре по умолчанию, что является разочаровывающим, но вряд ли непреодолимым. Но после всего этого мой вопрос на самом деле довольно пешеходный. Это: Где я могу разместить MyBusinessLayer.php? В Cake PHP 2 я бы поместил его в приложение /Lib и загрузил его с помощью

App::Import('Lib', 'MyBusinessLayer');

Что такое эквивалент в CakePHP 3 и как его загрузить? Я понимаю, что могу просто прикрепить к нему какое-то старое место и require_once(), но мне интересно, есть ли способ, который более соответствует стандартам Cake PHP. Этот вопрос можно так же легко применить к десятистрочному классу утилиты, но в моем случае это относится к бизнес-уровню.

Ответ 1

Ваш бизнес-уровень можно поместить в каталог src. Например, у вас может быть папка с именем src/Core или src/MyBusiness, или у вас может быть несколько папок, таких как src/Command src/Handler, зависит от вас, как вы хотите, чтобы архитектура вашего приложения отличалась от обслуживания веб-запроса или доступа к данным в базе данных.

Классы, помещенные внутри любой папки внутри src, будут автоматически загружены, если задано правильное пространство имен.

// in src/MyBusiness/BusinessRules.php

namespace App\MyBusiness;
class BusinessRules
{
    ...
}

Вы можете автоматически загрузить этот класс из другого ключевого слова use:

// In another file
use App\MyBusiness\BusinessRules;

...
$rules = new BusinessRules();

CakePHP не делает предположений для вас, когда дело касается таких объектов, поскольку они обычно очень специфичны для вашего приложения. Он предлагает широкий спектр инструментов, которые могут помочь вам построить лучшую архитектуру быстрее и с меньшим количеством кода. Например, используя систему Event для аспектно ориентированного программирования, характеристики конфигурации для создания адаптируемых реализаций или библиотеки Collection для работы с данными с использованием функционального подхода.