Clicky

Skocz do zawartości


Zdjęcie
- - - - -

[L5] Route i pominięcie wpisu gdy brak rekordu

3 odpowiedzi w tym temacie
laravel routing

  • Zaloguj się, aby dodać odpowiedź

#1 Zepco

Zepco

    Senior Mastah

  • Moderator
  • 1583 postów
  • Skąd:Kielce

Napisano 31 sierpień 2015 - 20:25

Mam swój routing gdzie na końcu jest wpis:

Route::get('{slug}', [
	'as' => 'page',
	'uses' => 'PageController@getPage',
]);

Dodatkowo używam pakietu pingpong/modules, których routingi ładowane są za moim i chciałbym, żeby tak zostało Pytanie jak w przypadku braku strony z danym slug'iem pominąć wpis w routerze i przejść do sprawdzania kolejnych czy pasują z adresem?


OŚWIADCZENIE: Ja, niżej podpisany, świadomy wszystkich konsekwencji tego posta postanawiam go dopuścić do użytku publicznego, albowiem bo gdyż aczkolwiek uważam, że nie wyrządzi on (znaczy: post) krzywdy nikomu innemu niźli mnie samemu (czyli autorowi posta).
-- Zepco --


#2 mck

mck

    Jestę Blogerę

  • Admin
  • 1544 postów

Napisano 01 wrzesień 2015 - 07:07

#niedasię

 

Już 2 lata temu pojawił się taki request, ale Taylor jak zwykle zamknął go bez czytania...



#3 Zepco

Zepco

    Senior Mastah

  • Moderator
  • 1583 postów
  • Skąd:Kielce

Napisano 02 wrzesień 2015 - 07:30

Chyba powodem zamknięcia jest fakt, że klasa Route z Laravela korzysta przy okazji z podobnej klasy rodem z Symfony ,a ta również nie pozwala na takie rozwiązanie. Trzeba szukać innego sposobu. :|


OŚWIADCZENIE: Ja, niżej podpisany, świadomy wszystkich konsekwencji tego posta postanawiam go dopuścić do użytku publicznego, albowiem bo gdyż aczkolwiek uważam, że nie wyrządzi on (znaczy: post) krzywdy nikomu innemu niźli mnie samemu (czyli autorowi posta).
-- Zepco --


#4 Zepco

Zepco

    Senior Mastah

  • Moderator
  • 1583 postów
  • Skąd:Kielce

Napisano 03 wrzesień 2015 - 09:01

Jednak się pomyliłem i S2 ma taką opcję.

 

Nie chciałem za bardzo ingerować w kod routera, więc wymyśliłem trochę inny sposób obejścia.

 

W katalogu App/Routing/Matching utowrzyłem sobie plik SlugValidator.php:

<?php namespace App\Routing\Matching;

use Illuminate\Http\Request;
use Illuminate\Routing\Route;
use Illuminate\Routing\Matching\ValidatorInterface;
use App\Models\Page;

class SlugValidator implements ValidatorInterface
{
    /**
     * Validate a given rule against a route and request.
     *
     * @param  \Illuminate\Routing\Route  $route
     * @param  \Illuminate\Http\Request  $request
     * @return bool
     */
    public function matches(Route $route, Request $request) : bool
    {
        if ($route->getName() == 'page') {
            return $page = Page::where('slug', '=', $request->segment(1))
                ->where('status', '=', PAGE::STATUS_ACTIVE)->count();
        }

        return true;
    } // matches()
} // SlugValidator

Natomiast w App/Providers/RouteServiceProvider.php dodałem obsługę tego pliku w funkcji boot:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Route;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;

use Illuminate\Routing\Route as R;
use App\Routing\Matching\SlugValidator;

class RouteServiceProvider extends ServiceProvider
{
    /**
     * This namespace is applied to your controller routes.
     *
     * In addition, it is set as the URL generator's root namespace.
     *
     * @var string
     */
    protected $namespace = 'App\Http\Controllers';

    /**
     * Define your route model bindings, pattern filters, etc.
     *
     * @return void
     */
    public function boot()
    {
        R::$validators = array_merge(R::getValidators(), [new SlugValidator]);

        parent::boot();
    }


[....]

Może rozwiązanie trochę łopatologiczne, ale działa. :D Wystarczy, że walidator zwróci false, a router ominie wpis i będzie szukał kolejnych.


  • nrm, mck i thejw23 lubią to

OŚWIADCZENIE: Ja, niżej podpisany, świadomy wszystkich konsekwencji tego posta postanawiam go dopuścić do użytku publicznego, albowiem bo gdyż aczkolwiek uważam, że nie wyrządzi on (znaczy: post) krzywdy nikomu innemu niźli mnie samemu (czyli autorowi posta).
-- Zepco --






Również z jednym lub większą ilością słów kluczowych: laravel, routing

Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych