2016-01-18 1 views
5

ルートグループを使用せずにすべてのアプリルートの複数のロケールを作成する方法を探しています。これは、外部拡張パッケージを使用しているためです。これは、ルートが多くの場所に登録されていることを意味します。Laravel 5.0。*ルートが処理される前に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

私はあなたが何をしているのか簡単に知ることができませんでした。私は何かを見逃しているかもしれませんが、私はlaravelとsymfonys Requestクラスの両方を調べました。残念ながら、私は何の価値も見つけられませんでした。つまり、インデックス内のリクエストをインターセプトできます。PHPファイルをパブリックフォルダ内に作成し、リクエストオブジェクトを作成する前に '$ _SERVER [" REQUEST_URI "]'をセットすると動作します。 –

+0

私はindex.phpファイル内ですばやく試しました。つまり、Laravelに到達する前にサーバー変数を編集できます。しかし、私はロケールなどのconfigsを使用するように病気の必要があると思う。 – 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()と互換性があります。 コンストラクタを使用してアプリケーションを渡しましたインスタンスを作成し、$ app-> requestを使用しました。しかし、私はまだ何かを実際に変更することはできません。ルートはまだ同じように扱われています – 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が編集できなくする原因となるいくつかの理由で最初の意志複製せずにRequestのインスタンスからのパスを取得する、注意することは。あなたがpath()メソッドを呼び出すと、コードベースのどこかでlaravelが要求を初期化していると仮定します。

+0

ルーメンでこれを行う方法はありますか? –

0

これは実際に5.5で私のために働いたことはありません。アプローチは良いですが、私にとってはリクエスト引数がregisterメソッドに注入されなかったのと同様に、instance()は静的メソッドではなく、そのように呼び出されるべきではありません。

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

私はこれが誰かの役に立てば幸い:それはServiceProviders registerメソッド内で解析される前に

はしかし、RequestのインスタンスをAQUIREするサービスコンテナを使用すると、要求のパスを変更することが可能になりました!

乾杯

編集:彼は、実際のクラスの代わりにファサードを使用して牧師の答えは、技術的に正しいです。しかし、どちらの注射もregisterに作用しますが、代わりに次のものを使用することができます。

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