Маршрут имени хоста Zend Framework с подкаталогом - PullRequest
0 голосов
/ 20 сентября 2011

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

$portalurl = str_replace( 'http://', '', $config->domains->portal );

$hostnameRoute = new Zend_Controller_Router_Route_Hostname(
    $portalurl,
    array( 'module' => 'portal' )
);

$defaultroute = new Zend_Controller_Router_Route(
    ':controller/:action',
    array(
        'controller' => 'index',
        'action' => 'index'
    )
);

$contentroute = new Zend_Controller_Router_Route(
    'page/:page',
    array(
        'controller'=> 'content',
        'action' => 'show'
    )
);

$router->addRoute( 'portalDefault', $hostnameRoute->chain($defaultroute) );
$router->addRoute( 'portalContent', $hostnameRoute->chain($contentroute) );

В моей тестовой системе мое приложение находится в подкаталоге типа / project / public, который прекрасно работает, когда я открываю модуль через домен, который я ввел в свой список хостов системы. domain.lan / проект / общественности. Теперь я хочу собрать URL через систему (перенаправление), и он собирает его без подкаталога.

$this->_redirect(
    $this->view->url(array(
        'action' => 'index',
        'controller' => 'index')
    ),
    array( 'prependBase' => false )
); 

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

Каков наилучший подход для этого?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2011

Иногда ZF не может правильно определить baseUrl (он не может быть великолепен во всем ...), поэтому нам нужно установить его вручную в начальной загрузке; Вы должны быть в состоянии сделать это в .ini, но у меня это не сработало.

Обратите внимание, что лучше поставить это прямо в начале _initView, прежде чем что-либо еще:

protected function _initView()
{
    // Set the Base URL (only needed sometimes)
    $front = Zend_Controller_Front::getInstance();
    $front->setBaseUrl( '/myapp/public' );
    //initialize view
    $view = new Zend_View...

Затем используйте baseUrl() для переноса связанных файлов и т. Д .: $this->baseUrl('css/template.css');

0 голосов
/ 20 сентября 2011

Вы должны указать свой «подкаталог» в конфигурации frontController (в вашем application.ini), он будет автоматически добавлен к сгенерированным URL-адресам.

resources.frontController.baseUrl = "/project/public"
...