Yii основной URL переписать - PullRequest
1 голос
/ 26 марта 2012

Я новичок в php, новичок в mvc, новичок в yii и новичок в переписывании URL.Итак, извините, если я спрашиваю что-то очень простое.

Я скрыл index.php (из метода htaccess, обсуждавшегося на форумах yii)

В моем urlmanager у меня есть это,

'urlFormat'=>'path',
             'rules'=>array( 
             '<controller:\w+>/<id:\d+>'=>'view',
             '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
             '<controller:\w+>/<action:\w+>'=>'<controller>/<action>' 
              ),
             'showScriptName'=>false,

У меня есть 3 файла в папке view / site.

  1. 'путешествие',
  2. 'пригласить',
  3. 'linkedin '

Теперь моя домашняя страница должна перенаправить на действие "путешествие" (т. е. открыть "site / trip.php")

Так что, думаю, это будет

'/' => 'site/journey'

Это тоже работает.

Теперь я хочу, чтобы «путешествие / приглашение» вызвало действие «пригласить», то есть должно открыть «сайт / приглашение.php»

И «trip / linkedin» должен вызывать действие «linkedin», то есть «site / linkedin.php».

, но

'journey/invite' => 'site/invite',
'journey/linkedin' => 'site/linkedin'

не работает.

Кроме того, может ли кто-нибудь помочь мне понять это,

<controller:\w+>/<id:\d+>

то есть, что такое контроллер в URL и что означает «w +»?

Ссылка на руководство также поможет.

Отредактировано после предложения bool.dev:

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

    '/' => 'site/journey',
    'journey/invite' => 'site/invite',
    'journey/linkedin' => 'site/linkedin',
    '<controller:\w+>/<id:\d+>'=>'view',
    '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
    '<controller:\w+>/<action:\w+>'=>'<controller>/<action>', 

Но он выдает ошибку

"Предупреждение: require_once (): действует ограничение open_basedir. Файл (/var/xyz.com)/../yii/framework/yii.php) находится вне допустимых путей: (/ usr / share / php: / usr / share / pear: / usr / share / php / libzend-framework-php:/var/*/tmp:/var/xyz.com) в /var/xyz.com/journey.php в строке 12 Предупреждение: require_once (/var/xyz.com /../ yii /framework / yii.php): не удалось открыть поток: операция не разрешена в /var/xyz.com/journey.php в строке 12 Фатальная ошибка: require_once (): сбой при открытии требуется '/var/xyz.com/../yii / framework / yii.php '(include_path ='.: / usr / share / php: / usr / share / php / libzend-framework-php ') в /var/xyz.com/journey.php в строке 12'

, когда я делаю xyz.com/journey/invite или даже xyz.com/journey

Редактировать:

Это была проблема с разрешением, @ bool.dev'sсработало предложение поставить конкретные правила сверху:)

1 Ответ

6 голосов
/ 27 марта 2012

Эти два:

'journey/invite' => 'site/invite',
'journey/linkedin' => 'site/linkedin'

не работают, потому что URL соответствует предыдущему правилу:

'<controller:\w+>/<action:\w+>'=>'<controller>/<action>'

Чтобы этого не происходило, просто убедитесь, что правило упоминается последним, прежде чем какие-либо конкретные (то есть не соответствующие регулярным выражениям) перезаписываются, чтобы ваши правила могли выглядеть примерно так:

'journey/invite' => 'site/invite',
'journey/linkedin' => 'site/linkedin',
'<controller:\w+>/<action:\w+>'=>'<controller>/<action>'

Это: \w+ означает совпадение любой строки с одним или несколькими вхождениями любого символа «слово» (az 0-9 _), а \d+ означает совпадение любой строки с одним или несколькими вхождениями любых цифр (0-9). ) Проверьте PHP регулярное выражение .

Редактировать

Если бы вы раньше не читали ваш вопрос полностью, controller в правиле - это просто имя для совпадающего выражения, поэтому вы могли бы иметь '<contr:\w+>/<act:\w+>'=>'<contr>/<act>'.

Edit2

После прочтения отредактированного вопроса с массивом правил afaik вы можете использовать ''=>'site/journey' вместо '/'=>'site/journey'.

...