Здравствуйте. Использую yii2, возник вопрос по путям. Некоторые пути хочу брать из бд, например site.ru/page1, некоторые из контроллера, например actionPage2. Проблема в том, что везде советуют делать правило в web.php примерно так site.ru/news/$path, но без news не получается. Можно ли сделать так, чтобы искало путь в бд в одном правиле, если не найдет, идёт к следующему правилу. Или же мне просто направлять все запросы в один экшон и там вручную проверять пути и направлять куда нужно?
Если все же требуется, то реализовать вполне возможно.
Достаточно реализовать свой `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; // данное правило не применимо
}
}