2015-06-17 5 views
0

Я в настоящее время написания инструмент для управления определенных статей, технической документации, ...Laravel всегда перенаправляет определенные маршруты

Каждая статья имеет номер детали, который всегда в формате xxxx-xxx-xx, где x является цифрой , В настоящее время моя маршрутизация осуществляется следующим образом:

admin/{partnumber}  (List all documentation entries) 
admin/{partnumber}/new (New documentation entry) 
admin/{partnumber}/edit (Edit the article itself) 
admin/{partnumber}/{id} (Edit the documentation with the given id for the article) 

Где partnumber должно соответствовать следующему регулярному выражению:

(\d{4}-\d{3}-\d{2}|\d{9}) 

Это, так что я не обязательно должен ввести в тире. Однако, чтобы мои URL-адреса выглядели немного проще и сделали их более понятными, я бы хотел автоматически перенаправить введенный URL-адрес, но добавьте тире.

example.com/admin/123456789  => example.com/admin/1234-567-89 
example.com/admin/123456789/new => example.com/admin/1234-567-89/new 
... 

Я полагал, что я мог бы создать маршрут для \d{9} отдельно, как следующее:

Route::get('admin/{partnumber}', 
      '[email protected]') 
     ->where('partnumber', '\d{9}'); 

А затем выполнить переадресацию в функции этого контроллера. Однако это будет работать только для admin/{partnumber}, а не для любого другого маршрута.

Я не могу придумать, как это сделать, за исключением того, что каждая функция для всех маршрутов дважды, раз только для перенаправления. Это кажется мне немного подробным и не может быть решением.

Еще одна идея, которую я имел, заключалась в создании промежуточного программного обеспечения для указанных маршрутов и перенаправления на маршруты, но с разными параметрами. Но это не похоже на хороший вариант использования промежуточного программного обеспечения, на мой взгляд.

Я что-то упустил? Это вообще возможно?

+1

Почему бы не использовать простой .htaccess, переписывающий такие URL-адреса? Вы попробовали это? – Luceos

+0

@ Luceos Я раньше не думал об этом, но попробую. Было бы здорово, если бы я мог указать его в самом Laravel, хотя, не касаясь '.htaccess'. Делает это более склонным к ошибкам из-за другого файла, который я не регулярно проверяю, изменяю ли я маршруты. – Padarom

+0

Я понимаю, но это лучше подходит для ваших нужд. Я считаю, что сравнение одного правила htaccess с несколькими определениями маршрутов хорошо * shrug * – Luceos

ответ

0

Что я буду делать, когда абсолютно желая исправить это в Laravel является создание промежуточного программного, например PartnumberMiddleware:

<?php 

namespace App\Http\Middleware; 

use Closure; 

class PartnumberMiddleware 
{ 
    /** 
    * Run the request filter. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     if (preg_match('/^(?<number>[\d]{18})$/', $request->input('partnumber'), $matches) { 
      $partnumberIn = preg_split('/^\d{4}\d{3}\d{2}\d{9}$/', $matches['number']); 
      $partnumberMutated = implode('-', $partnumberIn); 
      return redirect()->route($request->route()->getActionName(), array_merge($request->route()->parameters(), ['partnumber' => $partnumberMutated])); 
     } 

     return $next($request); 
    } 

} 

Не тестировался, и вы должны заполнить пробелы. Но это должно работать после регистрации промежуточного программного обеспечения.

Добавлена ​​мутация в партию номера, добавлена ​​возможность получения маршрута из объекта запроса.

+0

@padarom это помогает? – Luceos

Смежные вопросы