我想在我的 L4 网站中检测 routes.php 中的子域,并希望将该子域值存储在某处,以便我可以在每个控制器中访问该值。
我怎样才能做到这一点 ?请帮忙
http://laravel.com/docs/routing#sub-domain-routing
Route::group(array('domain' => '{account}.myapp.com'), function() {
Route::get('user/{id}', function($account, $id) {
//
});
});
您可以将这种类型的方法放在路由中。但是,我认为它更适合“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();
}
}
当然,这个控制器示例假设您有一个域模型:
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": {
"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();
或者您可以通过创建一个类并创建一个静态函数(不太可测试)来做同样的事情。
这正在我的 Laravel 4.2 上工作。
在您的路线文件中:
Route::group(['domain' => '{subdomain}.myapp.com'], function()
{
Route::get('/', function($subdomain)
{
return "Your subdomain is: ".$subdomain;
});
});
在您的控制器或任何地方获取子域:
$subdomain = Route::getCurrentRoute()->getParameter('subdomain');