2016-01-18 2 views
5

Я ищу способ сделать все маршруты приложений несколькими локалями без использования групп маршрутов. Это связано с тем, что я использую пакет внешних расширений, что означает, что маршруты регистрируются во многих местах.Laravel 5.0. * Промежуточное программное обеспечение для удаления языка prefix из URL-адреса до того, как маршруты обрабатываются

По существу, я хочу иметь/foo/bar, а также/en/foo/bar,/de/foor/bar,/es/foo/bar и т. Д. Все, чтобы их распознавали и обрабатывали по маршруту/foot/bar

Route::get('foo/bar', function() { 
    return App::getLocale() . ' result'; 
}); 

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

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

... 
    $newPath = str_replace($locale,'',$request->path()); 

    $request->server->set('REQUEST_URI',$new_path); 

} 

return $next($request); 

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

EDIT ------

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

$application_url_segments = explode('/', trim($_SERVER["REQUEST_URI"], '/')); 

$application_locale = $application_url_segments[0]; 

$application_locales = ['en' => 'English', 'de' => 'German']; 

if (array_key_exists($application_locale, $application_locales)) { 

    $_SERVER["REQUEST_URI"] = str_replace('/' . $application_locale,'',$_SERVER["REQUEST_URI"]); 

} 
+0

я не смог лично найти что-нибудь, чтобы easilly делать то, что вы после этого. Возможно, я что-то пропустил, но я просмотрел как класс laravel, так и symfonys Request. К сожалению, я не нашел ничего ценного. При этом вы можете перехватить запрос в индексе.php в общей папке, а затем установите '$ _SERVER [" REQUEST_URI "]' перед созданием объекта запроса, и он будет работать. –

+0

Я быстро попробовал что-то в файле index.php, что означает, что я могу редактировать переменную сервера до того, как он попадет в Laravel. Однако мне кажется, что мне нужно что-то лучше, поскольку я использую конфиги для локалей и т. Д. – Ben

+0

У меня такая же проблема, и я не могу заставить ее работать. Кажется, объект 'Request' является неизменным. Я также установил быстрый взлом в index.php, но я также использую URI для локалей и т. Д., Поэтому все еще исследую. – Pbal

ответ

1

Вы можете легко достичь этого, подключившись к приложению немного раньше. Создайте ServiceProvider и создайте метод register и разместите там свою логику.

<?php namespace App\Providers; 

use Illuminate\Support\ServiceProviders; 
use Illuminate\Support\Facades\Request; 

class LocaleServiceProvider extends ServiceProvider { 

    // Fires during the registration of this ServiceProvider :) 
    public function register(Request $request) { 

     // Altar the Request object here 
     // ... 
     // ... 

    } 
} 
+0

Это не сработало. Я получил ошибку из-за следующей ошибки LocaleServiceProvider :: register (Illuminate \ Http \ Request $ request) должен быть совместим с Illuminate \ Support \ ServiceProvider :: register() Я использовал contructor для передачи в приложении экземпляр и использовать запрос $ app->. Однако - я все еще не могу заставить его фактически что-либо изменить. Маршрут по-прежнему обрабатывается одинаково. – Ben

+0

. Я сделал редактирование исходного вопроса/подробно выше, если это помогает. – Ben

2

Вот правильный код для редактирования URL до того, как маршруты будут вызваны.

<?php namespace App\Providers; 
use Illuminate\Foundation\Application; 
use Illuminate\Support\ServiceProvider; 
use Illuminate\Support\Facades\Request; 

class LanguageServiceProvider extends ServiceProvider { 
    public function register() { 
     Request::instance()->server->set('REQUEST_URI',"/uri/"); 
    } 
} 

Отметим, что выборка путь от экземпляра запроса, не дублируя его сначала по каким-то причинам вызывают REQUEST_URI не доступны для редактирования. Я предполагаю, что где-то в кодовой базе laravel инициализирует запрос, когда вы вызываете метод path().

+0

Есть ли способ сделать это в Lumen? –

0

Ничего из этого на самом деле не работало для меня с 5.5. Этот подход хорош, но для меня аргумент запроса не вводился в метод register, так же instance() не является статическим методом и не должен вызываться как таковой.

Однако, используя контейнер службы для aquire экземпляра Request позволило изменить запрос-путь, прежде чем он обрабатывается внутри ServiceProviders register метод:

public function register() 
{ 
    $this->app->make('Illuminate\Http\Request')->instance()->server->set('REQUEST_URI',"/what/ever/"); 
} 

Я надеюсь, что это помогает кто-то!

Приветствие

редактировать: ответ пастора является технически более правильным, поскольку он использует фасад вместо фактического класса. Однако нагнетание ни работ по register, но в качестве альтернативы вы можете использовать:

use \Illuminate\Support\Facades\Request 
//... 
public function register() 
{ 
    Request::instance()->server->set('REQUEST_URI',"/what/ever/"); 
}