Хобрук: Ваш путь к мастерству в программировании

Как определить значения даты по умолчанию в маршрутах Symfony2?

Если я хочу создать маршрут, где год, месяц и дата являются переменными, как я могу определить, что если эти переменные пусты, будет взята текущая дата?

Например. вот так (не работает точно...)

blog:
    path:      /blog/{year}/{month}/{day}
    defaults:  { _controller: AcmeBlogBundle:Blog:index,
                    year:  current_year,
                    month: current_month
                    day:   current_day
               }

Я думал об определении двух разных маршрутов, например

blog_current_day:
    path:      /blog
    defaults:  { _controller: AcmeBlogBundle:Blog:index }

blog:
    path:      /blog/{year}/{month}/{day}
    defaults:  { _controller: AcmeBlogBundle:Blog:index }

Но если я затем вызову blog_current_day мой контроллер

public function indexAction(Request $request, $year, $month, $day) {
    // ...
}

выдаст исключение, потому что год, месяц и день отсутствуют.

Какие-либо предложения?

13.09.2013

  • надеюсь, что мой ответ содержит то, что вы искали :) кстати, хороший блог - привет из Кельна. 13.09.2013

Ответы:


1

Параметры динамического контейнера

Вы можете динамически установить параметры контейнера в расширении вашего пакета, расположенном Acme\BlogBundle\DependencyInjection\AcmeBlogExtension после этого, вы можете используйте эти параметры в своих маршрутах, например %parameter%.

Расширение

namespace Acme\BlogBundle\DependencyInjection;

use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class AcmeBlogExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        $container->setParameter(
            'current_year',
            date("Y")
        );

        $container->setParameter(
            'current_month',
            date("m")
        );

        $container->setParameter(
            'current_day',
            date("d")
        );
    }
}

Конфигурация маршрутизации

blog:
    path:      /blog/{year}/{month}/{day}
    defaults:  { _controller: AcmeBlogBundle:Blog:index, year: %current_year%, month: %current_month%, day: %current_day% }

Статические параметры

Если вам нужны только настраиваемые статические параметры, вы можете просто добавить их в файл config.yml.

parameters:
    static_parameter: "whatever"

... затем снова получите к ним доступ в маршрутизации, например %static_parameter%.

13.09.2013
  • Вау, это путь ниндзя! Этот ответ на самом деле более точно отвечает на мой вопрос. Но мне просто нужен был один способ, так как вариант @Igor кажется проще, думаю, я выберу его. 13.09.2013
  • Возврат: Я возьму этот! :-) 13.09.2013
  • Класс должен иметь расширение VendorNameWithoutBundle, находящееся в папке DependencyInjection для автоматической загрузки. 13.09.2013
  • Есть ли определенная номенклатура, которой я должен следовать при присвоении имени своему расширению? Или нужно где-то регистрировать? Потому что прямо сейчас я получаю You have requested a non-existent parameter "current_year". 13.09.2013
  • ты очистил кеш? Прочтите главу документации Создание расширения - особенно Соглашения о расширениях объясняет, как регистрировать расширения и соглашения об именах для автозагрузки. Я протестировал приведенный выше пример, используя symfony 2.1, 2.2 и 2.3, прежде чем опубликовать его. быстрый и грязный: вы можете добавить простой die('extension loaded!') в метод расширения load(..), чтобы проверить, загружается ли он. 13.09.2013
  • @nfir, любопытное поведение: сегодня я снова позвонил по этому маршруту и ​​получил неправильное значение дня (date('d') выдал 16 вместо 17). Что здесь не так и как я могу гарантировать, что всегда принимается правильное значение? 17.09.2013
  • причиной этого должна быть настройка часового пояса/времени сервера. дважды проверьте, есть ли какие-либо различия между выводом date() и текущим временем, которое вы ожидаете :) 17.09.2013
  • Это невозможно; было около 11 утра, когда я обнаружил эту ошибку. Плюс: когда я отредактировал этот файл (я сделал там die() для отладки) и снова сохранил его, ошибка исчезла. 17.09.2013
  • Примечание. Это была ошибка не на час, а на день! 17.09.2013
  • цитируя мудрого человека: Кэш, кеш, старый добрый кеш... есть две возможности: date() возвращает неправильную временную метку, а вторая - кеш маршрутизации, содержащий устаревшую версию конфигурации маршрутизации. Во втором случае вы можете подумать о том, чтобы cronjob очистил/повторно прогрел ваш (маршрутизирующий) кеш в полночь. 17.09.2013
  • О, черт... но разве это не означает, что кеш очищается каждый день? 17.09.2013
  • вы можете создать команду, которая обновляет только этот один кешированный маршрут. или, возможно, рассмотрите возможность использования прослушивателя событий ядра, который заново регистрирует маршрут при каждом запросе, если вы можете позволить себе влияние на производительность. 17.09.2013
  • Спасибо за этот совет. Я создал новый вопрос в качестве ответа (stackoverflow.com/questions/18866969/) к вашему последнему комментарию, чтобы не комментировать, залейте свой ответ здесь :-) 18.09.2013
  • Важно отметить, что Extension::load вызывается только во время Kernel::buildContainer, обычно вызываемого с cache:warmup. Это приведет к статическим значениям даты в момент сборки контейнера Symfony в var/cache/ или до тех пор, пока контейнер не будет перестроен. 17.12.2019

  • 2

    Вы можете установить $year = null, $month = null, $day = null в контроллере.

    или, может быть, в пути:

    year:  null,
    month: null,
    day:   null,
    

    Затем в контроллере вы должны получить последние сообщения, если переменные = null, или сообщения по дате.

    13.09.2013
  • он ищет маршрут по умолчанию Игорь в этом случае - пожалуйста, смотрите мой ответ :) 13.09.2013
  • Новые материалы

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

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

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..

    React Hooks: основы деструктуризации массива
    Kent C. Dodds написал классный пост о том, как грядущая функция React под названием Hooks работает на капоте. Предстоящий хук React useState основан на деструктурировании массива, давайте..

    Пакеты R, используемые в Tesla
    Добро пожаловать обратно! R — очень популярный язык программирования, используемый множеством компаний, включая Tesla! Итак, давайте взглянем на некоторые пакеты R, которые использует Tesla...

    Сокращение и слияние токенов для эффективных моделей VL: обзор
    Часто в задачах, связанных с компьютерным зрением и НЛП, вычислительно затратная и требующая большого объема памяти обработка становится препятствием для более быстрого логического вывода модели, а..