Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF][Symfony] Routing w Symfony 2
Forum PHP.pl > Forum > PHP > Frameworki
strike
Mam problem z ustawieniem routing-u w Symfony 2, dzięki ustawieniu adnotation działa mi "index" pakietu po adresie:
projekt/web/app.php/pakiet.html
ale nie chce działać bez "/app.php" , ustawiłem w routing.yml:

_homepage:
pattern: /
defaults: { _controller: PakietBundle:Default:index }

(wiem o spacjach)

wyczyściłem cache i nic to nie dało sad.gif nie działa:

projekt/web/app.php/ --> Error 404
projekt/web/ --> Error 403

Może mi ktos podpowiedzieć co robie źle?
bambam
zle masz nazwanego bundle, nazwa jest 2 czesiowa np AcmeDemoBundle i analogicznie struktura katalogow src: Acme/DemoBundle

Ty masz tylko PakietBundle wiec cos ci brakuje

strike
Nazwa jest prawidłowa więc problem jest gdzie indziej


Edit:
Wydaje mi się że problem jest w ustawieniach mojego lokalnego serwera, w pliku htaccess jest warunek

<IfModule mod_rewrite.c>

Czyżbym miał niewłączony mod_rewrite? W httpd.conf jest odkomentowane:

LoadModule rewrite_module modules/mod_rewrite.so

czyżby była do tego potrzebna instalacja dodatkowej paczki ?
Szymciosek
A korzystasz czasami z app_dev.php ? Tam Ci ładnie pokaże, jeśli ma problem.
strike
Problem rozwiązany a raczej znam jego przyczynę: Gdy nie działa mod_rewrite to tak się dzieje.
webmaniak
Witam,
czytam sobie informacje o routingu dostępne tutaj:
http://symfony-docs.pl/book/routing.html
Wcześniej miałem doczynienia z CI. Tam tworzyłem sobie akcje w kontrolerze, następnie odpowiedni widok i działało. Tutaj natomiast wygląda na to - tak mi się wydaję, że każdy adres któy będzie wpisany musi być zapisany w routingu. Pytanie czy da się to jakoś obejść? Czy to musi tak wyglądać? Czy w Yii też to tak wygląda? Wiem, że dla "wyjadaczy" symfony to jest kretyńskie pytanie, ale ja się uczę tego fw, więc pytam smile.gif
Pozdrawiam i dziękuję za wytłumaczenie.
sajegib
Nie, nie każdy (konkretny) adres musi być wpisany w routingu. Możesz np użyć przekazywania przez trasę zmiennej /home/{zmienna} i na jej podstawie coś tam sobie wyświetlać
webmaniak
Hmm, no tak, ale tak czy siak część adresów będzie wymagała podania konkretnego opisu w routingu? Czy w zend2 i yii też to tak wygląda? Czy to jest specyficzna rzecz tylko dla symfony2?
Edit:
mam pierwszy problem z routingiem:
routing.yml:
  1. Admin_kategoria_lista:
  2. pattern: /admin/categories
  3. defaults: {_controller: AuctionsAccountBundle:Admin:categories }

AdminControllers.php:
  1. public function categoriesAction(Request $request) {
  2. return $this->render('AuctionsAccountBundle:Categories:index.html.php', array('form' => $form->createView()));
  3. }

Plik index.html.php:
  1. <?php $view->extend('AuctionsAccountBundle:Admin:index.html.php') ?>
  2. <?php $view['slots']->start('adminbody') ?>
  3. <h1>Lista kategorii</h1>
  4. <?php $view['slots']->stop() ?>

No i komunikat: Nie odnaleziono serwera lub pliku. O co chodzi? Adres http://aukcje.local/app_dev.php/account/admin/categories prowadzi do kontrolera admin, akcji categories a ta do pliku index.html.php?

Crozin
Symfony zrezygnowało* z udostępnienia routingu, gdzie bezpośrednio w URLu podany jest kontroler czy akacja. I w sumie bardzo dobrze, bo tak naprawdę nie ma specjalnie dużo roboty z tym, a:
1. Uniezależniasz swój kod od URL-i. Jeżeli w przyszłości zmienisz coś w kodzie nie będziesz musiał zmieniać URL-i czy tworzyć jakiś dziwnych przekierowań.
2. Zawsze możesz korzystać z nazwy ścieżki (np. homepage) zamiast trudzić się z każdorazowym podawaniem pary kontroler:akcja.
3. Możesz łatwo nadpisać ścieżkę.
4. Znacząco ułatwia to utrzymanie kodu.

* oczywiście możesz sobie bezinwazyjnie nadpisać mechanizm routingu (właściwie to wystarczyłoby nadpisać jego maluteńki fragment), ale szczerze nie zalecałbym tego.
webmaniak
A miałem wypróbować Yii :-) skoro ktoś to tak wymyślił to zapewne jest to dobre rozwiązanie a i Twoje argumenty są przekonywujące :-) Mógłby ktoś zerknąć jeszcze na kod który zamieściłem, nie potrafię znaleźć tam błędu-może zmęczenie, nie wiem.
sajegib
  1. AdminControllers.php:

na
  1. AdminController.php:


Cytat
Adres http://aukcje.local/app_dev.php/account/admin/categories prowadzi do kontrolera admin, akcji categories a ta do pliku index.html.php?


Jak masz taki adres to zmień pattern w routingu:

  1. Admin_kategoria_lista:
  2. pattern: /account/admin/categories
  3. defaults: {_controller: AuctionsAccountBundle:Admin:categories }


