Laravel – Использование (: any?) Шаблона для ВСЕХ маршрутов?

У меня проблемы с маршрутизацией.

Я работаю над CMS, и мне нужны два основных маршрута. /admin и /(:any) . Контроллер admin используется для маршрута /admin , а контроллер view должен использоваться для чего-либо еще, кроме /admin . Из контроллера view я проанализирую URL и покажу правильное содержимое.

Это то, что у меня есть:

 Route::get(array('admin', 'admin/dashboard'), array('as' => 'admin', 'uses' =>'admin.dashboard@index')); Route::any('(:any)', 'view@index'); 

Первый маршрут работает, а второй – нет. Я немного поиграл с ним, и кажется, что я использую (:any) без вопросительного знака, он работает только, если я что-то ставил после / . Если я поставлю вопросительный знак там, он вообще не работает.

Я хочу, чтобы все следующие маршруты переходили к view @ index:

 / /something /something/something /something/something/something /something/something/something/something ...etc... - / /something /something/something /something/something/something /something/something/something/something ...etc... - / /something /something/something /something/something/something /something/something/something/something ...etc... - / /something /something/something /something/something/something /something/something/something/something ...etc... - / /something /something/something /something/something/something /something/something/something/something ...etc... - / /something /something/something /something/something/something /something/something/something/something ...etc... - / /something /something/something /something/something/something /something/something/something/something ...etc... - / /something /something/something /something/something/something /something/something/something/something ...etc... 

Возможно ли это без жесткого кодирования куча (:any?)/(:any?)/(:any?)/(:any?) (Который я даже не знаю, работает)?

Каков наилучший способ сделать это?

    Изменить: с момента выпуска Laravel 4 по этой теме произошла некоторая путаница, этот ответ был нацелен на Laravel 3.

    Есть несколько способов приблизиться к этому.

    Первый метод – это сопоставление (:any)/(:all?) :

     Route::any('(:any)/(:all?)', function($first, $rest=''){ $page = $rest ? "{$first}/{$rest}" : $first; dd($page); }); 

    Не лучшее решение, потому что оно разбивается на несколько параметров и по какой-то причине (: все) не работает само по себе (ошибка?)

    Второе решение – использовать регулярное выражение, это лучше, чем выше, на мой взгляд.

     Route::any( '(.*)', function( $page ){ dd($page); }); 

    Существует еще один метод, который позволит вам проверить, есть ли страницы cms, даже если маршрут может соответствовать другим шаблонам, если эти маршруты возвращают 404. Этот метод изменяет прослушиватель событий, определенный в routes.php :

     Event::listen('404', function() { $page = URI::current(); // custom logic, else return Response::error('404'); }); 

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

    Нападение на статус 404 кажется мне немного неправильным. Это может привести к возникновению любых проблем при регистрации 404-х. Недавно я столкнулся с той же проблемой маршрутизации подстановочных знаков в Laravel 4 и решил ее с помощью следующего фрагмента:

     Route::any('{slug}', function($slug) { //do whatever you want with the slug })->where('slug', '([Az\d-\/_.]+)?'); 

    Это должно решить вашу проблему контролируемым образом. Регулярное выражение может быть упрощено до:

     '(.*)?' 

    Но вы должны использовать это на свой страх и риск.

    Редактировать (добавить):

    Поскольку это перезаписывает много маршрутов, вам следует рассмотреть возможность их переноса в инструкции «App :: before»:

      App::before(function($request) { //put your routes here }); 

    Таким образом, он не будет перезаписывать пользовательские маршруты, которые вы определяете позже.

    Laravel 5

    Это решение отлично работает на Laravel 5:

     Route::get('/admin', function () { // url /admin }); Route::get('/{any}', function ($any) { // any other url, subfolders also })->where('any', '.*'); 

    Люмен 5

    Это для Люмена:

     $app->get('/admin', function () use ($app) { // }); $app->get('/{any:.*}', function ($any) use ($app) { // }); 

    Добавьте это в конец файла маршрутов

     App::missing(function($exception) { return View::make('notfound'); }); 

    от http://scotch.io/tutorials/simple-and-easy-laravel-routing

    Спасибо за решение William. Однако методы 1 и 2 больше не работают Laravel 4, и для использования решения № 3 в Laravel 4 вам нужно будет запустить событие 404 в файле start / global.php.

     App::error(function(Exception $exception, $code) { // io -> this is our catchall! // http://stackoverflow.com/questions/13297278/laravel-using-any-wildcard-for-all-routes Event::fire('404'); return View::make('error')->with('exception', $exception)->with('code', $code); Log::error($exception); }); 

    Теперь мы можем справиться с этим в нашем файле routes.php:

     Event::listen('404', function() { // url? $url = Request::path(); // LOGIC HERE // else return View::make('error'); }); 
     Route::get("{path}", "SomeController@serve")->where('path', '.+'); 

    В приведенном выше коде будут учтены рекурсивные юниты, которые вы упомянули:

     / /something /something/something /something/something/something /something/something/something/something - / /something /something/something /something/something/something /something/something/something/something - / /something /something/something /something/something/something /something/something/something/something - / /something /something/something /something/something/something /something/something/something/something 

    Любые другие особые случаи, такие как admin / *, вы можете захватить перед этим.