Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [LR] Routing do widoków
Forum PHP.pl > Forum > PHP
markonix
  1. Route::get('page/{id}', function ($name) {
  2. return view('pages.static.'. $name);
  3. });

Mam taki prosty route, który pozwoli na tworzenie takich statycznych podstron bez mojej ingerencji.
Wystarczy stworzyć widok w folderze i wsio.

Mam jednak zagwozdki:
1) Jak wyświetlić 404 gdy widoku nie ma, przy obecnym rozwiązaniu wyrzuca błąd o braku widoku (oczywiste)?
2) Chciałbym pominąć te "page" czyli mieć example.com/faq zamiast example.com/pages/faq? Jak zrobić taki główny route, który zbierze wszystkie requesty ale zostawi te należące do aplikacji?

edit:
W sumie z tym punktem 2 przyszedł mi najoczywistszy pomysł.. Po prostu dać:
  1. Route::get('{id}', function ($name) {
  2. return view('pages.static.'. $name);
  3. });

na samym końcu pliku.

Czy to "ładne" i bezpieczne rozwiązanie?
Pyton_000
Rzucany masz taki wyjątek:

Kod
throw new InvalidArgumentException("View [$name] not found.");


Dodaj obsługę tutaj: app/Exceptions/Handler.php

np:/

  1. if ($e instanceof InvalidArgumentException) {
  2. abort(404);
  3. }
markonix
  1. if ($e instanceof InvalidArgumentException)
  2. {
  3. abort(404);
  4. }
  5.  
  6. $class = get_class($e);
  7. if ($class == 'InvalidArgumentException')
  8. {
  9. abort(404);
  10. }

Jakaś podpowiedź czemu działa tylko ta druga, brzydsza metoda? :/
Pyton_000
\InvalidArgumentException ?

Zrób dd($e) i będziesz wiedział jakiego dokładnie jest typu.
markonix
Dumpowałem i wskazywało na InvalidArgumentException dlatego zgłupiałem.
Slash oczywiście zadziałał, oczywiście bo nawet PHPSTORM to podpowiadał.

Wracając do tematu właściwego mam coś takiego:
  1. public function report(Exception $e)
  2. {
  3. if ($e instanceof \InvalidArgumentException && strstr($e->getMessage(), 'pages.static') !== false)
  4. {
  5. abort(404);
  6. }
  7. return parent::report($e);
  8. }

Ten drugi warunek jest po to aby zachować funkcjonalność wyjątków gdy faktycznie brakuje widoku w przypadku normalnych kontrolerów (np. zrobimy literówkę z metodzie view()).
Brzydko ale działa jak powinno.
KrzychuKa
Czy nie byłoby gustowniej poprostu sprawdzić czy widok istnieje?
  1. view()->exists('pages.static.'. $name)
markonix
Czyli coś takiego:
  1. Route::get('{id}', function ($name) {
  2. if (view()->exists('pages.static.'. $name)) {
  3. return view('pages.static.' . $name);
  4. }
  5. return abort(404);
  6. });


Też o czymś takim myślałem, ale nie jestem przyzwyczajony że w LR wszystkie metody i funkcje są tak "magicznie" wszędzie dostępne.
W każdym razie praktyczna nauka Exceptions/handler też się przyda na przyszłość.
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.