brakowało account
webmaniak
hmmmm.... Skoro brakuje account, to czemu w tym:
  1. Account_home:
  2. pattern: /
  3. defaults: { _controller: AuctionsAccountBundle:Default:index }
  4.  
  5. Admin_home:
  6. pattern: /admin
  7. defaults: { _controller: AuctionsAccountBundle:Admin:index }
  8.  
  9. Admin_kategoria_lista:
  10. pattern: /admin/categories
  11. defaults: {_controller: AuctionsAccountBundle:Admin:categories }

działa mi poprawnie adres: http://aukcje.local/app_dev.php/account/admin questionmark.gif
Crozin
Zapewne w głównym pliku routingu (app/config/routing), gdzie dołączasz plik routingu z bundla masz ustawiony prefix:
Kod
my_bundle_routing:
    resource: "@MyBundle...."
    prefix: /accout
webmaniak
@sajegib AdminController.php - taką nazwę mam - po prostu źle napisałem tutaj.
Cytat(Crozin @ 16.05.2013, 09:06:10 ) *
Zapewne w głównym pliku routingu (app/config/routing), gdzie dołączasz plik routingu z bundla masz ustawiony prefix:
Kod
my_bundle_routing:
    resource: "@MyBundle...."
    prefix: /accout

Zgadza się smile.gif To teraz wrócę do pierwszego pytania: czemu zatem nie działa mi adres z kategoriami?
destroyerr
@webmaniak ciężko tak trochę w ciemno Ci pomóc. To może być np. jakaś drobna literówka, której nie mamy szans zauważyć. Przejrzyj logi: albo w katalogu apps/logs albo za pomocą Web Debug Toolbar. Jak to Ci nic nie powie. To wrzuć log z tej jednej wadliwej akcji.
webmaniak
hmmm... tam była literówka, między { a _controller. Teraz mam ten sam komunikat. Log:
Kod
[2013-05-16 18:18:20] event.DEBUG: Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\ProfilerListener::onKernelRequest". [] []
[2013-05-16 18:18:20] event.DEBUG: Notified event "kernel.request" to listener "Symfony\Bundle\FrameworkBundle\EventListener\SessionListener::onKernelRequest". [] []
[2013-05-16 18:18:20] event.DEBUG: Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\FragmentListener::onKernelRequest". [] []
[2013-05-16 18:18:20] event.DEBUG: Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\RouterListener::onKernelRequest". [] []
[2013-05-16 18:18:20] request.INFO: Matched route "Admin_kategoria_lista" (parameters: "_controller": "Auctions\AccountBundle\Controller\AdminController::categoriesAction", "_route": "Admin_kategoria_lista") [] []
[2013-05-16 18:18:20] event.DEBUG: Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\LocaleListener::onKernelRequest". [] []
[2013-05-16 18:18:20] event.DEBUG: Notified event "kernel.request" to listener "Symfony\Component\Security\Http\Firewall::onKernelRequest". [] []
[2013-05-16 18:18:20] event.DEBUG: Notified event "kernel.request" to listener "Symfony\Bundle\AsseticBundle\EventListener\RequestListener::onKernelRequest". [] []
[2013-05-16 18:18:20] event.DEBUG: Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\Fragment\FragmentHandler::onKernelRequest". [] []
[2013-05-16 18:18:20] event.DEBUG: Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\DeprecationLoggerListener::injectLogger". [] []
[2013-05-16 18:18:20] event.DEBUG: Notified event "kernel.controller" to listener "Symfony\Bundle\FrameworkBundle\DataCollector\RouterDataCollector::onKernelController". [] []
[2013-05-16 18:18:20] event.DEBUG: Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\ControllerListener::onKernelController". [] []
[2013-05-16 18:18:20] event.DEBUG: Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\ParamConverterListener::onKernelController". [] []
[2013-05-16 18:18:20] event.DEBUG: Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\TemplateListener::onKernelController". [] []
[2013-05-16 18:18:20] event.DEBUG: Notified event "kernel.controller" to listener "Acme\DemoBundle\EventListener\ControllerListener::onKernelController". [] []
[2013-05-16 18:18:20] event.DEBUG: Notified event "kernel.controller" to listener "Symfony\Component\HttpKernel\DataCollector\RequestDataCollector::onKernelController". [] []

Tyle że jak wpiszę w akcji:
  1. public function categoriesAction(Request $request) {
  2. echo 'tu jestem';exit;
  3. return $this->render('AuctionsAccountBundle:Categories:index.html.php', array('form' => $form->createView()));
  4. }

To mam tekst z echo. Czyli problem jest z odczytem pliku?
destroyerr
Log nie zawiera żadnego błędu, być może jest niepełny.

Cytat
To mam tekst z echo. Czyli problem jest z odczytem pliku?

No to wynika z tego, że problem jest z widokiem/szablonem a nie routingiem czy też kontrolerem. W logu powinna być informacja czy nie może znaleźć tego błędu czy też jest to np. błąd składni.
webmaniak
No właśnie dałem pełny log po wpisaniu w przeglądarce adresu. Nie ma nic więcej. A widok mam w AccountBundle/Resources/views/Categories i tam index.html.php. I teraz hmmm... działa jak dałem tak:
  1. public function categoriesAction(Request $request) {
  2. return $this->render('AuctionsAccountBundle:Categories:index.html.php');
  3. }

Może mi ktoś wytłumaczyć z czego to wynika? jak już przekazuję zmienną to muszę ją wykorzystać w widoku?
destroyerr
Jeśli kod który wrzuciłeś (odnośnie akcji) no to błąd jest oczywisty - brak inicjalizacji zmiennej form. Błędu żadnego nie dostajesz bo chyba masz zbyt niskie raportowanie błędów ustawione.
webmaniak
Ok, spawdzę poziom raportowania, jak dla mnie development powinien mieć pełny. To już umiem zmienić. Dzięki za pomoc.
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.