Собственные ссылки в yii2. Как?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Matthew
Сообщения: 23
Зарегистрирован: 2015.05.22, 19:28

Re: Собственные ссылки в yii2. Как?

Сообщение Matthew »

Я так понял никто не в курсе почему не исполняется init?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Собственные ссылки в yii2. Как?

Сообщение zelenin »

Matthew писал(а):Я так понял никто не в курсе почему не исполняется init?
то, что вы говорите, что init не выполняется, это еще "бабка на двое сказала".
init() выполняется в любом инициализирующемся классе, унаследованном от object. Если не выполняется, значит, класс не инициализируется.
Аватара пользователя
mihail_dev
Сообщения: 243
Зарегистрирован: 2013.07.17, 00:51
Откуда: Молдова
Контактная информация:

Re: Собственные ссылки в yii2. Как?

Сообщение mihail_dev »

можно увидеть ваш класс и то как вы его подключаете в конфиг фаиле
Изображение
Matthew
Сообщения: 23
Зарегистрирован: 2015.05.22, 19:28

Re: Собственные ссылки в yii2. Как?

Сообщение Matthew »

Вот часть конфига:

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

'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'controllerNamespace' => 'frontend\controllers',
    'components' => [
        'user' => [
            'identityClass' => 'common\models\User',
            'enableAutoLogin' => true,
        ],
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules'=> [
              //  'register' => 'user/index',
                ['class' => 'frontend\components\Pages\PagesUrlRule'],
            ],
        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
        'errorHandler' => [
            'errorAction' => 'site/error',
        ],
 
Вот класс:

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

namespace frontend\components\Pages;

use frontend\models\Pages\Pages;
use yii\helpers\ArrayHelper;
use yii\web\UrlRule;

class PagesUrlRule extends UrlRule
{
    private $_db_rules;

    public function init()
    {
        if ($this->name === null) {
            $this->name = __CLASS__;
        }
        
        $this->prepareData();
    }

    private function prepareData()
    {
        $pages = Pages::find()->asArray(true)->all();
        $this->_db_rules = ArrayHelper::map($pages, 'route', 'alias');
    }

    public function createUrl($manager, $route, $params)
    {
        /*$model = Pages::find()->select('alias')->where(['route' => $route])->one()->alias;
        if ($model) {
            return $model;
        }*/
        return false;  // это правило не подходит
    }

    public function parseRequest($manager, $request)
    {
        /*$pathInfo = $request->getPathInfo();
        if (preg_match('%^(\w+)(/(\w+))?$%', $pathInfo, $matches)) {

            $route = Pages::find()->select('route')->where(['alias' => $pathInfo])->one()->route;
            $params= array();

            if($route) {
                return [$route, $params];
            }

        }*/
        return false;  // это правило не подходит
    }
}
 
Я пробовал по всякому, и через точку остановки и echo, просто ничего не происходит. Init не выполняется и то что в нем соответственно.
Аватара пользователя
mihail_dev
Сообщения: 243
Зарегистрирован: 2013.07.17, 00:51
Откуда: Молдова
Контактная информация:

Re: Собственные ссылки в yii2. Как?

Сообщение mihail_dev »

ясно ты неверно делаешь данный класс обрабатывает только одно правило!
тебе надо как то так сделать

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


<?php
namespace frontend\components\Pages;
use frontend\models\Pages\Pages;
use yii\caching\DbDependency;
use yii\web\CompositeUrlRule;
use yii\web\UrlRuleInterface;
use yii\base\InvalidConfigException;

/**
 * Class PagesUrlRule
 *
 * @package frontend\components\Pages
 */
class PagesUrlRule extends CompositeUrlRule{

    public $cacheComponent = 'cache';

    public $cacheID = 'PagesUrlRules';

    public $ruleConfig = ['class' => 'yii\web\UrlRule'];

    /**
     * Creates the URL rules that should be contained within this composite rule.
     *
     * @return \yii\web\UrlRuleInterface[] the URL rules
     * @throws \yii\base\InvalidConfigException
     */
    protected function createRules()
    {
        $cache = \Yii::$app->get($this->cacheComponent)->get($this->cacheID);
        if(!empty($cache))
            return $cache;

        $pages = Pages::find()->asArray(true)->all();


        $rules = [];
        foreach ($pages as $page) {

            $rule = [
                'pattern' => ltrim($page->alias, '/'),
                'route' => ltrim($page->route, '/'),
            ];


            $rule = \Yii::createObject(array_merge($this->ruleConfig, $rule));
            if (!$rule instanceof UrlRuleInterface) {
                throw new InvalidConfigException('URL rule class must implement UrlRuleInterface.');
            }
            $rules[] = $rule;
        }

        $cd= new DbDependency();
        $cd->sql='SELECT MAX(id) FROM '.Pages::tableName();

        \Yii::$app->get($this->cacheComponent)->set($this->cacheID, $rules, 0, $cd);

        return $rules;
    }

}
Изображение
Matthew
Сообщения: 23
Зарегистрирован: 2015.05.22, 19:28

