首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Silex的自定义路由配置

使用Silex的自定义路由配置
EN

Stack Overflow用户
提问于 2013-02-03 19:19:00
回答 4查看 6.5K关注 0票数 5

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

我的问题是寻找解决方案,在其中我将能够使一个路由器到一个单独的文件。在最好的情况下,文件必须是YAML类型:

代码语言:javascript
复制
# config/routing.yml

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

但土生土长也是个好例子(对我来说):

代码语言:javascript
复制
$routes = new RouteCollection();

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

return $routes;

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

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

小票

我不为我的Controller类使用ControllerProviderInterface。这是一个独立的课程。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-02-03 20:25:30

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

“如果您对自己的体系结构决策感到满意,可以使用silex,如果不是,则使用完整的堆栈Symfony2。”--达斯汀·威特尔。

在由Silex的创建者创建的这个博客中阅读更多有关这方面的信息。

如何解决你的问题

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

要解析Yaml文件,可以使用Yaml组件 of Symfony2。您将得到一个数组返回,您可以使用该数组将路由添加到Silex:

代码语言:javascript
复制
// parse the yaml file
$routes = ...;
$app = new Silex\Application();

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

// ...
$app->run();
票数 10
EN

Stack Overflow用户

发布于 2013-08-05 22:01:58

我想在这里添加我的方法,因为尽管其他方法可以工作,但实际上并没有一个简单的解决方案。添加FileLocator / YamlFileLoader会增加我不想在应用程序中读取/解析yaml文件的大量批量。

Composer

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

代码语言:javascript
复制
"require": {
    "symfony/yaml": "~2.3",
    "igorw/config-service-provider": "1.2.*"
}

文件

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

代码语言:javascript
复制
config.routes:
  dashboard:
    pattern:  /
    defaults: { _controller: 'IndexController::indexAction' }
    method:   GET

Registration

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

代码语言:javascript
复制
$this->register(new ConfigServiceProvider(__DIR__."/../config/services.yml"));
$this->register(new ConfigServiceProvider(__DIR__."/../config/routes.yml"));
// any more yaml files you like

路由

您可以使用以下方法获得这些路由:

代码语言:javascript
复制
$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()允许您“命名”您的urls,以便在小枝中使用。

->method()允许您指定POST \ GET。您将注意到,如果路由没有指定方法,则默认为“GET”。

票数 5
EN

Stack Overflow用户

发布于 2013-02-05 20:34:48

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

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

代码语言:javascript
复制
# /src/Application.php

...

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

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

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

配置文件:

代码语言:javascript
复制
# /src/config/routes.yml
home:
    pattern: /
    defaults: { _controller: '\MyDemoSite\Controllers\DefaultController::indexAction' }

对我来说很好!

UPD

我认为这是添加集合的正确选择:

代码语言:javascript
复制
$this['routes']->addCollection($loader->load('routes.yml'));

更灵活。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14676257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档