Допустим, у меня есть веб-сайт, на котором я создаю статьи, а также редактирую существующие статьи. Страница шаблона для создания новых статей такая же, как страница шаблона для редактирования существующих статей. Единственное отличие состоит в том, что к форме для редактирования уже добавлены значения по умолчанию / существующие значения.
Я пытаюсь выяснить, как использовать одно и то же действие для обоих маршрутов. Вот мои маршруты:
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()
. Кажется, это работает нормально, но я подумал, что может быть менее хакерское решение.