Re: Собственные ссылки в yii2. Как?

Сообщение Matthew »

Такой реализации еще не видел, мало опыта мало(
А ты бы не мог пояснить мне немного что здесь происходит?
Немного не понимаю вот этот кусок кода:

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

$rules = [];
        foreach ($pages as $page) {

            $rule = [
                'pattern' => ltrim($page->alias, '/'),
                'route' => ltrim($page->route, '/'),
            ];


            $rule = \Yii::createObject(array_merge($this->ruleConfig, $rule));
            if (!$rule instanceof UrlRuleInterface) {
                throw new InvalidConfigException('URL rule class must implement UrlRuleInterface.');
            }
            $rules[] = $rule;
        }

        $cd= new DbDependency();
        $cd->sql='SELECT MAX(id) FROM '.Pages::tableName();

        \Yii::$app->get($this->cacheComponent)->set($this->cacheID, $rules, 0, $cd);
 
А дальше что делать? Как этим воспользоваться? Сори если тупые вопросы, самому трудно учиться(
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Собственные ссылки в yii2. Как?

Сообщение maleks »

1) В PagesUrlRule ты забыл parent::init()
2) Компонент урлманагер кеширует массив rules так что тут смотри может быть ступорок когда ты что то меняешь в правилах а нифига не меняется.
3) С "внутреннего" адреса на "внешний" я бы просто делал редирект
Matthew
Сообщения: 23
Зарегистрирован: 2015.05.22, 19:28

Re: Собственные ссылки в yii2. Как?

Сообщение Matthew »

maleks писал(а):1) В PagesUrlRule ты забыл parent::init()
2) Компонент урлманагер кеширует массив rules так что тут смотри может быть ступорок когда ты что то меняешь в правилах а нифига не меняется.
3) С "внутреннего" адреса на "внешний" я бы просто делал редирект
Я в конец запутался. Зачем parent::init(), я думал он уже не нужен.
Кэш нужно будет просто чистить как-то при добавлении нового адреса.
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Собственные ссылки в yii2. Как?

Сообщение maleks »

точно, тут parent::init() не нужен
Аватара пользователя
mihail_dev
Сообщения: 243
Зарегистрирован: 2013.07.17, 00:51
Откуда: Молдова
Контактная информация:

Re: Собственные ссылки в yii2. Как?

Сообщение mihail_dev »

CompositeUrlRule это абстрактный класс для обработки группы правил
дабы он заработал надо реализовать функцию protected function createRules()
которая должна возвращать массив UrlRuleInterface[]

я и сделал на основе имеющийся информации об Pages я сформировал массив объектов ( $rule = \Yii::createObject(array_merge($this->ruleConfig, $rule));)

также добавил кэширование
ну и всё!
Изображение
Аватара пользователя
mihail_dev
Сообщения: 243
Зарегистрирован: 2013.07.17, 00:51
Откуда: Молдова
Контактная информация:

Re: Собственные ссылки в yii2. Как?

Сообщение mihail_dev »

по поводу как пользоваться

у тебя в конфиге уже прописано

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

'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules'=> [
              //  'register' => 'user/index',
                ['class' => 'frontend\components\Pages\PagesUrlRule'],
            ],
        ],
 
тебе просто нужно добавлять правила в базу данных Pages
Изображение
Аватара пользователя
mihail_dev
Сообщения: 243
Зарегистрирован: 2013.07.17, 00:51
Откуда: Молдова
Контактная информация:

Re: Собственные ссылки в yii2. Как?

Сообщение mihail_dev »

кстате делал по аналогии
yii\web\GroupUrlRule
Изображение
Matthew
Сообщения: 23
Зарегистрирован: 2015.05.22, 19:28

Re: Собственные ссылки в yii2. Как?

Сообщение Matthew »

mihail_dev писал(а):по поводу как пользоваться

у тебя в конфиге уже прописано

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

'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules'=> [
              //  'register' => 'user/index',
                ['class' => 'frontend\components\Pages\PagesUrlRule'],
            ],
        ],
тебе просто нужно добавлять правила в базу данных Pages
Не работает. Я попытался сразу же проверить( А не должно быть функций "createUrl" и "parseRequest"? Как ссылки создавать тогда, если не нужна функция "createUrl"?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Собственные ссылки в yii2. Как?

Сообщение zelenin »

Matthew писал(а):
mihail_dev писал(а):по поводу как пользоваться

у тебя в конфиге уже прописано

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

'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules'=> [
              //  'register' => 'user/index',
                ['class' => 'frontend\components\Pages\PagesUrlRule'],
            ],
        ],
 
