L4 Web サイトの routes.php でサブドメインを検出し、そのサブドメインの値をどこかに保存して、各コントローラーでその値にアクセスできるようにしたいと考えています。
どうやってやるの ?助けてください
このタイプのメソッドをルートに入れることができます。ただし、「app/filters.php」ファイルのフィルターには適していると思います。これを試して:
Route::filter('getSubdomain', function($route, $request)
{
$host = $request->getHost();
$parts = explode('.', $host);
$subdomain = $parts[0];
// Store subdomain in session
Session::put('subdomain', $subdomain);
});
次に、次のようにフィルターをルート (おそらくグループ ルート) に追加します。
Route::group(array('before' => 'getSubdomain'), function()
{
... add route stuff here ..
});
Laravel フィルターの使用方法の詳細については、こちらをご覧ください。
Request を使用して、どこでもドメインを取得できます。
そのため、BaseController を作成し、すべての拡張コントローラーで現在のドメインを取得するメソッドを追加します。
class BaseController extends Controller {
public function getDomain()
{
return Request::getHost();
}
}
そしてそれを使用します:
class PostsController extends BaseController {
public function store()
{
$post = new Post;
$post->domain_id = Domain::where('name', $this->getDomain())->first()->id;
$post->save();
}
}
もちろん、このコントローラーの例では、Domain モデルがあることを前提としています。
class Domain extends Eloquent {
private $table = 'domains';
}
編集:
非常に正当な理由がない限り、ルートを使用したり、サブドメインをセッションに保存したりする必要はありません。これに本当に正当な理由がない限り、それは臭いです。Laravel のコードを見てください。Laravel のセッションだけが保存されています。
ヘルパー関数を作成できます。
app/helpers/functions.php ファイル (これは単なる例です) を作成し、このヘルパー関数をそこに追加します。
function getCurrentSubdomain()
{
$domain = Config::get('app.domain');
preg_match("/^(.*)(\.$domain)$/", Request::getHost(), $parts);
return $parts[1];
}
app/config/app.php を開き、ドメイン構成を追加します。
return array(
'domain' => 'myapp.com',
...
);
ファイルを composer.json の autoload セクションに追加します。
"autoload": {
"classmap": [
...
],
"files": [
"app/helpers/functions.php"
]
},
その後、コントローラー、クラス、ルーターなど、どこでも使用できます。これを使用した前と同じ例を次に示します。
class PostsController extends BaseController {
public function store()
{
$post = new Post;
$post->domain_id = Domain::where('name', getCurrentSubdomain())->first()->id;
$post->save();
}
}
クラスとその Facade を作成することもできるので、Laravel のようにどこからでもこのクラスを呼び出すことができます。
Helper::getCurrentSubdomain();
または、クラスを作成して静的関数を作成するだけで同じことができます (テストしにくい)。