@rommcr

Как передать дополнительные параметры в class, обслуживающий custom route rule?

Требуется роутить запрос в разные action'ы контроллера в зависимости от значения POST переменной (допустим, $_POST['action'])

К примеру, запрос по адресу /controller/ с $_POST['action'] == 'value1' должен вести на controller/value1Action, а запрос по адресу /controller/ с $_POST['action'] == 'value2' - на controller/value2Action.

Можно ли это сделать через параметр rules urlManager'а или нужно менять логику приложения? Если это делать через кастомный класс, то не хотелось бы хардкодить условия, нужно передавать их параметром. На Zend Framework подобную задачу решил, допускает ли это Yii2 ?
  • Вопрос задан
  • 2646 просмотров
Решения вопроса 1
@rommcr Автор вопроса
public $allowedActions = ['action1', 'action2']
- это как раз тот хардкодинг, которого я хотел бы избежать. Чтобы не перечислять все возможные значения action, а передавать их параметрами. Тем более, что для разных контроллеров могут быть разные наборы.

Updated: а ларчик просто открывался.

private $acceptable;

    function setAcceptable($acceptable)
    {
        $this->acceptable = $acceptable;
    }


и в конфигурации роутера:

[
                    'acceptable' => 'action1,action2',
                    'class'      => 'components\MsgidSearch'
.......
                ],
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Как-то так, думаю, а вообще вот тут все прекрасно описано www.yiiframework.com/doc-2.0/guide-runtime-routing...

namespace app\components;

use yii\web\UrlRuleInterface;
use yii\base\Object;

class MyUrlRule extends Object implements UrlRuleInterface
{
    public $allowedActions = ['action1', 'action2'];

    public function parseRequest($manager, $request)
    {
        if (null !== ($action = Yii::$app->getRequest()->post('action') && in_array($action, $this->allowedActions)
        {
            return ['controller/'.$action]
        }

        return false;  // this rule does not apply
    }
}


[
    'components' => [
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'enableStrictParsing' => true,
            'suffix' => '.html',
            'rules' => [
                // ...
                [
                    'class' => 'app\components\MyUrlRule', 
                    // ...configure other properties...
                ],
            ],
        ],
    ],
]
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы