Laravel-использование (: любой?) замена всех маршрутах?

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

я работаю над CMS, и мне нужны два основных маршрута. /admin и /(:any). The 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) без знака вопроса, он работает только если я положил что-то после /. Если я ... --19-- > do поставьте там знак вопроса, он вообще не работает.

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

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

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

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

7 ответов


Edit: после выпуска 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. Надеюсь, это поможет. Что бы вы ни делали, убедитесь, что вы определяете все ваши другие маршруты выше этих поймать все маршруты, любые маршруты, определенные после никогда не будет спусковой крючок.


фреймворк 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) {
  //
});

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

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

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

'(.*)?'

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

изменение (дополнение):

As это перезаписывает много маршрутов, вы должны рассмотреть возможность упаковки его в" App::before " заявление:

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

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


Route::get("{path}", "SomeController@serve")->where('path', '.+');

приведенный выше код захватит рекурсивные под-urls, которые вы упомянули:

/
/something
/something/something
/something/something/something
/something/something/something/something

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


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

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

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


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

App::error(function(Exception $exception, $code)
{
    // i.o. -> 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);
});

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

Event::listen('404', function() {
    // url?
    $url = Request::path();

    // LOGIC HERE

    // else
    return View::make('error');
});

имеющ основные леса люмена. В моем случае у меня есть 2 frontend apps и api routes

<?php // routes/web.php
/** @var \Laravel\Lumen\Routing\Router $router */

$router->group([
    'prefix' => '/api/v1',
    'namespace' => 'App\Http\Controllers'
], function () use ($router) {

    require 'routes-group1.php';
    require 'routes-group2.php';
    // ...
});

$router->get('/admin{any:.*}', function () {
    return file_get_contents('../public/a/index.html');
});

$router->get('{any:.*}', function () {
    return file_get_contents('../public/m/index.html');
});