如何在laravel 4中使用子域?

时间:2013-10-23 12:21:02

标签: laravel laravel-4

我想在L4网站的routes.php中检测子域,并希望将该子域值存储在某处,以便我可以在每个控制器中访问该值。

我该怎么做? 请帮忙

4 个答案:

答案 0 :(得分:11)

http://laravel.com/docs/routing#sub-domain-routing

Route::group(array('domain' => '{account}.myapp.com'), function() {
    Route::get('user/{id}', function($account, $id) {
        //
    });
});

答案 1 :(得分:8)

您可以将此类方法放在路线中。但是,我认为它更适合'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过滤器:

http://laravel.com/docs/routing#route-filters

答案 2 :(得分:4)

您可以使用“请求”在任何地方获取您的域名。

因此,创建一个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();

或者你可以通过创建一个类并创建一个静态函数(不太可测试)来做同样的事情。

答案 3 :(得分:0)

现在正在使用我的Laravel 4.2。

在您的路线文件中:

Route::group(['domain' => '{subdomain}.myapp.com'], function()
{
    Route::get('/', function($subdomain)
    {
        return "Your subdomain is: ".$subdomain;
    });
});

在控制器或任何地方获取子域名:

$subdomain = Route::getCurrentRoute()->getParameter('subdomain');