Допустим, у меня есть веб-сайт, на котором я создаю статьи, а также редактирую существующие статьи. Страница шаблона для создания новых статей такая же, как и страница шаблона для редактирования существующих статей. Единственное отличие состоит в том, что в форму для редактирования уже добавлены значения по умолчанию/существующие.
Я пытаюсь понять, как использовать одно и то же действие для обоих маршрутов. Вот мои маршруты:
article_new
url: /article/new/
class: sfDoctrineRoute
options:
model: MyArticle
type: object
param:
module: article
action: edit
article_edit
url: /article/edit/:id/
class: sfDoctrineRoute
options:
model: MyArticle
type: object
param:
module: article
action: edit
requirements:
id: /d+
Итак, обе статьи указывают на следующее действие:
public function executeEdit(sfWebRequest $request)
{
$article = $this->getRoute()->getObject();
$this->form = new MyForm( $article );
// Binding and validation stuff here
// .....
}
Это прекрасно работает, когда вы хотите отредактировать статью. getRoute()->getObject()
автоматически получает правильную статью из слага id
и передает эти значения по умолчанию в форму. Идеально.
Но с маршрутом article_new
это не так хорошо работает. getRoute()->getObject()
возвращает первую статью в моей таблице базы данных, хотя я не передал URL-адресу какой-либо тип параметра id
. Таким образом, информация из первой статьи в базе данных передается в форму как значения по умолчанию. Я явно не хочу этого.
Я также попытался удалить материал class: sfDoctrineRoute
из маршрута article_new
, но затем объект getRoute()->getObject() fails because it's no longer an
sfRoute`, с которым я работаю.
Каков наилучший подход здесь? Я хотел бы сделать все одним действием, чтобы сэкономить время программирования и время обслуживания в будущем.
Также я обнаружил, что одно из решений состоит в том, что я могу проверить, является ли $request->getParameter('id')
null
, и если да, то $article = array()
, в противном случае статья извлекается с использованием getRoute()->getObject()
. Кажется, это работает нормально, но я подумал, что может быть менее хакерское решение.