Use a factory to Config and LocaleManager (see #298)

This commit is contained in:
Pierre Rudloff 2020-07-15 23:05:41 +02:00
parent 96a75cbf14
commit 280618bb6b
9 changed files with 145 additions and 87 deletions

View file

@ -261,6 +261,7 @@ class Config
* Get Config singleton instance. * Get Config singleton instance.
* *
* @return Config * @return Config
* @todo Stop using a singleton.
*/ */
public static function getInstance() public static function getInstance()
{ {

40
classes/ConfigFactory.php Normal file
View file

@ -0,0 +1,40 @@
<?php
namespace Alltube;
use Symfony\Component\ErrorHandler\Debug;
/**
* Class ConfigFactory
* @package Alltube
*/
class ConfigFactory
{
/**
* @return Config
* @throws Exception\ConfigException
*/
public static function create()
{
$configPath = __DIR__ . '/../config/config.yml';
if (is_file($configPath)) {
Config::setFile($configPath);
}
$config = Config::getInstance();
if ($config->uglyUrls) {
$container['router'] = new UglyRouter();
}
if ($config->debug) {
/*
We want to enable this as soon as possible,
in order to catch errors that are thrown
before the Slim error handler is ready.
*/
Debug::enable();
}
return $config;
}
}

View file

@ -83,7 +83,7 @@ abstract class BaseController
*/ */
public function __construct(ContainerInterface $container) public function __construct(ContainerInterface $container)
{ {
$this->config = Config::getInstance(); $this->config = $container->get('config');
$this->container = $container; $this->container = $container;
$session = SessionManager::getSession(); $session = SessionManager::getSession();
$this->sessionSegment = $session->getSegment(self::class); $this->sessionSegment = $session->getSegment(self::class);

View file

@ -4,6 +4,10 @@ namespace Alltube\Exception;
use Exception; use Exception;
/**
* Class ConfigException
* @package Alltube\Exception
*/
class ConfigException extends Exception class ConfigException extends Exception
{ {

View file

@ -0,0 +1,14 @@
<?php
namespace Alltube\Exception;
use Exception;
/**
* Class DependencyException
* @package Alltube\Exception
*/
class DependencyException extends Exception
{
}

View file

@ -172,6 +172,7 @@ class LocaleManager
* Get LocaleManager singleton instance. * Get LocaleManager singleton instance.
* *
* @return LocaleManager * @return LocaleManager
* @todo Stop using a singleton.
*/ */
public static function getInstance() public static function getInstance()
{ {

View file

@ -0,0 +1,26 @@
<?php
namespace Alltube;
use Alltube\Exception\DependencyException;
/**
* Class LocaleManagerFactory
* @package Alltube
*/
class LocaleManagerFactory
{
/**
* @return LocaleManager|null
* @throws DependencyException
*/
public static function create()
{
if (!class_exists('Locale')) {
throw new DependencyException('You need to install the intl extension for PHP.');
}
return LocaleManager::getInstance();
}
}

View file

@ -4,6 +4,7 @@ namespace Alltube;
use Consolidation\Log\Logger; use Consolidation\Log\Logger;
use Consolidation\Log\LogOutputStyler; use Consolidation\Log\LogOutputStyler;
use Slim\Container;
use Symfony\Component\Console\Output\ConsoleOutput; use Symfony\Component\Console\Output\ConsoleOutput;
/** /**
@ -14,11 +15,12 @@ class LoggerFactory
{ {
/** /**
* @param Container $container
* @return Logger * @return Logger
*/ */
public static function create() public static function create(Container $container)
{ {
$config = Config::getInstance(); $config = $container->get('config');
if ($config->debug) { if ($config->debug) {
$verbosity = ConsoleOutput::VERBOSITY_DEBUG; $verbosity = ConsoleOutput::VERBOSITY_DEBUG;
} else { } else {

View file

@ -2,68 +2,41 @@
require_once __DIR__ . '/vendor/autoload.php'; require_once __DIR__ . '/vendor/autoload.php';
use Alltube\Config; use Alltube\ConfigFactory;
use Alltube\Controller\DownloadController; use Alltube\Controller\DownloadController;
use Alltube\Controller\FrontController; use Alltube\Controller\FrontController;
use Alltube\Controller\JsonController; use Alltube\Controller\JsonController;
use Alltube\LocaleManager; use Alltube\LocaleManagerFactory;
use Alltube\LocaleMiddleware; use Alltube\LocaleMiddleware;
use Alltube\LoggerFactory; use Alltube\LoggerFactory;
use Alltube\UglyRouter;
use Alltube\ViewFactory; use Alltube\ViewFactory;
use Slim\App; use Slim\App;
use Slim\Container; use Slim\Container;
use Symfony\Component\ErrorHandler\Debug;
if (isset($_SERVER['REQUEST_URI']) && strpos($_SERVER['REQUEST_URI'], '/index.php') !== false) { if (isset($_SERVER['REQUEST_URI']) && strpos($_SERVER['REQUEST_URI'], '/index.php') !== false) {
header('Location: ' . str_ireplace('/index.php', '/', $_SERVER['REQUEST_URI'])); header('Location: ' . str_ireplace('/index.php', '/', $_SERVER['REQUEST_URI']));
die; die;
} }
if (is_file(__DIR__ . '/config/config.yml')) {
try { try {
Config::setFile(__DIR__ . '/config/config.yml');
} catch (Exception $e) {
die('Could not load config file: ' . $e->getMessage());
}
}
// Create app. // Create app.
$app = new App(); $app = new App();
/** @var Container $container */ /** @var Container $container */
$container = $app->getContainer(); $container = $app->getContainer();
// Load config. // Config.
$config = Config::getInstance(); $container['config'] = ConfigFactory::create();
if ($config->uglyUrls) {
$container['router'] = new UglyRouter();
}
if ($config->debug) {
/*
We want to enable this as soon as possible,
in order to catch errors that are thrown
before the Slim error handler is ready.
*/
Debug::enable();
}
// Locales. // Locales.
if (!class_exists('Locale')) { $container['locale'] = LocaleManagerFactory::create();
die('You need to install the intl extension for PHP.');
}
$container['locale'] = LocaleManager::getInstance();
$app->add(new LocaleMiddleware($container)); $app->add(new LocaleMiddleware($container));
// Smarty. // Smarty.
try {
$container['view'] = ViewFactory::create($container); $container['view'] = ViewFactory::create($container);
} catch (SmartyException $e) {
die('Could not load Smarty: ' . $e->getMessage());
}
// Logger. // Logger.
$container['logger'] = LoggerFactory::create(); $container['logger'] = LoggerFactory::create($container);
// Controllers. // Controllers.
$frontController = new FrontController($container); $frontController = new FrontController($container);
@ -110,10 +83,7 @@ $app->get(
[$jsonController, 'json'] [$jsonController, 'json']
)->setName('json'); )->setName('json');
try {
$app->run(); $app->run();
} catch (SmartyException $e) {
die('Smarty could not compile the template file: ' . $e->getMessage());
} catch (Throwable $e) { } catch (Throwable $e) {
// Last resort if the error has not been caught by the error handler for some reason. // Last resort if the error has not been caught by the error handler for some reason.
die('Error when starting the app: ' . htmlentities($e->getMessage())); die('Error when starting the app: ' . htmlentities($e->getMessage()));