我知道,基于Silex的方法,所有的应用程序逻辑都在一个文件中。但是我的应用程序可能有二十多个控制器。所以我想要一个方便的地图来管理路由器。
我的问题是寻找解决方案,在其中我将能够使一个路由器到一个单独的文件。在最好的情况下,文件必须是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或Symfony2的组件。
小票
我不为我的Controller类使用ControllerProviderInterface。这是一个独立的课程。
发布于 2013-02-03 20:25:30
首先,Silex的基础不是把所有的东西都放在一个文件中。Silex的基础是创建您自己的“框架”,这是您自己组织应用程序的方式。
“如果您对自己的体系结构决策感到满意,可以使用silex,如果不是,则使用完整的堆栈Symfony2。”--达斯汀·威特尔。
在由Silex的创建者创建的这个博客中阅读更多有关这方面的信息。
如何解决你的问题
基本上,您需要的是解析Yaml文件,并从解析的每个路由获取pattern和defaults._controller设置。
要解析Yaml文件,可以使用Yaml组件 of Symfony2。您将得到一个数组返回,您可以使用该数组将路由添加到Silex:
// parse the yaml file
$routes = ...;
$app = new Silex\Application();
foreach ($routes as $route) {
$app->match($route['pattern'], $route['defaults']['_controller']);
}
// ...
$app->run();发布于 2013-08-05 22:01:58
我想在这里添加我的方法,因为尽管其他方法可以工作,但实际上并没有一个简单的解决方案。添加FileLocator / YamlFileLoader会增加我不想在应用程序中读取/解析yaml文件的大量批量。
Composer
首先,您需要包括相关的文件。symfony YAML组件,以及积极从事Silex工作的人提供的一个非常简单和有用的积极从事Silex工作的人。
"require": {
"symfony/yaml": "~2.3",
"igorw/config-service-provider": "1.2.*"
}文件
假设您的路由文件如下(routes.yml)所示:
config.routes:
dashboard:
pattern: /
defaults: { _controller: 'IndexController::indexAction' }
method: GETRegistration
分别注册每个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()允许您“命名”您的urls,以便在小枝中使用。
->method()允许您指定POST \ GET。您将注意到,如果路由没有指定方法,则默认为“GET”。
发布于 2013-02-05 20:34:48
好吧,我就是这样解决的。
此方法是我的应用程序的一部分,在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' }对我来说很好!
UPD
我认为这是添加集合的正确选择:
$this['routes']->addCollection($loader->load('routes.yml'));更灵活。
https://stackoverflow.com/questions/14676257
复制相似问题