adbacz
6.02.2012, 21:38:36
Potrzebuję listę nazw, które można wykożystać do DI w Symfony2. Nie wiecie gdzie można takową znaleźć?
Chodzi mi o pobranie instancji klasy poprzez $this->get('class');.
Crozin
6.02.2012, 21:49:00
Możesz jakoś rozwinąć bo to co napisałeś... nie ma zbyt dużego sensu. Czyżby chodziło Ci o listę wszystkich dostępnych w danym czasie usług w DIC-u? Symfony\Component\DependencyInjection\Container::getServiceIds().
destroyerr
6.02.2012, 21:59:52
Lub komenda container:debug
adbacz
6.02.2012, 22:00:07
Tak, dokładnie o to - dziękuję. Po prostu nie wiedziałem jak to napisać.
Kurcze, nie chce tworzyć nowego wątku i pośrednio ten wątek założyłem aby samemu odszukac informacje ale nie znalazłem tego co chciałęm. Może mi ktoś powiedzieć czy jest możliwość w SF2 sprawdzenia, czy dany adres istnieje? Po prostu chciałbym w danym momencie w kodzie sprawdzać czy adres istnieje i robić "coś" innego niż to co się dzieje normalnie (E404).
EDIT:
Znalazłem coś w tej klasie, ale nie wiem czy to jest do tego i dlatego chciałem się dowiedzieć jak się do niej dostać poprzed DIC:
Symfony\Component\Routing\Matcher\UrlMatcher::match()
Crozin
6.02.2012, 22:07:48
Chodzi o to, że przykładowo otrzymujesz skądś jakiś adres URL, przykładowo
http://example.org/path/123/some-title.html i chciałbyś sprawdzić czy jest to poprawny adres w obrębie Twojej strony?
Teraz pytanie czy to ma sprawdzać czy to jest poprawny format, tj. czy na stronie jest zdefiniowana jakaś tam reguła routingu /path/{ID}/{TITLE}.html czy może czy jest to i poprawny format i faktycznie istniejąca podstrona?
adbacz
6.02.2012, 22:13:10
Załóżmy, że to strona na którą ktoś jest przekierowywany z mojej strony (powiedzmy po zalogowaniu się):
http://example.org/article/title-123 i ta strona jest w moim projekcie (?). Jak sprawdzić czy ścieżka (/article/{name}-{id}) istnieje? W sensie, żeby nie pokazywało mi domyślnie błędu 404. Mam nadzieje, że dobrze się wyraziłem.
Nie chodzi o format (.html), ani o to czy, jak w tym przypadku, artykuł na takiej stronie istnieje, po prostu czy jest to ścieżka odpowiadająca zdefiniowanemu routingowi w SF.
Crozin
6.02.2012, 22:52:54
No to w takim razie $container->get('router')->match('URL'); powinno załatwić sprawę. Metoda match() Routera wewnętrznie korzysta z wspomnianego przez Ciebie Symfony\Component\Routing\Matcher\UrlMatcher::match() .
adbacz
6.02.2012, 23:06:19
Dzięki Ci wielkie Crozin, o to mi właśnie chodziło. Teraz tylko zastanawiam się, co zrobić, żeby nie pokazywało błędu, gdy route nie istnieje ;/
Kurde, jak nie jeden problem to następny. Przesyłając do tej metody ścieżkę / zwraca mi ładnie tablicę z kontrollerem i route-m, ale jak podam coś, co nie istnieje dostaję błąd 500 i żadnego powiadomienia z tegoż ResourceNotFoundException, które jest wysyłane jako E500. Można coś z tym zrobić? Jakoś wygłuszyć to, żeby zwróciło jakąś inną wiadomość niż exception? Mógłbym dopisać tam do tej metody coś, ale nie chcę grzebać w oryginalnych plikach, wolę poszukać jakiegoś rozwiązania.
Crozin
6.02.2012, 23:19:00
Po prostu sprawdź jakie wyjątki rzuca metoda match() i przechwyć je.
$success = null;
try {
$...->match($url);
$success = true;
} catch (ResourceNotFoundException $e) {
$success = false;
}
adbacz
6.02.2012, 23:25:50
Tak się składa, że ta funkcja nie ma bloku try() catch() a takie cosik:
throw 0
< count($this->allow) : new ResourceNotFoundException();
Ale coś pomyślę nad tym. Dziękuję za wszelką pomoc
Crozin.
ARGH no to właśnie oznacza, że ta metoda może wyrzucić albo ten albo ten wyjątek.
dlatego umieść ją w
try {
->match(...);
}
catch(\Exception $e) {
}
i będzie działało...
Crozin
6.02.2012, 23:46:41
@ano: Powinieneś łapać jedynie dwa wyjątki wspomniane w dokumentacji, tj. MethodNotAllowedException oraz ResourceNotFoundException. Łapianie wszystkich wyjątków jest tutaj błędem.
adbacz
6.02.2012, 23:49:37
Przepraszam, źle zrozumiałem Crozina ;/ Zrozumiałem, że w tej metodzie mam zmienić a nie objąć już wywołanie tej metody blokiem. Mój błąd.
Cytat(Crozin @ 6.02.2012, 23:46:41 )

