Да приемем, че имам уебсайт, където създавам статии и редактирам съществуващи статии. Шаблонната страница за създаване на нови статии е същата като шаблонната страница за редактиране на съществуващи статии. Единствената разлика е, че формулярът за редактиране вече има добавени стойности по подразбиране/съществуващи към него.
Опитвам се да разбера как да използвам едно и също действие и за двата маршрута. Ето моите маршрути:
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
slug и предава тези стойности като стойности по подразбиране във формуляра. перфектен
Но с маршрута 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()
. Това изглежда работи добре, но реших, че може да има по-малко хакерско решение.