Задача:
есть пути:
/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; }
Извращенец =)
Конечно лучше было бы изменить формат урла, но если это нежелательно, то есть еще один вариант:
На сколько я понимаю, вариантов /users/$some_action мало. Их все можно прописать в правилах роутера перед правилом «users/:username/*». Тогда, в случае вызова одного из $some_action, будет срабатывать соответствующее правило, в противном случае сработает общее.
Если мое предположение неверно, то пожалуй твое решение близко к оптимальному.
К сожалению это предположение было первым, которое на практике оказалось нерабочим :(
И оно было бы идеальным, если бы работало…
Не работает потому что не удалось запустить? кол-во экшенов динамически меняется?
проблеммы начнутся если какой-нибудь юзер зарегается с именем save или remove-all
лучше всего всетаки переделать схему урлов. ну или накрайняк придумать уникальный префикс для ation’ов
например /users/action-$some_action
и запретить регаться юзерам с ником ^action-
не работает, потому что описанное поведение не работает при таком решении (на практике проверялись разные возможные варианты + чтение сорцов)
эти проблемы предусмотрены — пользователям не положено регать имена, если method_exists( ‘UsersController’, $username.»Action» )
такая конструкция не сработает если в контроллере будет экшн saveAllAction() или removeUserAction() т.к. переменная $username будет равна save-all или remove-user. да и банальные saVe reMove или get-alL-user-payment-card-inFo. Видимо про method_exists ты придумал на ходу после прочтения моего коммента :)
<?php class A { public function mEthOd() { } } var_dump( method_exists( 'A', 'method' ) );Ваш вариант результата выполнения этого кода? :)
а насчет save-all, то у того же Зенда есть прекрасная группа классов: Zend_Filter_Word_*
->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»
)
))
так будет работать. у меня примерно так и работает. важен порядок добавления. роуты считываются с конца.
Именно так, возможно, и будет работать, но перечислять все методы гдебы-то еще кроме контроллера для достижения обычного поведения я не намерен
блин, нет предпросмотра комментов перед отправкой. не удобно.