@ano: Powinieneś łapać jedynie dwa wyjątki wspomniane w dokumentacji, tj. MethodNotAllowedException oraz ResourceNotFoundException. Łapianie wszystkich wyjątków jest tutaj błędem.
Crozin, nie patrzylem do dokumentacji więc nie mam pojęcia jakie wyjątki może wyrzucić ta metoda. Jednak założyłem, że wszystkie dziedziczą po \Exception, więc dla bezpieczeństwa adbacza tak właśnie napisałem.
adbacz
6.02.2012, 23:56:14
Dla bezpieczeństwa? Możesz to rozwinąć? O co Ci chodzi dokładnie ano?
Crozin
7.02.2012, 00:27:46
Rozumiem, że mogłeś nie patrzeć do dokumentacji na potrzebny tego postu, ale w normalnym kodzie pod żadnym pozorem tego \Exception nie powinno tam być. Jedynie dwa wspomniane wcześniej wyjątki oznaczają nieistnienie reguły routingu, a co jeśli pojawił by się jakiś inny wyjątek?
Czym mógłby być spowodowany taki nieprzewidziany wyjątek? Mógłby on zostać wyrzucony przez nasz własną implementację UrlMatchera, która mogłaby korzystać przykładowo z bazy danych i na skutek zerwania połączenia wyrzucić wyjątek. Pojawienie się takiego wyjątku powinno skutkować wywaleniem całej aplikacji (w takiej sytuacji raczej nie wiele dałoby się zrobić), jednak w przypadku kodu podanego przez Ciebie zostanie to błędnie zinterpretowane jako nieistnienie danej reguły - co jest oczywiście błędne.
Dlatego też właśnie dla bezpieczeństwa nie powinno być tam \Exception.
Swoją drogą tutaj ewidentnie język sam w sobie daje ciała nie wprowadzając mechanizmu wymuszającego obsłużenie wyjątków (pomijając wyjątki czasu działania - ang. runtime).
crozin, doskonale to rozumiem. Napisałem tam \Exception, tylko dlatego, że @adbacz napisał ten o to post:
Cytat(adbacz @ 6.02.2012, 23:25:50 )

Tak się składa, że ta funkcja nie ma bloku try() catch() a takie cosik:
throw 0
< count($this->allow) : new ResourceNotFoundException();
Ale coś pomyślę nad tym. Dziękuję za wszelką pomoc
Crozin.
który mnie przeraził, więc nie sądziłem, że warto JESZCZE wchodzić w szczegóły wyjątków...
adbacz
7.02.2012, 22:54:21
Cytat
który mnie przeraził, więc nie sądziłem, że warto JESZCZE wchodzić w szczegóły wyjątków...
Oj tam, oj tam. Po prostu czytanie ze zrozumieniem troszkę u mnie kuleje ostatnio - źle przeczytałem i zrozumiałem pos
Crozina. Koniec OffTopu. Dziękuję za pomoc Panowie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.