Получить поддомен в поддомене-маршрут (Laravel)

Я создаю приложение, в котором поддомен указывает на пользователя. Как я могу получить поддомен-часть адреса в другом месте, чем в маршруте?

Route::group(array('domain' => '{subdomain}.project.dev'), function() {

    Route::get('foo', function($subdomain) {
        // Here I can access $subdomain
    });

    // How can I get $subdomain here?

});

Я построил грязную работу вокруг, хотя:

Route::bind('subdomain', function($subdomain) {

    // Use IoC to store the variable for use anywhere
    App::bindIf('subdomain', function($app) use($subdomain) {
        return $subdomain;
    });

    // We are technically replacing the subdomain-variable
    // However, we don't need to change it
    return $subdomain;

});

причина, по которой я хочу использовать переменную вне маршрута,-это установить соединение с базой данных на основе этой переменной.

5 ответов


сразу после этот вопрос был задан, Laravel реализовал новый метод для получения поддомена внутри кода маршрутизации. Его можно использовать так:

Route::group(array('domain' => '{subdomain}.project.dev'), function() {

    Route::get('foo', function($subdomain) {
        // Here I can access $subdomain
    });

    $subdomain = Route::input('subdomain');

});

См. Раздел "Доступ К Значению Параметра Маршрута"в документах.


$subdomain вводится в фактическое Route обратный вызов, он не определен внутри group закрытие, потому что Request еще не был проанализирован.

Я не понимаю, почему вам нужно, чтобы он был доступен внутри закрытия группы но вне фактического Route обратный.

если вы хотите, чтобы он был доступен везде, как только Request был проанализирован, вы можете настроить фильтр after для хранения $subdomain значение:

Config::set('request.subdomain', Route::getCurrentRoute()->getParameter('subdomain'));

обновление: применение группового фильтра для настройки подключения к базе данных.

Route::filter('set_subdomain_db', function($route, $request)
{
    //set your $db here based on $route or $request information.
    //set it to a config for example, so it si available in all
    //the routes this filter is applied to
    Config::set('request.subdomain', 'subdomain_here');
    Config::set('request.db', 'db_conn_here');
});

Route::group(array(
        'domain' => '{subdomain}.project.dev',
        'before' => 'set_subdomain_db'
    ), function() {

    Route::get('foo', function() {
        Config::get('request.subdomain');
    });

    Route::get('bar', function() {
        Config::get('request.subdomain');
        Config::get('request.db');
    });
});

попробуйте это, потому что все способы abouve не работают в Laravel 5.4

$domain = array_first(explode('.', \Request::getHost()));

в маршруте называют

$route = Route::getCurrentRoute();

и теперь у вас должен быть доступ ко всему, что имеет маршрут. Т. е.

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

вы можете сделать так для laravel 5:

public function methodName(Request $request) {
  $subDomain = $request->route()->parameter('subdomain');
}