Параметры текущего маршрута теперь сохраняются в объект запроса, а не хранятся в контейнере как было раньше. Из di('route') всё ещё можно достать данные о параметрах в рамках обратной совместимости, но из контейнера напрямую больше нельзя. В своих модулях вам необходимо провести замену кода сделующим образом:
Переопределение сервисов
Раньше сервисы можно было переопределять через config/autoload/dependencies.local.php.
Теперь переопределение можно выполнить в файле config/services.local.php. Для переопределения просто скопируйте файл services.local.php.example и назовите его services.local.php
В файле-примере есть закомментированный пример переопределения.
Базовый контроллер: отказ от наследования
Начиная с текущей версии, рекомендуется отказаться от наследования базового контроллера (BaseController) и использовать ControllerContext.
Это упрощает контроллеры, делает зависимости явными, уменьшает скрытую магию и облегчает тестирование.
Контроллеры больше не обязаны наследоваться от общего класса — вся инициализация (шаблоны, переводы, навигация) вынесена в отдельный сервис.
Было (наследование):
Стало (ControllerContext + composition):
Преимущества:
нет наследования
явные зависимости через DI
контроллер остаётся тонким HTTP-адаптером
проще писать и тестировать
Для новых контроллеров рекомендуется использовать invokable-контроллеры и инициализацию через \Johncms\Http\Controller\ControllerContext.
BaseController считается устаревшим и будет удалён в будущих версиях.
Для админских контроллеров используйте \Johncms\Http\Controller\AdminControllerContext
// Было
$route = di('route');
$route = $container->get('route')
// Стало
$route = di(\Johncms\System\Http\Request::class)->getCurrentRouteParams();
final class GuestbookController extends BaseController
{
protected string $module_name = 'guestbook';
public function index(): string
{
return $this->render->render('guestbook::index');
}
}
final class GuestbookController
{
public function __construct(
private readonly ControllerContext $context,
private readonly Render $render,
) {
$this->context->initModule('guestbook');
}
public function __invoke(): string
{
return $this->render->render('guestbook::index');
}
}