radhab20
@radhab20
Мир вам!

Вопрос по путям в yii2?

Здравствуйте. Использую yii2, возник вопрос по путям. Некоторые пути хочу брать из бд, например site.ru/page1, некоторые из контроллера, например actionPage2. Проблема в том, что везде советуют делать правило в web.php примерно так site.ru/news/$path, но без news не получается. Можно ли сделать так, чтобы искало путь в бд в одном правиле, если не найдет, идёт к следующему правилу. Или же мне просто направлять все запросы в один экшон и там вручную проверять пути и направлять куда нужно?

Спасибо за внимание.
  • Вопрос задан
  • 62 просмотра
Решения вопроса 1
Frostealth
@Frostealth
Backend Developer
Лучше, конечно, обойтись без путей в БД.

Если все же требуется, то реализовать вполне возможно.
Достаточно реализовать свой `UrlRule` (дока).
пример из доки

namespace app\components;

use yii\web\UrlRuleInterface;
use yii\base\BaseObject;

class CarUrlRule extends BaseObject implements UrlRuleInterface
{

    public function createUrl($manager, $route, $params)
    {
        if ($route === 'car/index') {
            if (isset($params['manufacturer'], $params['model'])) {
                return $params['manufacturer'] . '/' . $params['model'];
            } elseif (isset($params['manufacturer'])) {
                return $params['manufacturer'];
            }
        }
        return false;  // данное правило не применимо
    }

    public function parseRequest($manager, $request)
    {
        $pathInfo = $request->getPathInfo();
        if (preg_match('%^(\w+)(/(\w+))?$%', $pathInfo, $matches)) {
            // Ищем совпадения $matches[1] и $matches[3] 
            // с данными manufacturer и model в базе данных
            // Если нашли, устанавливаем $params['manufacturer'] и/или $params['model']
            // и возвращаем ['car/index', $params]
        }
        return false;  // данное правило не применимо
    }
}

Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы