Laravel - 子域本地化

时间:2014-05-09 08:53:48

标签: php laravel laravel-4 routing

我想使用子域设置本地化。我已经设法建立子域名通配符,它​​工作正常。但是我想设置过滤器。 例如,我在考虑在配置中设置一系列可用国家/地区:

<?php

return array(

    'available' => array(
        'uk',
        'fr',
        'de'
    )

);

然后在我的路线中,我需要一种过滤组的方法。目前我的代码如下,没有任何过滤器:

<?php

$homeController = 'MembersController@profile';

if ( ! Sentry::check())
{
    $homeController = 'HomeController@index';
}

Route::group(['domain' => '{locale}.'.Config::get('app.base_address')], function() use ($homeController)
{
    Route::get('/', ['as' => 'home', 'uses' => $homeController]);

    Route::post('users/register', ['as' => 'register', 'uses' => 'UsersController@register']);
    Route::resource('users', 'UsersController');
});

有没有人有任何过滤该组的想法?

此外,如果子域无效,我如何重定向到uk.domainname.com之类的内容?

提前感谢您的帮助,非常感谢。

3 个答案:

答案 0 :(得分:1)

您可以使用过滤器在路线中解决此问题,该过滤器将首先执行。然后检查可用的子域,如果找不到,则重定向到默认的子域。

Route::filter('subdomain', function()
{
    $subdomain = current(explode('.', Request::url()));
    if (!in_array($subdomain, Config::get('app.countries.available'))) {
        return Redirect::to(Config::get('app.default_subdomain') . '.' . Config::get('app.base_address'));
    }
});

Route::group(['before' => 'subdomain'], function()
{
    ...
}

答案 1 :(得分:1)

在你的app/filters.php我会写这样的东西。您将在配置中使用子域数组创建名为availableSubdomains的新变量。

<?php
Route::filter('check_subdomain', function()
{
    $subdomain = Route::getCurrentRoute()->getParameter('subdomain');
    if (!in_array($subdomain, Config::get('app.availableSubdomains')))
        return Redirect::home();
});

然后我会在app/routes.php

中的小组路线中添加一个前置过滤器
<?php
Route::group(
    ['domain' => '{locale}.'.Config::get('app.base_address'),
    'before' => 'check_subdomain']
, function() use ($homeController)
{
    Route::get('/', ['as' => 'home', 'uses' => $homeController]);

    Route::post('users/register', ['as' => 'register', 'uses' => 'UsersController@register']);
    Route::resource('users', 'UsersController');
});

抱歉,我还没有测试过它。

答案 2 :(得分:0)

对于子域名,其中语言标识符是子域名的第一部分,例如:en.domain.com/section这里是我用于laravel 5.1的内容

这使用了getHost,避免了http / https首次出现的问题

  

应用\ HTTP \ routes.php文件:

Route::filter('subdomain', function() {
  $locale_url = current(explode('.', Request::getHost()));
  if (!in_array($locale_url, Config::get('app.countries_available'))) {
  return Redirect::to(Config::get('app.default_subdomain') . '.' . Config::get('app.base_address'));
  }
  App::setLocale($locale_url);
});

有必要添加以下内容:

 config/app.php:  
     'countries_available' => ['en','es'],

找到变量

最后,将其添加到路线

  

应用\ HTTP \ routes.php文件:

Route::group(['before' => 'subdomain'], function()
{
  Route::get('/', 'control@func');  
  ...
});