Как я могу использовать dash с несколькими словами при создании страницы Yii2

#php #yii2

#php #yii2

Вопрос:

Я пытаюсь создать статическую страницу с помощью Yii2. Название страницы содержит больше двух слов, например — политика конфиденциальности. Я добавил приведенный ниже код внутрь SiteController.php

 public function actionPrivacyPolicy()
{
    return $this->render('privacy-policy');
}
  

Затем я создал страницу внутри папки сайта с именем — privacy-policy.php
Однако это привело к ошибке «страница не найдена».
На моем сайте есть много подобных случаев. Каков наилучший способ исправить это?

Комментарии:

1. если вы включили enablePrettyUrl=>true , то вам следует ввести http://yoursite.com/site/privacy-policy , если нет, то http://yoursite.com/index.php?r=site/privacy-policy и вам не нужно сопоставлять view имя с action , это может быть что угодно.

2. @Мухаммад Омер Аслам . Да, я включил I enablePrettyUrl=>true . Я протестировал http://yoursite.com/site/privacy-policy , и это сработало! Но я в замешательстве, потому что я добавил правило, от которого '<alias:w >' => 'site/<alias>', нужно избавиться site в URL, и оно работает для ссылок с одним словом. Например, оба http://yoursite.com/site/contact и http://yoursite.com/site/contact работают, но http://yoursite.com/privacy-policy без site выдает страницу не найдена. Возможно, я делаю что-то неправильно. Есть идеи, пожалуйста?

3. добавлен ответ, смотрите ниже

Ответ №1:

Вам необходимо получить доступ к URL, как показано ниже, если вы используете "enablePrettyUrl"=>true

  • http://yoursite.com/site/privacy-policy

и

  • http://yoursite.com/index.php?r=site/privacy-policy

если не использовать "enablePrettyUrl"=>true

после этого вам нужно проанализировать все действия в SiteController только по именам действий, поэтому вам нужно включить "enableStrictParsing"=>false , а затем добавить следующее правило в urlManager

 'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    "enableStrictParsing" => false,
    'rules' => [
        "/" => "site/index",
        "<action:(.*)>" => 'site/<action>',
    ],
],
  

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

Хотя это допускает символы, которые разрешены / не должны быть разрешены, но причина, по которой я использовал (.*) в правилах, заключается в том, что имя действия будет определено внутри контроллеров, и вы должны использовать правила с объявленными действиями только внутри SiteController , который не собирается анализировать имя действия для правил с любым из запрещенных символов, означает, что если имя действия будет, скажем, actionMyActionNameLong , есть вероятность 0, что любое / или генерируется с именем действия, что приведет к дальнейшим нарушениям при использовании правила , так что вы можете использовать его в этом контексте, в противном случае вы можете использовать [w-] при создании URL-адресов вручную.

Комментарии:

1. можете ли вы взглянуть на вклад rob006 ниже? Вы рассматривали поднятый вопрос? Я думаю, вы можете захотеть доработать этот ответ, чтобы не создавать проблем в будущем для других.

2. @atsngr, rob006 ответил в контексте данного токена, w который вы использовали, который допускает только любой символ слова , а не - тот, который является правильным в соответствии с его ответом. В то время как .* совпадения с любым символом (за исключением символов завершения строки) таким образом, технически (.*) будет перехватываться все, что [w-] захватывается, разве это не работает правильно для вас?

3. очень хорошо. Ваш ответ заставил меня пересмотреть конфигурацию моего проекта.

Ответ №2:

Шаблон <alias:w > не будет соответствовать дефису, поскольку w будет принимать только буквы, цифры и подчеркивание. Вам нужно использовать [w-] для сопоставления также слов, разделенных дефисом.

 'rules' => [
    '<alias:[w-] >' => 'site/<alias>',
    // ...
],
  

Комментарии:

1. Спасибо за это. Но ответ @Muhammad Omer Aslam сделал свое дело.

2. @atsngr В его ответе (.*) используется в качестве шаблона, что неверно — он будет перехватывать все возможные символы (включая / ), что неверно в данном контексте. Его правило в основном нарушает запасной вариант по умолчанию и все последующие правила.

3. Я тоже протестировал ваш код, и он тоже сработал. Учитывая, что вы уже подумали о возможном влиянии дальнейших правил, я думаю, что ваш вклад очень важен

Ответ №3:

Я думаю, вы можете настроить urlManager в main.php в папке config и попробуйте добавить некоторые правила в urlManager, чтобы к URL можно было получить доступ динамически

 'urlManager' => [
            "enablePrettyUrl" => true,
            "showScriptName" => false,
            "enableStrictParsing" => false,
            "suffix" => "",
            "rules" => [
                "<controller:w >/<action:w >" => "<controller>/<action>"
            ],
        ],
  

Если вы используете yii filters AccessControl в поведении ваших контроллеров, вам может потребоваться добавить разрешенное действие в список перед созданием нового действия.

Комментарии:

1. Пожалуйста, посмотрите мой комментарий выше.