【问题标题】:Laravel - Subdomain localizationLaravel - 子域本地化
【发布时间】:2014-06-26 22:40:27
【问题描述】:

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

<?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 的内容?

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

【问题讨论】:

    标签: php laravel laravel-4 routing


    【解决方案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()
    {
        ...
    }
    

    【讨论】:

    • 应该是if(!in_array($subdomain, Config:.get('app.countries.available')))
    • 修复中没有错误吗? Config:.get('app 应该是 Config::get('app
    【解决方案2】:

    对于语言指示符是子域名第一部分的子域,例如:en.domain.com/section 这是我在 laravel 5.1 中使用的

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

    app\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'],
    

    找到变量

    最后,将其添加到路线中

    app\Http\routes.php:

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

    【讨论】:

    • 看起来过滤器实际上已经折旧,因此需要将其重新编写为中间件。过滤器的好处在于,将其包含在 routes.php 文件中而不是其他位置似乎是一种做法。
    【解决方案3】:

    在你的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');
    });
    

    抱歉,我没有测试过。

    【讨论】:

    • 很好的答案,谢谢。语法也很清晰。但有一件事, ->getParemeter('subdomain') 应该是 ->getParameter('locale')
    • @xonorageous 真的,我们应该使用-&gt;getParemeter('locale')?我认为语言环境是指用于翻译的语言。但是,如果您设置有关子域的语言环境,那应该很好。谢谢指出!
    猜你喜欢
    • 2019-03-19
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 2022-10-15
    • 2019-03-04
    • 1970-01-01
    相关资源
    最近更新 更多