Symfony2: используйте объект для установки параметров маршрута - PullRequest
9 голосов
/ 16 января 2012

У меня есть маршрут с 2 параметрами:

BBBundle_blog_show:
    pattern:  /{id}/{slug}
    defaults: { _controller: BloggerBlogBundle:Blog:show }
    requirements:
        _method: GET
        id: \d+

Оба параметра являются свойствами объекта blog .

Я хотел бы настроить собственный картограф (генератор маршрутов), чтобы я мог написать это:

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

вместо этого:

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

Ответы [ 2 ]

7 голосов
/ 26 января 2012

Это то, что я в конце концов придумал:

Я реализовал собственный базовый класс генератора, который ищет параметр '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;
    }

}

Теперь я могу написать: {{path ('BBBundle_blog_show', {'object': blog})}} и он получит необходимые параметры (id, slug) из объекта.

0 голосов
/ 20 августа 2015

Некоторое время назад я решил, что меня раздражает неспособность передавать объекты в качестве параметров маршрута. Я должен был заниматься знанием маршрутов и точных значений параметров в шаблонах и других вещей, генерирующих эти маршруты.

Я собрал этот пакет для Symfony, который позволяет вам использовать и расширять эту способность (Symfony 2.7 и выше). Пожалуйста, посмотрите: https://github.com/iltar/http-bundle. Он также доступен на Packagist как iltar / http-bundle.

Лучшее в этом пакете то, что вам не нужно использовать другой объект или генератор маршрутизатора. Он просто включает пакет, настраивая конфигурацию в соответствии с вашими потребностями, если настройки по умолчанию не работают в соответствии с вашими предпочтениями, и вы готовы к работе. В файле readme должно быть объяснено все, что вам нужно знать, но вот фрагмент:

Старый стиль:

/**
 * @Route("/profile/{user}/", name="app.view-profile")
 */
public function viewProfileAction(AppUser $user);

// php
$router->generate('app.view-profile', ['user' => $user->getId()]);

// twig
{{ path('app.view-profile', { 'user': user.id }) }}
{{ path('app.view-profile', { 'user': user.getid }) }}
{{ path('app.view-profile', { 'user': user.getId() }) }}
{{ path('app.view-profile', { 'user': user[id] }) }}

Новый стиль:

// php
$router->generate('app.view-profile', ['user' => $user]);

// twig
{{ path('app.view-profile', { 'user' : user }) }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...