Laravel路由到多域

时间:2014-04-03 03:20:59

标签: php laravel laravel-routing

我创建了一个平台,以支持平台下的多个网站,有些网站需要有不同的域名。

最常见的是使用相同的域名:

myrootdomain.com/first_product/profile

myrootdomain.com/second_product/profile

在这些情况下,{first_product}和{second_product}将作为参数传递给几乎所有函数。 / first_product和/ second_product是在同一平台下运行的完全不同的网站。

但我需要创建另一个产品,我可以更改TLD,并且仍然可以将{anotherrootdomain}识别为我的函数的第一个参数。像这样:

anotherrootdomain.com/profile

我已经使用Route :: bind处理第一个参数。

<?php

Route::bind('short_url', function($value, $route)
{
    $product = Product::where('short_url', $value)->first();

    if(is_null($product))
        return false;
    return $product->id;
});

Route::get('/{short_url}/login', 'HomeController@login');
Route::get('/{short_url}/profile', 'UserController@profile');

现在我不知道如何:

1)寻找域名

2)使用域作为第一个参数

我知道我的英语很糟糕,但我希望你能帮助我!


编辑:

我可以在routes.php上执行类似的操作:

if($_SERVER['HTTP_HOST'] == "anotherrootdomain.com")
    $tld = "anotherrootdomain";

然后我需要从中获得机会:

Route::get('/{short_url}/login', 'HomeController@login');
Route::get('/{short_url}/profile', 'UserController@profile');

对此:

Route::get('/login', 'HomeController@login');
Route::get('/profile', 'UserController@profile');

我可以使用简单的if来做,但现在我无法在我的路线上传递参数! HomeController @ login需要一个参数,我需要传递$ tld变量,但我不知道怎么做!

1 个答案:

答案 0 :(得分:4)

我意识到了这样做的方法!

让我们说示例中的my / second_product需要使用其他TLD访问,例如&#34; awesomeproduct.com&#34;。有些网址需要偶然:

myrootdomain.com/second_product/login =&gt; awesomeproduct.com/login

myrootdomain.com/second_product/profile =&gt; awesomeproduct.com/profile

虽然first_product仍然只是第一种方式:

<强> myrootdomain.com/first_product/login

<强> myrootdomain.com/first_product/profile

为了实现这一目标,我创建了一个包含子域的路由组(我不知道我也可以在TLD上使用通配符):

Route::group(array('domain' => '{short_url}.com'), function($short_url)

我改变了一点我的Route :: bind来改变{short_url}参数:

Route::bind('short_url', function($value, $route)
{
    if($value == "awesomeproduct")
        $value = "second_product";

    $product = Product::where('short_url', $value)->first();

    if(is_null($product))
        return false;
    return $product->id;
});

最后,我需要更改我的路线以使用或不使用{short_url}:

$tld = "";
if($_SERVER['HTTP_HOST'] != "testefacop.com")
    $tld = "{short_url}/";

Route::get('/'.$tld.'login', 'HomeController@login');
Route::get('/'.$tld.'profile', 'UserController@profile');

这是我的完整routes.php:

<?php

Route::bind('short_url', function($value, $route)
{
    if($value == "awesomeproduct")
        $value = "second_product";

    $product = Product::where('short_url', $value)->first();

    if(is_null($product))
        return false;
    return $product->id;
});

Route::group(array('domain' => '{short_url}.com'), function($short_url)
{
    $tld = "";
    if($_SERVER['HTTP_HOST'] != "awesomeproduct.com")
        $tld = "{short_url}/";

    Route::get('/'.$tld.'login', 'HomeController@login');
    Route::get('/'.$tld.'profile', 'UserController@profile');

}

它不是一个伟大而美丽的解决方案,但它按预期工作!