Symfony2:使用对象设置路由参数 [英] Symfony2: use object to set route parameters

查看:26
本文介绍了Symfony2:使用对象设置路由参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个带有 2 个参数的路由:

BBBundle_blog_show:模式:/{id}/{slug}默认值:{ _controller: BloggerBlogBu​​ndle:Blog:show }要求:_方法:获取编号:\d+

两个参数都是对象博客的属性.

我想设置一个自定义映射器(路由生成器),以便我可以这样写:

 {{ path('BBBundle_blog_show', {'blog': blog}) }}

而不是这个:

 {{ path('BBBundle_blog_show', {'id':blog.id, 'slug':blog.slug) }}

解决方案

这就是我最终想到的:

我由自己的生成器基类实现,该类查找对象"参数并尝试从该对象获取所需参数.

<块引用>

//src/Blogger/BlogBu​​ndle/Resources/config/services.yml参数:router.options.generator_base_class: Blogger\BlogBu​​ndle\Routing\Generator\UrlGenerator

//src/Blogger/BlogBu​​ndle/Routing/Generator/UrlGenerator.php命名空间 Blogger\BlogBu​​ndle\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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