Laravel Ограничить параметр маршрута динамически (но показывать только действительные URL) - PullRequest
0 голосов
/ 23 января 2020

Я не могу сосредоточиться на чем-то.

У меня есть таблица, которую я отображаю в моем файле tables.blade. php, например:

<table>
   <thead>
      <tr>
         <th scope="col">Country</th>
         <th scope="col">Member</th>
      </tr>
   </thead>
   <tbody>
      @foreach ($members as $member)  
         @if ($member->continent == 'Europe')
            <tr>
               <td>
                  <a href="{{ route('country', $member->country) }}">{{ $member->country }}</a>
               </td>
               <td class="align-middle player-code copy-code">
                  {{ $member->name }}                   
               </td>
            </tr>
         @endif
      @endforeach
   </tbody>
</table>

Как вы можете видеть, вы можете нажать на страну, которая покажет вам участников из одной страны в новом представлении (код не показан здесь). Маршрут для этого отдельного сайта страны в сети . php выглядит следующим образом:

Route::get('/{country}', 'PageController@show')->name('country');

Все работало нормально, пока я не понял, что могу поставить что-нибудь как 'country' и до сих пор будет показан сайт для страны только с пустой таблицей. Так что '/abcde' даст вам представление только с голым столом.

Итак, я изменил маршрут следующим образом:

Route::get('/{country}', 'PageController@show')->name('country')->where('country', ('United Kingdom|France|Belgium|South Africa);
//the list is much longer

Ок. Итак, теперь я ограничил 'country' -параметр довольно статичным образом c. И у меня такое чувство, что это не так, как должно быть. Потому что в конце я хотел бы, чтобы URL-адреса выглядели так '/united-kingdom', '/france', но теперь они выглядят так '/United%20Kingdom'. Я видел ответы на этот вопрос Laravel чистые ссылки без пробелов или заглавных букв , но для меня они не очень полезны, так как я работаю не с моделями Eloquent, а с Query Builder (таблицы БД, которые я get готовы, я только должен их отобразить).

Итак, мои вопросы:

Как более динамически ограничить параметр маршрута?

Как отобразить данные односторонне (написано так, как будто они тоже в таблице, как это «Великобритания»), но есть маршрут, подобный этому («Великобритания»)?

I Я готов предоставить больше кода или информации, если вам нужно, я просто в замешательстве и мне кажется, что я что-то упускаю (большое).

Спасибо за ваше время и помощь!

1 Ответ

0 голосов
/ 23 января 2020

Если вы хотите, чтобы параметр маршрута всегда был ограничен данным регулярным выражением, вы можете использовать метод pattern. Вы должны определить эти шаблоны в методе boot ваших RouteServiceProvider:

use Illuminate\Support\Facades\DB;    
//...

/**
 * Define your route model bindings, pattern filters, etc.
 *
 * @return void
 */
public function boot()
{

    $list_of_countries = DB::table('members')->whereNotNull('country')->pluck("country")->unique()->map(function ($name) {
         return str_slug($name, '-');
    })->reject(function ($name) {
         return empty($name);
    })->toArray();

    $regex = '(' . implode('|', $list_of_countries) . ')';

    Route::pattern('{country-slug}', $regex);

    parent::boot();
}

маршрутов \ сети. php

Route::get('/{country-slug}', 'PageController@show')->name('country');

Документы

...