Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在laravel 4中使用子域?_Laravel_Laravel 4 - Fatal编程技术网

如何在laravel 4中使用子域?

如何在laravel 4中使用子域?,laravel,laravel-4,Laravel,Laravel 4,我希望在我的L4网站中的routes.php中检测子域,并希望将该子域值存储在某个位置,以便我可以在每个控制器中访问该值 我该怎么做? 请帮助 您可以使用请求在任何地方获取域 因此,创建一个BaseController并添加一个方法以获取所有扩展控制器上的当前域: class BaseController extends Controller { public function getDomain() { return Request::getHost();

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

我该怎么做? 请帮助


您可以使用请求在任何地方获取域

因此,创建一个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文件(这只是一个示例),并在其中添加此helper函数:

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();

或者您也可以通过创建一个类和一个静态函数(不太可测试)来实现同样的功能。

您可以将这种类型的方法放入路由中。但是,我认为它更适合于“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过滤器的更多信息:


我的Laravel 4.2正在开发中

在您的路由文件中:

Route::group(['domain' => '{subdomain}.myapp.com'], function()
{
    Route::get('/', function($subdomain)
    {
        return "Your subdomain is: ".$subdomain;
    });
});
在控制器或任何位置获取子域:

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

是的,这是一种方法,您可以在任何控制器中作为参数访问子域,但我想在routes.php中检测子域,并将其存储在会话或其他机制中,以便我可以在任何地方访问它。然后在
app/start/global.php中执行此操作。这个方法对我不起作用,因为我想在routes.php中检测子域,并将其存储在会话或其他机制中,这样我就可以在任何地方访问它。
$subdomain = Route::getCurrentRoute()->getParameter('subdomain');