Yii - удалить идентификатор контроллера по умолчанию для модуля из URL - PullRequest
3 голосов
/ 29 февраля 2012

Я создал модуль, и внутри него есть контроллер по умолчанию.Теперь я могу получить доступ к действию index (действие по умолчанию) в контроллере по умолчанию, например / mymodule /.Для всех других действий мне нужно указать идентификатор контроллера в URL, как / mymodule / default / register /.Я хотел бы знать, возможно ли удалить идентификатор контроллера из URL для контроллера по умолчанию в модуле.

Мне нужно установить правило URL следующим образом:

before beautify : www.example.com/index.php?r=mymodule/default/action/

after beautify : www.example.com/mymodule/action/

Примечание: Iхочу, чтобы это происходило только для контроллера по умолчанию.

Спасибо

1 Ответ

3 голосов
/ 01 марта 2012

Это немного сложно, потому что часть действия может рассматриваться как контроллер, или вы можете указывать на существующий контроллер. Но вы можете обойтись без этого, используя Custom URL Rule Class . Вот пример (я проверил его, и он, кажется, работает хорошо):

class CustomURLRule extends CBaseUrlRule
{
  const MODULE = 'mymodule';
  const DEFAULT_CONTROLLER = 'default';

  public function parseUrl($manager, $request, $pathInfo, $rawPathInfo)
  {
    if (preg_match('%^(\w+)(/(\w+))?$%', $pathInfo, $matches)) {
      // Make sure the url has 2 or more segments (e.g. mymodule/action)
      // and the path is under our target module. 
      if (count($matches) != 4 || !isset($matches[1]) || !isset($matches[3]) || $matches[1] != self::MODULE)
        return false;

      // check first if the route already exists
      if (($controller = Yii::app()->createController($pathInfo))) {
        // Route exists, don't handle it since it is probably pointing to another controller
        // besides the default.
        return false;
      } else {
        // Route does not exist, return our new path using the default controller.
        $path = $matches[1] . '/' . self::DEFAULT_CONTROLLER . '/' . $matches[3];
        return $path;
      }
    }
    return false;
  }

  public function createUrl($manager, $route, $params, $ampersand)
  {
    // @todo: implement
    return false;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...