Пример #1
0
 /**
  * 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;
 }
Пример #2
0
 /**
  * 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']());
         }
     }
 }