2012-01-23 3 views
3

Это похоже на очень простой вопрос, но я нашел только сложные ответы. У меня есть приложение Zend Framework, которое требует от пользователей входа в систему. loginAction() и logoutAction() определены в AuthController. Я хочу разрешить пользователям регистрироваться через http://www.example.com/login, а не http://www.example.com/auth/login.Простые перезаписи в Zend Framework

Я знаю, что есть множество способов сделать это, 3 я во внимание:

  1. .htaccess переписать
  2. Создание LoginController и перенаправлять indexAction() авторизовать/Войти
  3. Определение собственных маршрутов с помощью Zend_Controller_Router_Rewrite.

Я бы предпочел сохранить его из № 1, если это возможно. # 2 достаточно легко понять, хотя кажется, что это взломать. Он также может загромождать код с помощью 5-строчных классов «Контроллер». Я думаю, что №3 - это путь, но я не совсем понимаю, как эффективно использовать его. Я пробовал Using Zend_Config with the RewriteRouter, хотя я только определил логин входа, поэтому каждая ссылка стала «/ login» (я думаю, что мне не хватало маршрут по умолчанию). Я сделал это в своем Bootstrap.php, я не уверен, что это было правильно.

Есть ли простой подход, который мне не хватает? Я неправильно использую # 3? Есть ли учебники для этого, которые я должен прочитать? (Я смотрел документацию Zend, которая хороша, но часто я спрашиваю: «Куда должен идти этот код: в контроллере, модели, бутстрапе, другом?»)

ответ

10

для определенной цели, например, у вас есть «названный» маршрут был бы самым простым способом сделать это. Хотя существует множество способов для реализации именованного маршрута проще всего поместить его в application.ini:

// /application/configs/application.ini 
    resources.router.routes.login.route = /login 
    resources.router.routes.login.defaults.module = default 
    resources.router.routes.login.defaults.controller = auth 
    resources.router.routes.login.defaults.action = login 

положить его в загрузчике не так, он просто не кажется, как convienient мне.
Также делать это так должен (без гарантий) предотвратить любые проблемы с маршрутами по умолчанию.

При вызове маршрута с помощью URL() помощник, важно помнить, чтобы использовать любой именованный маршрут:

<?php echo $this->url(array(), 'routeName') ?> 

или, если вам нужно передать нормальный «контроллер» => «действие» =>:

<?php echo $this->url(array('controller' => 'index', 'action' => 'index'), 'default') ?> 

рядом, как я могу сказать 'по умолчанию' в данном контексте означает, что это будет маршрут по умолчанию, как это определено в Zend/Controller/Router/маршрут/module.php

+0

В соответствии с вашими инструкциями Я добавил эти строки в свое приложение/configs/application.ini и перешел в/login отлично! Тем не менее, все ссылки на странице (которые сгенерированы в шаблоне макета с '$ this-> url (array ('controller' => 'foo', 'action' => 'bar'))) теперь/авторизоваться. Это происходит только на странице входа, однако ссылки (и маршруты) с домашней страницы и всех других контроллеров работают нормально. Есть предположения? – nachito

+1

Понял, что я должен использовать '$ this-> url (array ('controller' => 'foo', 'action' => 'bar'), 'default')'. Если второй параметр равен «null» (или опущен), тогда предполагается текущий маршрут. – nachito

3

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

Если у вас есть только один путь, чтобы переписать, просто добавить функцию:

protected function _initRoute() { 
    $router = Zend_Controller_Front::getInstance()->getRouter(); 
    $router->addRoute('login', //key of route ! 
     new Zend_Controller_Router_Route(
      'login', //this is url(www.url.com/login) that you want to rewrite, you can set whatever you want 
      array(
       'module' => 'default', 
       'controller' => 'auth', 
       'action' => 'login', 
      ) 
    )); 
} 

Теперь каждый www.your-url.com/ запрос Войти укажут www.your-URL.ком/по умолчанию/аутентификации/Логин (модуль/контроллер/действие)

Edit:


Если вы хотите использовать свой новый URL в файл представления, вы должны использовать ключ для этого маршрута

в view.phtml

<a href="<?php echo $this->url(array(), 'login'); ?>"> 
    [link] 
</a> 

Первый параметр является массивом(), а второй один ключ, который вы определяете в загрузчике. Чем больше вы измените URL-адрес в/new-login в bootstrap, все URL-адреса будут изменены в файлах просмотра.

+0

Спасибо за ваш ответ, похоже, работает так же, как [this] (http://stackoverflow.com/a/8966962/961455), с тем же странным поведением на странице/login со всеми ссылками быть/login. Есть предположения? – nachito

+0

Вы спрашиваете, как установить все ссылки динамической точки на новый URL? Если нет, можете ли вы немного объяснить свое «странное» поведение? – tasmaniski

+0

Все ссылки на странице (которые сгенерированы в шаблоне макета с $ this-> url (array ('controller' => 'foo', 'action' => 'bar'))) теперь/login. Это происходит только на странице входа, ссылки (и маршруты) с домашней страницы и все остальные контроллеры работают нормально. – nachito

Смежные вопросы