Простой класс для создания ЧПУ ссылок по алиасам Yii2

В этой заметке хочу поделиться классом, который будет автоматически создавать чпу ссылки из алиасов в зависимости от того, какой конфигурационный массив будет передан классу.
<?php

namespace app\components;

use yii\web\UrlRule;

class SlugUrlRules extends UrlRule
{
    public $pattern = '<module>/<controller>/<action>';
    public $route = 'module/<module:\w+>/<controller:\w+>/<action:\w+>';
    private $relations = [
        'news/view' => '\app\models\ArticleItems',
        'tips/view' => '\app\models\ArticleItems',
        'fact-and-figures/view' => '\app\models\ArticleItems',
    ];


    /*
      Разрешение роута
    */
    public function resolveRoute($route, $id)
    {
        if (isset($this->relations[$route])) {
            $modelClass = $this->relations[$route];
            $model = $modelClass::findOne($id);
            if ($model) {
                if (isset($model->alias)) {
                    return $model;    
                }
            }
        }
        return false;
    }


    /* 
      Разрешение алиаса
    */
    public function resolveAlias($alias)
    {
        $parts = explode('/', $alias);
        $route = $parts[0] . '/view';
        if (isset($parts[1])) {
            $alias = $parts[1];
            if (isset($this->relations[$route])) {
                $modelClass = $this->relations[$route];
                $model = $modelClass::find()
                    ->where(['alias' => $alias])
                    ->one();
                if (isset($model)) {
                    return [$route, ['id' => $model->id]];
                }
            }
        }
        return false;
    }
    
    public function createUrl($manager, $route, $params)
    {
        if (isset($params['id'])) {
            $model = $this->resolveRoute($route, $params['id']);
            if ($model) {
                $url = str_replace('/view', '', $route);
                $url .= '/' . $model->alias;
                return $url;
            }
        }
        return false;
    }


    public function parseRequest($manager, $request)
    {
        $pathinfo = $request->pathinfo;
        $route = $this->resolveAlias($pathinfo);
        return $route;
    }
}

Комментарии

Популярные сообщения из этого блога

Установка утилиты yandex disk для ubuntu

Отправка пост запроса AngularJS