Внедрение критериев в объект sfPropelRoute - PullRequest
0 голосов
/ 18 декабря 2009

У меня есть Page объект, уникальность которого заключается в его PageDomain. Схема настроена так, что таблица page содержит поле page_domain_id для создания взаимосвязи. Чтобы показать страницу, у меня есть действие executeShow и пользовательский обработчик. Мой маршрут выглядит так:

page_show:
  url:     /:domain_slug/:slug
  class:   sfPropelRoute
  options:
    model: Page
    type:  object
    method_for_criteria: doSelectByDomain
param:   { module: page, action: show }
requirements:
  sf_method: [get]

Например, у меня может быть /audience/create, а также /behavior/create. Мне нужно иметь возможность определить, какая страница запрашивается.

Назначение пользовательского обработчика (doSelectByDomain) - ввести domain_slug и извлекать / показывать страницу только в том случае, если ее домен также корректен. Однако я обнаружил, что, хотя параметр domain_slug доступен в параметре действия $request, у меня нет способа передать его в свой пользовательский обработчик, чтобы его можно было включить в то, что было получено.

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

Помощь? Спасибо.

Ответы [ 2 ]

3 голосов
/ 19 декабря 2009

Так что небольшое предприятие по исходному коду привело меня туда, где я должен был быть. Кажется, что sfPropelRoute предлагает опцию method_for_criteria, но учитывает опцию method sfObjectRoute и использует ее, если она существует. Если существует только method_for_criteria, класс sfPropelRoute создает объект критериев из параметров запроса.

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

В любом случае, короткая версия такова, что если вы используете опцию method, все параметры передаются (без редактирования) в виде массива указанному обработчику. Если вам нужны параметры запроса, отличные от тех, которые являются свойствами объекта, похоже, вам стоит пойти по этому пути.

0 голосов
/ 23 декабря 2009

Я не уверен, что полностью понимаю вашу проблему (я прочитал это для тега Propel, а не для тега Symfony), но есть ли какая-либо помощь в главе Advanced Routing из календаря Advent? Код приведен для Doctrine, но я думаю, вы также можете адаптировать его для Propel.

...