Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony] Lista nazw dla DI, Gdzie mogę taką znaleźć?
adbacz
post
Post #1





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


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');.
Go to the top of the page
+Quote Post
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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().
Go to the top of the page
+Quote Post
destroyerr
post
Post #3





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

Ostrzeżenie: (0%)
-----


Lub komenda container:debug
Go to the top of the page
+Quote Post
adbacz
post
Post #4





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


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()

Ten post edytował adbacz 6.02.2012, 22:02:13
Go to the top of the page
+Quote Post
Crozin
post
Post #5





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
adbacz
post
Post #6





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Crozin
post
Post #7





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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() .
Go to the top of the page
+Quote Post
adbacz
post
Post #8





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


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.

Ten post edytował adbacz 6.02.2012, 23:12:07
Go to the top of the page
+Quote Post
Crozin
post
Post #9





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Po prostu sprawdź jakie wyjątki rzuca metoda match() i przechwyć je.
  1. $success = null;
  2.  
  3. try {
  4. $...->match($url);
  5. $success = true;
  6. } catch (ResourceNotFoundException $e) {
  7. $success = false;
  8. }
Go to the top of the page
+Quote Post
adbacz
post
Post #10





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


Tak się składa, że ta funkcja nie ma bloku try() catch() a takie cosik:
  1. throw 0 < count($this->allow)
  2. ? new MethodNotAllowedException(array_unique(array_map('strtoupper', $this->allow)))
  3. : new ResourceNotFoundException();

Ale coś pomyślę nad tym. Dziękuję za wszelką pomoc Crozin.
Go to the top of the page
+Quote Post
ano
post
Post #11





Grupa: Zarejestrowani
Postów: 435
Pomógł: 40
Dołączył: 16.02.2003
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


ARGH no to właśnie oznacza, że ta metoda może wyrzucić albo ten albo ten wyjątek.
dlatego umieść ją w
  1. try {
  2. ->match(...);
  3. }
  4. catch(\Exception $e) {
  5.  
  6. }

i będzie działało...
Go to the top of the page
+Quote Post
Crozin
post
Post #12





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


@ano: Powinieneś łapać jedynie dwa wyjątki wspomniane w dokumentacji, tj. MethodNotAllowedException oraz ResourceNotFoundException. Łapianie wszystkich wyjątków jest tutaj błędem.
Go to the top of the page
+Quote Post
adbacz
post
Post #13





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
ano
post
Post #14





Grupa: Zarejestrowani
Postów: 435
Pomógł: 40
Dołączył: 16.02.2003
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
adbacz
post
Post #15





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


Dla bezpieczeństwa? Możesz to rozwinąć? O co Ci chodzi dokładnie ano?
Go to the top of the page
+Quote Post
Crozin
post
Post #16





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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).
Go to the top of the page
+Quote Post
ano
post
Post #17





Grupa: Zarejestrowani
Postów: 435
Pomógł: 40
Dołączył: 16.02.2003
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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:
  1. throw 0 < count($this->allow)
  2. ? new MethodNotAllowedException(array_unique(array_map('strtoupper', $this->allow)))
  3. : 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... (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
adbacz
post
Post #18





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.12.2025 - 20:22