5

我知道 Silex 方法的基础是将所有应用程序逻辑放在一个文件中。但是我的应用程序可能有超过 20 个控制器。所以我想要一个方便的地图来管理路由器。

我的问题是寻找能够将路由器制作成单独文件的解决方案。在最好的情况下,文件必须是 YAML 类型:

# config/routing.yml

_home:
    pattern: /
    defaults: { _controller: MyProject\Controller\MyController::index }

但是原生也是一个很好的案例(对我来说):

$routes = new RouteCollection();

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

return $routes;

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

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

小记

我没有为我的 Controller 类使用ControllerProviderInterface。这是一个独立的类。

4

4 回答 4

10

首先,Silex 的基础不是你把所有东西都放在一个文件里。Silex 的基础是您创建自己的“框架”,即您自己组织应用程序的方式。

“如果您对自己做出所有架构决策感到满意,请使用 silex,如果不是,请使用全栈 Symfony2。” ——达斯汀·惠特尔

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


如何解决您的问题

您基本上想要的是解析一个 Yaml 文件并从每个解析的路由中获取pattern和设置。defaults._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();
于 2013-02-03T20:25:30.420 回答
5

我想我会在这里添加我的方法,尽管其他方法可能有效,但实际上并没有一个简单的解决方案。添加FileLocator/YamlFileLoader添加我不希望在我的应用程序中读取/解析 yaml 文件的大量负载。

作曲家

首先,您需要包含相关文件。symfony YAML 组件,以及一个非常简单和有用的配置服务提供者,由积极从事 Silex 工作的人提供。

"require": {
    "symfony/yaml": "~2.3",
    "igorw/config-service-provider": "1.2.*"
}

文件

假设您的路线文件如下所示(routes.yml):

config.routes:
  dashboard:
    pattern:  /
    defaults: { _controller: 'IndexController::indexAction' }
    method:   GET

登记

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

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

路线

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

$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');    
}

->bind()例如,允许您“命名”要在 twig 中使用的 url。
->method()允许您指定 POST | 得到。您会注意到,如果路由未指定方法,我将其默认为带有三元组的“GET”。

于 2013-08-05T22:01:58.053 回答
0

好的,我就是这样解决的。

此方法是我的应用程序的一部分,在run()之前调用:

# /src/Application.php

...

protected function _initRoutes()
{
    $locator = new FileLocator(__DIR__.'/config');
    $loader = new YamlFileLoader($locator);

    $this['routes'] = $loader->load('routes.yml');
}

应用程序类是我自己的,它扩展了 Silex\Application。

配置文件:

# /src/config/routes.yml
home:
    pattern: /
    defaults: { _controller: '\MyDemoSite\Controllers\DefaultController::indexAction' }

这对我来说可以!

更新

我认为这是添加收藏的正确选择:

$this['routes']->addCollection($loader->load('routes.yml'));

更灵活。

于 2013-02-05T20:34:48.283 回答
0

您可以扩展routes服务(即 a ),并使用andRouteCollection加载 YAML 文件:FileLocatorYamlFileLoader

use Symfony\Component\Config\FileLocator;
use Symfony\Component\Routing\Loader\YamlFileLoader;

$app->extend('routes', function($routeCollection) {

    $locator    = new FileLocator([__DIR__ . '/../config']);
    $loader     = new YamlFileLoader($locator);
    $collection = $loader->load('routes.yml');

    $routeCollection->addCollection($collection);

    return $routeCollection;

});

不过,您将需要symfony/configsymfony/yaml依赖项。

于 2017-11-08T01:32:50.197 回答