Paweł Koralewski

Paweł Koralewski architekt aplikacji,
team leader

Temat: przesiadka z sf1.4 na Sf2

Przeczytałem dokumentację i brakuje mi informacji o 2 rzeczach (tak na początek ;)):

1. routing

Jak zdefiniować pojedynczy routing, aby uwzględniał URLa w postaci: example.com/controller/action, gdzie kontroler i akcja nie są zdefiniowane? Chodzi mi o odpowiednik dla sf1:

#apps/front/config/routing.yml
default:
url: /pl/:module/:action/*

2. widoki dla akcji

W sf1 każdy plik widoku był kawałkiem htmla, który był włączany do layotu. W Sf2 każdy plik musi dziedziczyć po layoucie, podmieniając bloki (przynajmniej tak zrozumiałem). Dodatkowo każda akcja musi się kończyć zwróceniem obiektu odpowiedzi. Dla prostszych akcji dla mnie wygodniejsze było, że mogłem w zasadzie w kontrolerze zrobić pustą metodę dla akcji (domyślnie zwracane było sfView::SUCCESS), co powodowało uwzględnienie odpowiedniego pliku szablonu. W Sf2 muszę podać ścieżkę do pliku szablonu, a jak będę potrzebować zmienić nazwę kontrolera, to muszę też pozmieniać te ścieżki. Zaletą takiego wymuszenia pracy jest to, że trzeba najpierw pomyśleć nad aplikacją :) Czy da się odtworzyć podobny sposób działania jak w sf1.4, tzn. że akcja może być psuta, a widok nie dziedziczy po layoucie? Czy to zaburza koncept?

3. komponenty / partiale

Jaki jest ich odpowiednik w Sf2?

konto usunięte

Temat: przesiadka z sf1.4 na Sf2

1. Nie wiem czy da się coś takiego w prosty sposób osiągnąć. Raczej nie bo w routingu zawsze musisz podać moduł i akcję. Chyba, że nadpiszesz cały routing. Poza tym ta regułka jest czymś, co jako pierwsze usuwam w każdym projekcie. User ma mieś dostęp tylko do tego do czego ja chce, żeby miał dostęp :)

2. Na pewno można - nadpisać cały bundle zarządzający widokami. Tylko po co? Ale dać się powinno tylko banalne to raczej nie będzie.
A i po layoucie to powinien (a nie musi, bo możesz sobie przedefiniować przecież cały layput) dzidziczyć wynik akcji odpalanej prosto z przeglądarki. Cała reszta w środku to już inna bajka. Tam dziedziczenia być nie musi.

3. Nie ma czegoś takiego. Jak chcesz w widoku zamieścić inny fragment html-a to robisz tak (dla php bo twig-a nie używam i nie pamiętam jak to tam jest):

echo $view->render('AcmeDemoBundle:Default:navigation.html.php');

Chyba, że tym fragmentem ma być wynik innej akcji to wtedy tak:

echo $view['actions']->render('AcmeDemoBundle:Default:navigation');
Karol S.

Karol S. Software Engineer @
VMware, Palo Alto,
USA

Temat: przesiadka z sf1.4 na Sf2

Ad. 1) Ogólnie rzecz biorąc nie da się. Można próbować tak:


default:
pattern: /{_controller}


Wtedy dostajesz linki w postaci: http://example/AcmeDefaultBundle:SomeController:someview. Nie wiem czy to może być do czegoś użyteczne ;)

Możesz też spróbować użyć tego bundle: https://github.com/hidenorigoto/DefaultRouteBundle . Ostatnia wersja jest z 22 stycznia, więc nie wiem na ile to współgra z najnowszymi wersjami sf2.

Ad. 2) Nie musi dziedziczyć po layoucie. Jeśli nie dasz np. w twigu tagu {% extends %} nic się nie stanie. po prostu wyrenderuje Ci dany plik szablonu.
I nie musisz definiować szablonu w kontrolerze.

Dla przykładu:


class DefaultController extends Controller
{
/**
*
* @Route("/", name="index")
* @Template()
*/

public function indexAction()
{ return array();
}


Takie coś domyślnie załaduje widok z views/Default/index.html.twig (views/nazwa_kontrolera/nazwa_metody.html.twig).

Ad. 3) Nie ma w 'The book' sf2 użytego słowa partial, ale de facto partiale są, dołącza się je, np. w twigu, poprzez konstrukcję {% include %}. Tutaj jest to opisane: http://symfony.com/doc/current/book/templating.html#in...Karol S. edytował(a) ten post dnia 30.10.11 o godzinie 11:52



Wyślij zaproszenie do