Для чего UrlRule::$pattern и UrlRule::$route ?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
IvanChe
Сообщения: 89
Зарегистрирован: 2012.11.25, 18:55

Для чего UrlRule::$pattern и UrlRule::$route ?

Сообщение IvanChe »

Добрый день !
Собственно вопрос в теме. В первом yii без проблем можно было создать своё правило, сейчас не могу понять для чего эти 2 параметра.
"От балды" их ставить как-то не хочется, хотя пока придется...
Буду рад, если кто-то прояснит ситуацию.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Для чего UrlRule::$pattern и UrlRule::$route ?

Сообщение zelenin »

слова pattern и route что-то говорят вам? документацию читали? phpdoc смотрели?
В чем загвоздка?
IvanChe
Сообщения: 89
Зарегистрирован: 2012.11.25, 18:55

Re: Для чего UrlRule::$pattern и UrlRule::$route ?

Сообщение IvanChe »

Разобрался.
Я прекрасно вижу по коду зачем они используются по-умолчанию, но для чего они мне в пользовательском классе было не понятно.
Теперь убедился, что вообще ни к чему.
Неожидал просто в yii увидеть что-то ненужное.
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Для чего UrlRule::$pattern и UrlRule::$route ?

Сообщение anton44eg »

Если вам не нужно - это не значит, что не нужно другим :)
IvanChe
Сообщения: 89
Зарегистрирован: 2012.11.25, 18:55

Re: Для чего UrlRule::$pattern и UrlRule::$route ?

Сообщение IvanChe »

Раскажите, пожалуйста, как их применять можно в пользовательских классах правил ?
Потому что я не могу уловить суть этого нововведения.
Если в них забивать по такому же принципу путь и паттерн, как в правило по-умолчанию, то для этого всегда можно было в пользовательском классе создать свои свойства. Но вот, когда они реально не нужны там, приходится их перекрывать просто "мусором", что на мой взгляд избыточно и несколько не правильно с точки зрения философии yii. Этот фреймворк берет своей прозрачностью и простотой, наряду с гибкостью, скоростью и качеством. Но для тех, кто начинает с ним разбираться, подобные вещи выглядят, как что-то "сырое" в этом фреймворке и впечатление конечно может подпортиться.
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Для чего UrlRule::$pattern и UrlRule::$route ?

Сообщение anton44eg »

не очень понимаю какое может быть правило без паттерна или роута, приведите пример
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Для чего UrlRule::$pattern и UrlRule::$route ?

Сообщение zelenin »

IvanChe писал(а):Раскажите, пожалуйста, как их применять можно в пользовательских классах правил ?
Потому что я не могу уловить суть этого нововведения.
Если в них забивать по такому же принципу путь и паттерн, как в правило по-умолчанию, то для этого всегда можно было в пользовательском классе создать свои свойства. Но вот, когда они реально не нужны там, приходится их перекрывать просто "мусором", что на мой взгляд избыточно и несколько не правильно с точки зрения философии yii. Этот фреймворк берет своей прозрачностью и простотой, наряду с гибкостью, скоростью и качеством. Но для тех, кто начинает с ним разбираться, подобные вещи выглядят, как что-то "сырое" в этом фреймворке и впечатление конечно может подпортиться.
причем здесь нововведение?
UrlManager должен найти необходимый роут. Берутся все правила и перебором по очереди проверяются соответствию паттерну. Если соответствует, то формируется урл на основе роута.
Если вы загляните в UrlRule:init(), то заметите первые две проверки на нулевые паттерн и роут.
IvanChe
Сообщения: 89
Зарегистрирован: 2012.11.25, 18:55

Re: Для чего UrlRule::$pattern и UrlRule::$route ?

Сообщение IvanChe »

