<?php /* * Copyright (c) 2022. Micha Espey <tracer@24unix.net> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace App\Service; use App\Controller\AddressBookAdminController; use App\Controller\AddressBookController; use App\Controller\SecurityController; use App\Entity\User; use App\Repository\AddressRepository; use App\Repository\UserRepository; /* * A quick and dirty class container for DI. * Caveat: Classes are always instantiated * No autowiring (yet, maybe later, but it might fit for a demo) */ class Container { private AddressBookController $addressBook; private AddressBookAdminController $addressBookAdmin; private AddressRepository $addressRepository; private Config $config; private DatabaseConnection $databaseConnection; private Router $router; private SecurityController $securityController; private Template $template; private User $user; private UserRepository $userRepository; public function __construct() { $this->config = new Config(); $this->databaseConnection = new DatabaseConnection(config: $this->config); $this->template = new Template(templateDir: dirname(path: __DIR__, levels: 2) . '/templates/'); $this->router = new Router(template: $this->template); $this->userRepository = new UserRepository(databaseConnection: $this->databaseConnection); $this->addressRepository = new AddressRepository(databaseConnection: $this->databaseConnection); $this->securityController = new SecurityController(template: $this->template, userRepository: $this->userRepository, router: $this->router); if (empty($_SESSION['user_id'])) { $this->user = new User(); // ANONYMOUS } else { $this->user = $this->userRepository->findByID(id: $_SESSION['user_id']); } $this->addressBook = new AddressBookController(template: $this->template, user: $this->user, addressRepository: $this->addressRepository, router: $this->router); $this->addressBookAdmin = new AddressBookAdminController(template: $this->template, user: $this->user, userRepository: $this->userRepository, router: $this->router); } public function get(string $className): object { return match ($className) { 'App\Controller\AddressBookController' => $this->addressBook, 'App\Controller\AddressBookAdminController' => $this->addressBookAdmin, 'App\Controller\SecurityController' => $this->securityController, 'App\Service\Router' => $this->router, //default => throw new Exception(message: "Missing class definition: $class") default => die("Missing class definition: $className") }; } }