使用Silex自定义路由配置

Yur*_*ury 5 routing yaml symfony silex

我知道Silex方法的基础,其中所有应用程序逻辑都在一个文件中.但我的应用程序可能有20多个控制器.所以我想有一个方便的地图来管理路由器.

我的问题是搜索我能​​够将路由器设置为单独文件的解决方案.在最好的情况下,该文件必须是YAML类型:

# config/routing.yml

_home:
    pattern: /
    defaults: { _controller: MyProject\Controller\MyController::index }
Run Code Online (Sandbox Code Playgroud)

但本地人也是一个很好的案例(对我来说):

$routes = new RouteCollection();

$routes->add(
    'home',
    new Route('/', array('controller' => 'MyProject\Controller\MyController::index')
));

return $routes;
Run Code Online (Sandbox Code Playgroud)

第二种情况的问题是我必须为每个路由规则使用match()函数.一点也不清楚.

有什么方法可以解决这个问题?条件是我想使用现有的API Silex或Symfony2的组件.

小记:

我不使用ControllerProviderInterface我的控制器类.这是一个独立的课程.

Wou*_*r J 10

首先,Silex的基础并不是你把所有东西放在一个文件中.Silex的基础是您创建自己的"框架",您自己组织应用程序的方式.

"如果你习惯于制定所有自己的架构决策,那么就使用silex,如果没有,则使用完整的堆栈Symfony2." - 达斯汀惠特尔

这篇由Silex的创建者创建的博文中了解更多相关信息.


如何解决你的问题

您基本上想要的是解析Yaml文件并从每个解析的路由中获取patterndefaults._controller设置.

要解析Yaml文件,可以使用Symfony2 的Yaml组件.你得到一个数组,你可以使用它来添加到Silex的路由:

// parse the yaml file
$routes = ...;
$app = new Silex\Application();

foreach ($routes as $route) {
    $app->match($route['pattern'], $route['defaults']['_controller']);
}

// ...
$app->run();
Run Code Online (Sandbox Code Playgroud)


Jim*_*mbo 5

我以为我会在这里添加我的方法,虽然其他人可能会工作,但实际上并没有一个简单的解决方案.在我的应用程序中添加FileLocator/ YamlFileLoader添加一些我不想要的批量读取/解析yaml文件.

作曲家

首先,您需要包含相关文件.symfony的YAML组件,以及一个非常简单而有用的配置服务提供商通过别人谁积极致力于在Silex的.

"require": {
    "symfony/yaml": "~2.3",
    "igorw/config-service-provider": "1.2.*"
}
Run Code Online (Sandbox Code Playgroud)

文件

假设你的路径文件看起来像这样(routes.yml):

config.routes:
  dashboard:
    pattern:  /
    defaults: { _controller: 'IndexController::indexAction' }
    method:   GET
Run Code Online (Sandbox Code Playgroud)

注册

单独注册每个yaml文件.文件中的第一个键是它在$app变量下可用的名称(由疙瘩服务定位器处理).

$this->register(new ConfigServiceProvider(__DIR__."/../config/services.yml"));
$this->register(new ConfigServiceProvider(__DIR__."/../config/routes.yml"));
// any more yaml files you like
Run Code Online (Sandbox Code Playgroud)

路线

您可以使用以下方法获取这些路线:

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

->bind()例如,允许您"命名"您的网址,以便在树枝内使用.
->method()允许您指定POST | 得到.你会注意到,如果路线没有指定方法,我会在那里使用三元组将其默认为'GET'.