Вы не слышите, что это делается в ПОЛЬЗОВАТЕЛЬСКОМ КЛАССЕ ПРАВИЛА.
http://www.yiiframework.com/doc-2.0/guide-url.html - в самом низу пример из документации. Зачем там они нужны ?
viewtopic.php?f=19&t=17957 - очень красивое решение ... мусором закрывать 2 переменные. Я об этом.
anton44eg писал(а):не очень понимаю какое может быть правило без паттерна или роута, приведите пример
Извиняюсь, нужно было с него начать.
Моё правило, которое в разных проявлениях очень часто используется.(В таком виде не будет работать)

Код: Выделить всё

class MyUrlRule extends UrlRule
{
    public function createUrl($manager, $route, $params)
    {
        if (isset($params['url']) && ($route === 'controller1/view' || $route === 'controller2/view')) {
            $path = $params['url'];
            unset($params['url']);
        } else
            return false;

        return $path.$hash;
    }
    public function parseRequest($manager, $request)
    {
        $pathInfo = trim($request->pathInfo, '/');
        if (strpos($pathInfo, '/'))
            return false;

        if (($model = Game::findOne(['url'=>$pathInfo])) !== null) {
            $route = 'controller1/view';
            $params = ['url' => $pathInfo];
        } elseif (($model = Developer::findOne(['url'=>$pathInfo])) !== null) {
            $route = 'controller2/view';
            $params = ['url' => $pathInfo];
        } else
            return false;

        return [$route, $params];
    }
}
 
Что-то такое нужно впихнуть в начало, чтобы завелось.

Код: Выделить всё

class MyUrlRule extends UrlRule
{
    /**
     * Initializes this rule.
     */
    public function init()
    {
        $this->pattern = 'garbage';
        $this->route = 'garbage';
        parent::init();
    }
 ....
 
Зачем я тут должен определять эти 2 свойства, которые мне абсолютно не нужны ?
zelenin писал(а):причем здесь нововведение?
Нововведение тут при том, что раньше эти свойства не проверялись на пустоту в родительском ините и было всё красиво и понятно. Теперь, следуя документации, я должен наследовать класс со своими правилами от yii\web\UrlRule и переопределять либо его инит, либо подставлять "мусор" в значение этих двух переменных.
Я считаю, что это в корне не правильно. Если допустить такое еще в нескольких базовых классах других компонентов, то код на Yii2 будет выглядеть в разы грязнее первого yii. Да и вообще это выглядит, как я уже говорил, просто сыро и не качественно. Пока не услышал конструктивного ответа для необходимости этой проверки на пустоту свойств UrlRule::$pattern и UrlRule::$route.
viewtopic.php?f=19&t=17957 - нижний самый коммент. Я такого же мнения.
zelenin писал(а):UrlManager должен найти необходимый роут. Берутся все правила и перебором по очереди проверяются соответствию паттерну. Если соответствует, то формируется урл на основе роута.
https://github.com/yiisoft/yii2/blob/2. ... #L163-L176 - проверяет только, если используется класс по-умолчанию(yii\web\UrlRule). То есть, если мы передаем не массив. Я передаю 

Код: Выделить всё

['class'=>\frontend\components\MyUrlRule::classname()] 
zelenin писал(а):Если вы загляните в UrlRule:init(), то заметите первые две проверки на нулевые паттерн и роут.
Именно это и вызывает всё недовольство :)
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Для чего UrlRule::$pattern и UrlRule::$route ?

Сообщение maleks »

1) Если наследовать от yii\web\UrlRule, как показано в доках, то просто в своем классе сделайте пустой init()

2) А так вообще класс своего правила не обязан наследоваться от yii\web\UrlRule, а должен реализовать интерфейс UrlRuleInterface:
IvanChe
Сообщения: 89
Зарегистрирован: 2012.11.25, 18:55

Re: Для чего UrlRule::$pattern и UrlRule::$route ?

Сообщение IvanChe »

maleks писал(а):1) Если наследовать от yii\web\UrlRule, как показано в доках, то просто в своем классе сделайте пустой init()
2) А так вообще класс своего правила не обязан наследоваться от yii\web\UrlRule, а должен реализовать интерфейс UrlRuleInterface:
Спасибо. Не приметил, основывался на примере из документации.
Ответить