Feed Rss



Июл 08 2010

Подскажите по ZF Route

рубрика: PHP Автор:

Задача:

есть пути:
/users/$username
и
/users/$some_action

Как правильно организовать роуты в системе ZF?

Мое решение на данный момент:

UsersController::view
UsersController::someAction

routes.php

->addRoute("user-view", new Zend_Controller_Router_Route(
    "users/:username/*",
    array(
        "controller" => "users",
        "action" => "view"
    )
) )

UsersController::view

try {
    $user = $this->getUserFromRequest();
 
} catch ( PageException_NotFound $e ) {
    $action = $this->getRequest()->getParam( 'username' );
    $this->_forward( $action );
    return;
}
Понравился пост? Подпишись на RSS!

Метки: ,

11 ответов на “Подскажите по ZF Route”

  1. Andrey Korolyov says:

    Извращенец =)

  2. Oleg Lobach says:

    Конечно лучше было бы изменить формат урла, но если это нежелательно, то есть еще один вариант:

    На сколько я понимаю, вариантов /users/$some_action мало. Их все можно прописать в правилах роутера перед правилом «users/:username/*». Тогда, в случае вызова одного из $some_action, будет срабатывать соответствующее правило, в противном случае сработает общее.

    Если мое предположение неверно, то пожалуй твое решение близко к оптимальному.

    • Алексей Токарь says:

      К сожалению это предположение было первым, которое на практике оказалось нерабочим :(
      И оно было бы идеальным, если бы работало…

      • kulikov says:

        Не работает потому что не удалось запустить? кол-во экшенов динамически меняется?

        проблеммы начнутся если какой-нибудь юзер зарегается с именем save или remove-all

        лучше всего всетаки переделать схему урлов. ну или накрайняк придумать уникальный префикс для ation’ов

        например /users/action-$some_action
        и запретить регаться юзерам с ником ^action-

        • Алексей Токарь says:

          не работает, потому что описанное поведение не работает при таком решении (на практике проверялись разные возможные варианты + чтение сорцов)

          эти проблемы предусмотрены — пользователям не положено регать имена, если method_exists( ‘UsersController’, $username.»Action» )

          • kulikov says:
            method_exists( ‘UsersController’, $username.”Action” )

            такая конструкция не сработает если в контроллере будет экшн saveAllAction() или removeUserAction() т.к. переменная $username будет равна save-all или remove-user. да и банальные saVe reMove или get-alL-user-payment-card-inFo. Видимо про method_exists ты придумал на ходу после прочтения моего коммента :)

            • Алексей Токарь says:
              <?php
              class A {
                  public function mEthOd() {
              
                  }
              }
              
              var_dump( method_exists( 'A', 'method' ) );
              

              Ваш вариант результата выполнения этого кода? :)

            • Алексей Токарь says:

              а насчет save-all, то у того же Зенда есть прекрасная группа классов: Zend_Filter_Word_*

  3. kulikov says:

    ->addRoute(«user-view», new Zend_Controller_Router_Route(
    «users/:username/*»,
    array(
    «controller» => «users»,
    «action» => «view»
    )
    ))
    ->addRoute(«user-action», new Zend_Controller_Router_Route(
    «users/:action/*»,
    array(
    «controller» => «users»
    ),
    array(
    «action» => «save|remove|archive|edit|something-else»
    )
    ))

    так будет работать. у меня примерно так и работает. важен порядок добавления. роуты считываются с конца.

    • Алексей Токарь says:

      Именно так, возможно, и будет работать, но перечислять все методы гдебы-то еще кроме контроллера для достижения обычного поведения я не намерен

  4. kulikov says:

        блин, нет предпросмотра комментов перед отправкой. не удобно.