Symfony2:使用对象设置路由参数 [英] Symfony2: use object to set route parameters
本文介绍了Symfony2:使用对象设置路由参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个带有 2 个参数的路由:
BBBundle_blog_show:模式:/{id}/{slug}默认值:{ _controller: BloggerBlogBundle:Blog:show }要求:_方法:获取编号:\d+
两个参数都是对象博客的属性.
我想设置一个自定义映射器(路由生成器),以便我可以这样写:
{{ path('BBBundle_blog_show', {'blog': blog}) }}
而不是这个:
{{ path('BBBundle_blog_show', {'id':blog.id, 'slug':blog.slug) }}
解决方案
这就是我最终想到的:
我由自己的生成器基类实现,该类查找对象"参数并尝试从该对象获取所需参数.
<块引用>//src/Blogger/BlogBundle/Resources/config/services.yml参数:router.options.generator_base_class: Blogger\BlogBundle\Routing\Generator\UrlGenerator
//src/Blogger/BlogBundle/Routing/Generator/UrlGenerator.php命名空间 Blogger\BlogBundle\Routing\Generator;使用 Symfony\Component\Routing\Generator\UrlGenerator 作为 BaseUrlGenerator;使用 Doctrine\Common\Util\Inflector;/*** UrlGenerator 基于一组路由生成 URL.** @api*/UrlGenerator 类扩展 BaseUrlGenerator{受保护的函数 doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $absolute){if (isset($parameters['object']) && is_object($parameters['object'])) {$object = $parameters['object'];$parameters = array_replace($this->context->getParameters(), $parameters);$tparams = array_replace($defaults, $parameters);$requiredParameters = array_diff_key(array_flip($variables), $tparams);$parameters = $this->getParametersFromObject(array_flip($requiredParameters), $object);}return parent::doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $absolute);}受保护的函数 getParametersFromObject($keys, $object){$parameters = array();foreach ($keys 作为 $key) {$method = 'get' .Inflector::classify($key);如果 (method_exists($object, $method)) {$parameters[$key] = $object->$method();}}返回 $ 参数;}}
现在我可以写:{{ path('BBBundle_blog_show', {'object': blog}) }} 它将从对象中获取所需的参数(id,slug).
I have a route with 2 parameters:
BBBundle_blog_show:
pattern: /{id}/{slug}
defaults: { _controller: BloggerBlogBundle:Blog:show }
requirements:
_method: GET
id: \d+
Both params are properties of an object blog.
I would like to set up a custom mapper (route generator), so that I can write this:
{{ path('BBBundle_blog_show', {'blog': blog}) }}
instead of this:
{{ path('BBBundle_blog_show', {'id':blog.id, 'slug':blog.slug) }}
解决方案
This is what I came up with eventually:
I implemented by own generator base class that looks for 'object' parameter and tries to get required parameters from that object.
//src/Blogger/BlogBundle/Resources/config/services.yml parameters: router.options.generator_base_class: Blogger\BlogBundle\Routing\Generator\UrlGenerator
//src/Blogger/BlogBundle/Routing/Generator/UrlGenerator.php
namespace Blogger\BlogBundle\Routing\Generator;
use Symfony\Component\Routing\Generator\UrlGenerator as BaseUrlGenerator;
use Doctrine\Common\Util\Inflector;
/**
* UrlGenerator generates URL based on a set of routes.
*
* @api
*/
class UrlGenerator extends BaseUrlGenerator
{
protected function doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $absolute)
{
if (isset($parameters['object']) && is_object($parameters['object'])) {
$object = $parameters['object'];
$parameters = array_replace($this->context->getParameters(), $parameters);
$tparams = array_replace($defaults, $parameters);
$requiredParameters = array_diff_key(array_flip($variables), $tparams);
$parameters = $this->getParametersFromObject(array_flip($requiredParameters), $object);
}
return parent::doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $absolute);
}
protected function getParametersFromObject($keys, $object)
{
$parameters = array();
foreach ($keys as $key) {
$method = 'get' . Inflector::classify($key);
if (method_exists($object, $method)) {
$parameters[$key] = $object->$method();
}
}
return $parameters;
}
}
Now I can write: {{ path('BBBundle_blog_show', {'object': blog}) }} and it will get required parameters (id, slug) from object.
这篇关于Symfony2:使用对象设置路由参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文