/** * Sets up the controller configurations for Silex (like routing) * * @param \Silex\Application $application * * @return \Silex\ControllerCollection * * @throws \Exception */ public function connect(Application $application) { self::$twig = $application['twig']; self::$session = $application['session']; self::$globalLayoutTemplate = $application['app_config']['global_layout_template']; $autoRoutes = $this->generateActionRoutes(); $controllers = $application['controllers_factory']; //get information needed to dynamically configure routes $fullCalledClassName = get_called_class(); $baseCalledClassName = $this->getNonNamespacedCalledClass(); $controllerRoutes = $application['routes_config'][$baseCalledClassName]; //setup default page $controllers->get('/', function (Application $application) use($controllerRoutes) { return $application->redirect($application['url_generator']->generate($controllerRoutes['default_route'])); }); //load the routes for this particular controller if (!empty($controllerRoutes['routes'])) { foreach ($controllerRoutes['routes'] as $route) { if (in_array($route['action'], $autoRoutes)) { $autoRoutes = array_diff($autoRoutes, array($route['action'])); } $name = !empty($route['name']) ? $route['name'] : $controllerRoutes['base_route'] . '_' . RegexHelper::cameCaseToUnderscore($route['action']); $method = !empty($route['method']) ? $route['method'] : 'get'; $routeObject = $controllers->match($route['route'], $fullCalledClassName . '::' . $route['action'] . 'Action')->method(strtoupper($method))->bind($name); RouteHelper::parametrize($routeObject, $route['parameters']); } } if (!empty($autoRoutes)) { foreach ($autoRoutes as $actionName) { $name = $controllerRoutes['base_route'] . '_' . RegexHelper::cameCaseToUnderscore($actionName); $controllers->get(RegexHelper::cameCaseToUnderscore($actionName), $fullCalledClassName . '::' . $actionName . 'Action')->bind($name); } } return $controllers; }
/** * Setup of the basic configuration for Silex and Salvo * * @param $application * @param $applicationRootDirectory */ private function __construct(Application $application, $applicationRootDirectory) { self::$applicationRootDirectory = $applicationRootDirectory; //load configurations $application['app_config'] = Yaml::parse(self::$applicationRootDirectory . '/configuration/application.yml'); $application['routes_config'] = Yaml::parse(self::$applicationRootDirectory . '/configuration/routes.yml'); #selix configurations $application['debug'] = $application['app_config']['debug']; //setup the root redirect using the app_config setting $application->get('/', function () use($application) { return $application->redirect($application['routes_config']['root_redirect']); }); //setup absolute routes if (!empty($application['routes_config']['absolute_routes'])) { foreach ($application['routes_config']['absolute_routes'] as $route) { if (empty($route['namespaced_class'])) { throw new \Exception('No namespaced class configured for route ' . $route['route']); } $namespacedClass = $route['namespaced_class']; $method = !empty($route['method']) ? $route['method'] : 'get'; $controllerAction = $namespacedClass . '::' . $route['action'] . 'Action'; $routeObject = $application->match($route['route'], $controllerAction)->method(strtoupper($method))->bind($route['name']); RouteHelper::parametrize($routeObject, $route['parameters']); } } //load all configured services providers if (is_array($application['app_config']['service_providers']) && !empty($application['app_config']['service_providers'])) { foreach ($application['app_config']['service_providers'] as $serviceName => $serviceConfiguration) { //build the parameter list $parameters = array(); if (!empty($serviceConfiguration['parameters']) && is_array($serviceConfiguration['parameters'])) { foreach ($serviceConfiguration['parameters'] as $key => $value) { $parameters[$serviceName . '.' . $key] = ($key == 'path' || strpos($key, '_path') !== false) && substr($value, 0, 1) != '/' ? self::$applicationRootDirectory . '/' . $value : $value; } } if (!empty($serviceConfiguration['options']) && is_array($serviceConfiguration['options'])) { $parameters[$serviceName . '.options'] = $serviceConfiguration['options']; } //include the service provider file for provider not included in silex itself if (!empty($serviceConfiguration['file_path'])) { require_once self::$applicationRootDirectory . '/' . $serviceConfiguration['file_path']; } //register the service provider $serviceClassName = $serviceConfiguration['class_name']; $application->register(new $serviceClassName(), $parameters); } } //mount all configured controllers if (is_array($application['routes_config']) && !empty($application['routes_config'])) { foreach ($application['routes_config'] as $key => $controllerConfiguration) { //only process configuration ending in Controller if (substr($key, -10) == 'Controller') { $class = $controllerConfiguration['namespaced_class']; $application->mount('/' . $controllerConfiguration['base_route'], new $class()); } } } //setup all the logging if (is_array($application['app_config']['loggers']) && !empty($application['app_config']['loggers'])) { foreach ($application['app_config']['loggers'] as $name => $settings) { $application[$name] = $application->share(function () use($name, $settings, $applicationRootDirectory) { //determine the logging level $level = !empty($settings['level']) ? 'Monolog\\Logger::' . strtoupper($settings['level']) : 'Monolog\\Logger::CRITICAL'; $level = constant($level); $logger = new Logger($name); $logger->pushHandler(new StreamHandler($applicationRootDirectory . '/' . $settings['file_path'], $level)); return $logger; }); } } $application->before(function ($event) use($application) { //make sure that the controller in a class $controller = $event->attributes->get('_controller'); $application['requested_controller'] = null; $application['requested_action'] = null; //var_dump($event); if (is_string($controller) && strpos($controller, '::') !== false) { //set the requested controller and action $controllerParts = explode('::', $controller); $application['requested_controller'] = substr(ClassHelper::getNonNamespacedClass($controllerParts[0]), 0, -10); $application['requested_action'] = substr($controllerParts[1], 0, -6); } }, Application::LATE_EVENT); //make sure the session is saved $application->after(function ($event) use($application) { $application['session']->save(); }, Application::LATE_EVENT - 100); self::$application = $application; //apply bootstrap objects if (!empty($application['app_config']['bootstrap'])) { foreach ($application['app_config']['bootstrap'] as $bootstrap) { $this->applyBootstrap(new $bootstrap['class_name']()); } } }