2014-12-16 2 views
0

Создание приложения с помощью Silex с использованием шаблона MVC. У меня немного проблема в отношении того, что я должен делать после того, как у меня есть коллекция маршрутов.Silex Маршрутизация для контроллеров

Вот мои самозагрузки для приложения:

<?php 
namespace App; 

use Igorw\Silex\ConfigServiceProvider; 
use Silex\Application as Silex; 
use Symfony\Component\Routing\Route; 
use Symfony\Component\Routing\RouteCollection; 


class Bootstrap extends Silex 
{ 
    public function __construct() 
    { 
     $this['debug'] = true; 

     $this->registerDefaultParameters(); 
     $this->registerDefaultServices(); 
     $this->registerRoutes(); 

    } 

    protected function registerDefaultParameters() 
    { 
     $paths = isset($this['base_path']) ? $this['base_path'] : array(); 

     if (!isset($paths['base'])) { 
      $paths['base'] = realpath(__DIR__ . '/../'); 
     } 

     $defaults = array(
      'config' => $paths['base'] . '/App/Config', 
      'twig.path' => $paths['base'] . '/public/themes/base/templates' 
     ); 

     foreach ($defaults as $key => $value) { 
      if (!isset($paths[$key])) { 
       $paths[$key] = $value; 
      } 
     } 

     $this['paths'] = $paths; 
    } 

    protected function registerDefaultServices() 
    { 
     $this->register(new ConfigServiceProvider($this['paths']['config'] . "/Services.yml")); 

     foreach($this['services'] as $serviceName => $serviceData) 
     { 
      $this->register(new $serviceData['class'],(array_key_exists('parameters',$serviceData)) ? $serviceData['parameters'] : array()); 
     } 

    } 

    protected function registerRoutes() 
    { 
     $this->register(new ConfigServiceProvider($this['paths']['config'] . "/Routes.yml")); 

     $collection = new RouteCollection(); 
     foreach($this['routes'] as $key => $value) 
     { 
      $collection->add($key, new Route(
       $value['path'], 
       $value['defaults'], 
       array(), 
       array(), 
       null, 
       null, 
       $value['methods'] 
      )); 
     } 

     $this['routes'] = $collection; 
    } 
} 

Так как вы можете видеть, я настроить некоторый Params по умолчанию. Я также загружаю мои службы из файла YAML, который отлично работает. Затем я регистрирую маршруты снова из файла YAML. Я перебираю каждый маршрут в файле YAML и добавляю маршрут в RouteCollection, а затем повторно сохраняю его в приложении ['routes'].

Таким образом, я получаю $ this ['routes'], являющийся экземпляром 'RouteCollection' со всеми моими маршрутами в качестве экземпляров Route.

Теперь я хочу настроить все мои контроллеры для маршрутов. Моя проблема в том, что я хочу настроить продукт как можно более модульный. Поэтому вместо того, чтобы иметь папку с папками контроллеров и моделей, содержащую все контроллеры и все модели, я хочу иметь папку Core со всеми основными модулями в ней, например. базовый модуль, модуль страницы и контактный модуль. Каждый модуль имеет свои собственные представления моделей контроллеров и т. Д. Очень похоже на то, как ядро ​​Magento.

Так что мой вопрос:

Теперь я мои маршруты установить, какие шаги мне нужно предпринять для того, чтобы сделать мои маршруты инстанцируют правильный контроллер и действие?

Мне нужно, чтобы это было динамичным, поэтому не было бы объявлено о каждом отдельном контроллере.

Любая помощь будет очень признательна.

ответ

0

я изменил свою функцию маршрутизации, чтобы выглядеть следующим образом:

protected function registerRoutes() 
{ 
    $this->register(new ConfigServiceProvider($this['paths']['config'] . "/Routes.yml")); 

    $routes = $this['config.routes']; // See the first key in the yaml file for this name 
    foreach ($routes as $name => $route) 
    { 
     $this->match($route['pattern'], $route['defaults']['_controller'])->bind($name)->method(isset($route['method'])?$route['method']:'GET'); 
    } 
} 

Everytime приложение работает он пытается соответствовать одному Fo загруженных маршрутов и автоматически передает его на контроллер!

Смежные вопросы