тебе просто нужно добавлять правила в базу данных Pages
Не работает. Я попытался сразу же проверить( А не должно быть функций "createUrl" и "parseRequest"? Как ссылки создавать тогда, если не нужна функция "createUrl"?
php знаем?
Аватара пользователя
mihail_dev
Сообщения: 243
Зарегистрирован: 2013.07.17, 00:51
Откуда: Молдова
Контактная информация:

Re: Собственные ссылки в yii2. Как?

Сообщение mihail_dev »

скажи что ты добавил за правило ?
Изображение
Matthew
Сообщения: 23
Зарегистрирован: 2015.05.22, 19:28

Re: Собственные ссылки в yii2. Как?

Сообщение Matthew »

mihail_dev писал(а):скажи что ты добавил за правило ?
Изображение
Аватара пользователя
mihail_dev
Сообщения: 243
Зарегистрирован: 2013.07.17, 00:51
Откуда: Молдова
Контактная информация:

Re: Собственные ссылки в yii2. Как?

Сообщение mihail_dev »

сорри в коде допустил ошибку в классе

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

$rule = [
                'pattern' => ltrim($page->alias, '/'),
                'route' => ltrim($page->route, '/'),
            ];
заменить на это (в коде $page является массивом)

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

$rule = [
                'pattern' => ltrim($page['alias'], '/'),
                'route' => ltrim($page['route'], '/'),
            ];

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

<?php
namespace frontend\components\Pages;
use frontend\models\Pages\Pages;
use yii\caching\DbDependency;
use yii\web\CompositeUrlRule;
use yii\web\UrlRuleInterface;
use yii\base\InvalidConfigException;

/**
 * Class PagesUrlRule
 *
 * @package frontend\components\Pages
 */
class PagesUrlRule extends CompositeUrlRule{

    public $cacheComponent = 'cache';

    public $cacheID = 'PagesUrlRules';

    public $ruleConfig = ['class' => 'yii\web\UrlRule'];

    /**
     * Creates the URL rules that should be contained within this composite rule.
     *
     * @return \yii\web\UrlRuleInterface[] the URL rules
     * @throws \yii\base\InvalidConfigException
     */
    protected function createRules()
    {
        $cache = \Yii::$app->get($this->cacheComponent)->get($this->cacheID);
        if(!empty($cache))
            return $cache;

        $pages = Pages::find()->asArray(true)->all();


        $rules = [];
        foreach ($pages as $page) {

            $rule = [
                'pattern' => ltrim($page['alias'], '/'),
                'route' => ltrim($page['route'], '/'),
            ];


            $rule = \Yii::createObject(array_merge($this->ruleConfig, $rule));
            if (!$rule instanceof UrlRuleInterface) {
                throw new InvalidConfigException('URL rule class must implement UrlRuleInterface.');
            }
            $rules[] = $rule;
        }

        $cd= new DbDependency();
        $cd->sql='SELECT MAX(id) FROM '.Pages::tableName();

        \Yii::$app->get($this->cacheComponent)->set($this->cacheID, $rules, 0, $cd);

        return $rules;
    }

}
Изображение
Matthew
Сообщения: 23
Зарегистрирован: 2015.05.22, 19:28

Re: Собственные ссылки в yii2. Как?

Сообщение Matthew »

mihail_dev писал(а):сорри в коде допустил ошибку в классе

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

$rule = [
                'pattern' => ltrim($page->alias, '/'),
                'route' => ltrim($page->route, '/'),
            ];
заменить на это (в коде $page является массивом)

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

$rule = [
                'pattern' => ltrim($page['alias'], '/'),
                'route' => ltrim($page['route'], '/'),
            ];
Все исправил. Но вот все равно не пойму почему не работает:( Трудная тема. Может я туплю?

Вот кусок \frontend\config\main.php

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

'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules'=> [
              //  'register' => 'user/index',
                ['class' => 'frontend\components\Pages\PagesUrlRule'],
            ],
        ],
Далее frontend\components\Pages\PagesUrlRule идентичен Вашему. На этом все? Правило создано и висит в базе: Alias -> registration, Route -> user/index

Переход по ссылке /registration дает 404

Когда вообще должна отработать функция createRules в классе PagesUrlRule? Точка остановки никогда не срабатывает в ней, стало быть функция не срабатывает вообще...
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Собственные ссылки в yii2. Как?

Сообщение Loveorigami »

в конфиге - register
вы переходите на /registration

как правильно?
Matthew
Сообщения: 23
Зарегистрирован: 2015.05.22, 19:28

Re: Собственные ссылки в yii2. Как?

Сообщение Matthew »

Loveorigami писал(а):в конфиге - register
вы переходите на /registration

как правильно?
В конфиге вообще-то строка с "register" за комментирована. Все правила в базе хранятся, поэтому правильно "registration"
Ответить