![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. ![]() |
Ciężko zdefiniować ten problem, bo jest dość zakręcony. Postaram się przedstawić w miarę jasno o co chodzi. Zacznę od listingu.
Plik obcięty ze zbędnych tagów. Przedstawia definicję akcji i ich podstawowe relacje. actions.xml
Załóżmy, że wywołujemy żądanie o postaci index.php?action=index Parser czytając ten plik XML odczyta subakcję i stworzy ciąg akcji do uruchomienia w postaci showCategory showNews index W przedstawionej kolejności zostaną te akcje wykonane. (np metodą execute()) Gdzie problem? Ano. np, index.php?action=index&id=3 Intencją programisty jest, że $id odnosi się do akcji showCategory, która na jej podstawie wybiera kategorię z bazy danych. Niech teraz akcja showNews również wymaga przekazania jakichś argumentów, np. $category oraz $id. Nie może po prostu odczytać $id, bo ten jest pobierany przez inną akcję i może nie zawierać tego, co chcemy, a nawet na pewno nie zawiera. Ktoś może powiedzieć, że w takim razie najlepiej stworzyć łańcuch index.php?action=index?categoryId=7&newsId=5 Od razu odpowiem, że takie rozwiązanie jest kalekie, i w ogóle nie wchodzi w grę, bo związuje akcję z konkretną nazwą klucza, którą potem trzeba wszędzie powtarzać. Ktoś inny może podsunąć pomysł ustawiania parametrów żądania przez poprzednią akcję. Owszem. Wiele frameworków robi to i czasami również zaleca uruchomienie, bądź wręcz uruchamia kolejna akcję. Można wówczas taki bajer zrobić W ciele akcji showCatagory
Co jednak, jeśli te akcje mogą zostać uruchomione w różnych kontekstach? np. Stwórzmy nową akcję.
Jak widać, uruchomienie index?action=showMostPopularCategory również wykona akcję showCategory. Niniejszym jakakolwiek ingerencja w parametry akcji showNews nie ma sensu, bo tej akcji nie ma w łańcuchu. Podobnie rzecz się będzie miała z innymi akcjami, a dochodzą jeszcze nieograniczone wręcz możliwości kombinowania układów akcji. Rodzi się konkretne pytanie - w jaki sposób przekazać w takim układzie parametry żądania? Akcja nie ma pojęcia, w jakim kontekście jest uruchamiana, wiec musi liczyć na to, coś ustawi to za nią, albo sama musi znaleźć te parametry... : \ Jeśli ktoś spotkał się z podobnym problemem, to będę wdzięczny za podzielenie się przemyśleniami oraz posiadanymi linkami do artów itp. Dzięki wszystkim, którzy w ogóle dobrnęli do końca tego posta Pozdrawiam. |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 634 Pomógł: 14 Dołączył: 27.05.2006 Skąd: Berlin Ostrzeżenie: (0%) ![]() ![]() |
Cześć!
Problem ten jest trochę egzotyczny (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) . Ale nasuną mi się pomysł który jest używany przez .NET, może trochę w inny sposób ale tez może zaradzić temu konkretnemu przypadkowi. Mówię tu o delegate, jest to w .NET używane jako sygnatura metod. W Twoim problemie możesz zrobić następująco: Dla każdej z akcji zdefiniować sygnaturę, czyli jak wygląda request do nich, np.: showCategory ma sygnature: id=[int]&costam=[bool] i jak się akcja wywoła to sprawdza czy URL w zapytaniu odpowiada jej zdefiniowanej sygnaturze jak tak to tak, nie to nie trzeba (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) tak wiec domyślam się ze showNews będzie miało trochę inną sygnaturę niż showCategory i jak zostanie akcja showNews odpalona i url nie będzie się zgadzał to nie będzie brało wartości od niego. Możesz też odrejestrowywac/usuwać/kasować/kak zwal tak zwal/ te zmienne które już zostały wykorzystane przez akcje i masz pewność ze nigdzie indziej tego nie będziesz używał. To możesz zrobić definiując w pliku konfiguracyjnym nazwy zmiennych które są wyłączne dla danej akcji i które są odrejestrowywane/usuwane/kasowane/kak zwal tak zwal/ po jej wykonaniu. A tak na marginesie to radze Ci zajrzeć do frameworku Symfony który podobny problem rozwiązał z poziomu routera, szczególnie zwróć uwagę na pliki konfiguracyjne routera. Pozdrawiam |
|
|
![]() ![]() |
![]() |
Aktualny czas: 5.10.2025 - 05:48 |