Zend маршрутизация — использовать поддомен / домен в качестве контроллера

В настоящее время у меня есть такой маршрут, определенный и работающий:

    $route = new Zend_Controller_Router_Route
(
':token/:place/:controller/:action/*',
array
(
'module'         => 'admin',
'controller'     => 'public',
'action'         => 'list',
'token'          => 'default_company',
'place'          => 'default_place'
),
array
(
'token'  => '[a-z_]+',
'place'  => '[a-z_]+'
)
);
$router->addRoute('admin', $route);

Таким образом, URL в приложении может быть myserver.com/google/europe/public/list

Клиенту нужны две дополнительные опции для доступа к одной и той же странице:
google.myserver.com/europe и google.com/europe

Все DNS будут обработаны и Apache будет настроен. В настоящее время мне нужно создать шаблоны для обработки этих маршрутов, но я не знаю, как мне извлечь поддомен и / или домен, используя его в качестве параметров И скрыть контроллер / действие (каким-то образом сделать их по умолчанию) при начальной загрузке. Может, делал это раньше и мог бы помочь?

Я создал такой шаблон для google.myserver.com/europe, но, похоже, он не решает проблему:

    $route = new Zend_Controller_Router_Route
(
':token.*.*/:place/*',
array
(
'module'              => 'admin',
'controller'          => 'public',
'action'              => 'list',
'token'               => '',
'place'               => ''
),
array
(
'token'  => '[a-z_]+',
'place'  => '[a-z_]+'
)
);
$router->addRoute('subdomain_route', $route);

Спасибо за любые указания, что я делаю не так.

1

Решение

Я нашел ответ, просто поделюсь, если кому-то это нужно. Я создал помощник, который я использую в контроллерах init (), чтобы получить organization_token и place_path. Он в значительной степени анализирует различные случаи URL и возвращает параметры:

public static function getOrganizationTokenAndPlacePath($token, $path)
{
$url = explode('.', $_SERVER['HTTP_HOST']);
$params = explode('/', $_SERVER['REQUEST_URI']);
$subdomain = $url[0];
$domain = $url[1];
$parsed = array();
if (($token == 'default_token' || $path == 'default_place') && $domain == DEFAULT_APP_DOMAIN){
// Case http://organization_token.domain.com/place_path/
$parsed['token'] = $subdomain;
$parsed['path'] = $params[1];
//die('Case1');
}
else if(($token == 'default_token' || $path == 'default_place') && $domain != DEFAULT_APP_DOMAIN){
// Case http://some_subdomain.organization_token.com/place_path/
$parsed['token'] = $domain;
$parsed['path'] = $params[1];

// If place_path is not found, try to get the last entered place_path from the database
if ($parsed['path'] == ''){
$organization_model = new Admin_Model_Organization();
$organization = $organization_model->getOrganizationByToken($parsed['token']);
$places = $organization_model->getOrganizationPlaces($organization['organization_id']);
if (sizeof($places) > 0){
$last_added_place = array_pop($places);
$parsed['path'] = $last_added_place['place_path'];
}
}

//die('Case2');
}
else if ($domain != DEFAULT_APP_DOMAIN && $subdomain == 'www'){
// Case http://www.organization_token.com/some_param/place_path/
$parsed['token'] = $domain;
$parsed['path'] = $params[2];
//die('Case3');
}
else{
// Case http://subdomain.domain.com/organization_token/place_path/
$parsed['token'] = $token;
$parsed['path'] = $path;
//die('Case4');
}

return $parsed;
}

Надеюсь, это поможет кому-то

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]