<?php
namespace IcebirdCMS\App;
use Application\Core\Engine\Ajax as ApplicationAjax;
use Application\Core\Engine\Application;
use Web\Core\Engine\Ajax as WebAjax;
use Web\Core\Engine\Web;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Application\Init as ApplicationInit;
use Web\Init as WebInit;
use Common\Exception\RedirectException;
use Symfony\Component\HttpFoundation\Response;
use Twig_Error;
class IcebirdController extends Controller
{
const DEFAULT_APPLICATION = 'Web';
private static $routes = [
'' => self::DEFAULT_APPLICATION,
'backoffice' => 'Application',
'Backoffice' => 'Application'
];
public static function getRoutes(): array
{
return self::$routes;
}
public function applicationController(): Response
{
defined('APPLICATION') || define('APPLICATION', 'Application');
defined('NAMED_APPLICATION') || define('NAMED_APPLICATION', 'backoffice');
$applicationClass = $this->initializeApplication('Application');
$application = new $applicationClass($this->container->get('kernel'));
return $this->handleApplication($application);
}
public function applicationAjaxController(): Response
{
defined('APPLICATION') || define('APPLICATION', 'Application');
$applicationClass = $this->initializeApplication('ApplicationAjax');
$application = new $applicationClass($this->container->get('kernel'));
return $this->handleApplication($application);
}
public function webController(): Response
{
defined('APPLICATION') || define('APPLICATION', 'Web');
$applicationClass = $this->initializeWeb('Web');
$application = new $applicationClass($this->container->get('kernel'));
return $this->handleApplication($application);
}
public function webAjaxController(): Response
{
defined('APPLICATION') || define('APPLICATION', 'Web');
$applicationClass = $this->initializeWeb('WebAjax');
$application = new $applicationClass($this->container->get('kernel'));
return $this->handleApplication($application);
}
protected function handleApplication(ApplicationInterface $application): Response
{
$application->passContainerToModels();
try {
$application->initialize();
return $application->display();
} catch (RedirectException $ex) {
return $ex->getResponse();
} catch (Twig_Error $twigError) {
if ($twigError->getPrevious() instanceof RedirectException) {
return $twigError->getPrevious()->getResponse();
}
throw $twigError;
}
}
protected function initializeApplication(string $app): string
{
$init = new ApplicationInit($this->container->get('kernel'));
$init->initialize($app);
return $app === 'ApplicationAjax' ? ApplicationAjax::class : Application::class;
}
protected function initializeWeb(string $app): string
{
$init = new WebInit($this->container->get('kernel'));
$init->initialize($app);
return $app === 'WebAjax' ? WebAjax::class : Web::class;
}
}