axis / axis-curly-routing-plugin
此插件向symfony 1.x引入了一个新的路由类,其模式使用大括号,就像Symfony2的路由一样。
Requires
- php: >=5.3.0
- composer/installers: *
- symfony/routing: 2.2.*
Suggests
- propel/sf-propel-o-r-m-plugin: Allows you to use CurlyObjectRoute - route that automatically fetches object from DB corresponding to request parameters
This package is not auto-updated.
Last update: 2020-04-03 16:02:15 UTC
README
此插件向symfony 1.x引入了一个新的路由类,其模式使用大括号,就像Symfony2的路由一样。
安装
使用Composer。只需将此依赖项添加到您的composer.json
"require": { "axis/axis-curly-routing-plugin": "dev-master" }
使用方法
现在您可以使用大括号路由。只需在您的routing.yml
文件中声明具有指定CurlyRoute
类的路由即可
curly_route: url: /hello/{name} param: { module: test, action: sayHello } class: CurlyRoute
这就完了。您可以使用与任何symfony路由相同的引用方式引用此路由。
用于生成URL
<?php echo url_for('curly_route', array('name' => 'world')) ?>
用于路由请求到控制器
class testActions extends sfActions
{
public function executeSayHello($request)
{
return $this->renderText('Hello, ' . $request['name']);
}
}
糖
是的。您可以使用这些路由做一些酷的事情。
分层URL
实现此路由的主要原因是能够在路由中使用路径变量。例如,您想在URL中使用类似分层结构的东西
您可以使用默认的symfony路由做这件事
asset: url: /:path/:filename.:sf_format param: { ... } requirements: path: .*
这可以将请求从/my/assets/path/image.png
路由到定义的控制器。但是当您需要为该路径生成URL时,您将得到这个: /my%2Fassets%2Fpath/image.png
。
大括号路由使您能够用于这类任务。
asset: url: /{path}/{filename}.{sf_format} param: { ... } class: CurlyRoute requirements: path: .* sf_format: \w+
任何符号分隔的变量
blog_post: # you cannot use path like '/blog/:slug-:id.html' using default symfony routes url: /blog/{slug}-{id}.html param: { ... } class: CurlyRoute requirements: slug: .+ id: \d+
Propel Object路由升级版
您可以使用CurlyObjectRoute
处理propel对象请求,就像您使用sfPropelRoute
一样。
blog_post: url: /blog/{slug}-{id}.html param: { ... } class: CurlyObjectRoute options: model: BlogPost query_methods: [ filterPublished ] # Note: there is no 'type' option because CurlyObjectRoute # doesn't support collection routes for now. requirements: slug: .+ id: \d+
您可以使用它就像使用sfPropelRoute
一样。用于生成URL
<?php echo url_for('blog_post', $post) ?> or <?php echo url_for('blog_post', array('id' => $post->getId(), 'slug' => $post->getSlug())) ?>
并从控制器检索对象
class blogActions extends sfActions { public function executeShowPost($request) { $post = $this->getRoute()->getObject(); } }
命名空间
有时您需要在URL中使用对象属性加上其他变量。现在您可以使用CurlyObjectRoute
处理此类问题,只需定义命名空间即可
blog_post: url: /{username}blog/{post.slug}-{post.id}.html param: { ... } class: CurlyObjectRoute options: model: BlogPost query_methods: [ filterPublished ] namespace: post # Note this option requirements: username: \w+ post.slug: .+ post.id: \d+
使用方法。用于生成URL
<?php echo url_for('blog_post', array('post' => $post, 'username' => 'anonymous')) ?> or <?php echo url_for('blog_post', array( 'post.id' => $post->getId(), 'post.slug' => $post->getSlug(), 'username' => 'anonymous' )) ?> or <?php echo url_for('blog_post', array( 'post' => array( 'id' => $post->getId(), 'slug' => $post->getSlug() ), 'username' => 'anonymous' )) ?>
并从控制器检索对象
class blogActions extends sfActions { public function executeShowPost($request) { $post = $this->getRoute()->getObject('post'); } }
每个路由多个对象
您还可以在路由中使用多个对象。
show_product: url: /shop/{category.path}/{product.slug}-{product.id}.html param: { ... } class: CurlyObjectRoute options: transform: product: model: Product query_methods: [ filterPublished, filterInStock ] # or you can use short syntax if there is only model option for a namespace category: Category requirements: slug: .+ id: \d+
使用方法。用于生成URL
<?php echo url_for('show_product', array('category' => $category, 'product' => $product)) ?>
并从控制器检索对象
class shopActions extends sfActions { public function executeShowProduct($request) { /** @var $category Category */ $category = $this->getRoute()->getObject('category'); /** @var $product Product */ $product = $this->getRoute()->getObject('product'); } }
注意:要使用CurlyObjectRoute
,您应通过安装PropelORMPlugin将您的项目升级到使用Propel 1.6。
扩展大括号路由
您可以使用任何自定义参数转换器与CurlyRoute
一起使用。使用transform
选项定义它们。
weird_route: url: /say/{weird_word} class: CurlyRoute options: transform: weird_transformer: class: myProjectWeirdRouteVarTransformer # ... any other options # or short syntax # transform: myProjectWeirdRouteVarTransformer
要在您的项目中实现自定义参数转换器,创建一个实现\Axis\S1\CurlyRouting\Transformer\DataTransformerInterface
的类。
class myProjectWeirdRouteVarTransformer implements \Axis\S1\CurlyRouting\Transformer\DataTransformerInterface { public function transformForUrl($params, $variables, $options = array()) { $params['weird_word'] = 'foo'.$params['word'].'bar' unset($params['word']); return $params; } public function transformForController($params, $variables, $options = array()) { $weird = $params['weird_word']; if (substr($weird, 0, 3) == 'foo') $weird = substr($weird, 3); if (substr($weird, -3) == 'bar') $weird = substr($weird, 0, -3); unset($params['weird_word']); $params['word'] = $weird; return $params; } }
此转换器接收一组参数作为输入,并返回一个由路由使用的参数结果的数组。
当您生成URL时,将使用transformForUrl
方法的输出结果。
This code: <?php echo url_for('weird_route', array('word' => 'hello')) ?> will output: /say/foohellobar
另一方面,通过导航到该URL(/say/foohellobar
),路由将获取值为foohellobar
的weird_word
变量。然后它将通过您所有路由定义的数据转换器,您将在请求和控制器中获得转换后的变量。
class weirdActions extends sfActions { public function executeSay($request) { $this->renderText($request['word']); // this will output 'hello' } }
您可以在不需要实现自定义路由的情况下使用自定义转换器来执行许多酷炫的操作。顺便说一句,CurlyObjectRoute
使用转换器来处理对象请求。查看该类以获取有关参数转换器的更多信息。您可以串联它们并重用已实现的代码。
听起来很棒,不是吗?