nette 路由器:匹配和 RouteList

问题描述 投票:0回答:1

我正在尝试将页面从数据库映射到域的根:

现在我已经有了

/posts/post1-url
/posts/post2-url/slashed

我想要

/post1-url
/post2-url/slashed

我怎样才能使路由器将上面的字符串与db匹配,如果不匹配,则继续匹配下面的routeList?

<?php
public static function createRouter(): RouteList
    {
        $router = new RouteList;
        $router->addRoute('/', 'Home:default');
        $router->addRoute('/auth', 'Auth:default');
        $router->addRoute('/auth/<action>', 'Auth:<action>');
        $router->addRoute('/admin', 'Admin:default');
        $router->addRoute('/admin[/<action>][/<slug>]', 'Admin:<action>');
        $router->addRoute('/<slug>', 'Home:viewPage');
        $router->addRoute('<presenter>/<action>', '<presenter>:<action>');
        return $router;
    }

我有演示者操作,可以处理显示数据库帖子,但找不到在操作中匹配路由列表的方法,或其他方法来组合匹配+路由列表

nette
1个回答
1
投票

我正在使用这种方法。

博客路由器.php

<?php declare(strict_types=1);

namespace App\Router;

use Nette\Http\IRequest;
use Nette\Http\UrlScript;
use Nette\Routing\Router;
use Nette\Utils\Strings;

final class BlogRouter implements Router
{
    private const Posts = [
        'first-page',
        'second/page',
    ];

    public function match(IRequest $httpRequest): ?array
    {
        $slug = Strings::trim($httpRequest->getUrl()->getPath(), '/');

        if (in_array($slug, self::Posts)) {
            return [
                'presenter' => 'Blog',
                'action' => 'post',
                'slug' => $slug,
            ];
        }

        return null;
    }

    public function constructUrl(array $params, UrlScript $refUrl): ?string
    {
        if (!array_key_exists('slug', $params) || !in_array($params['slug'], self::Posts)) {
            return null;
        }

        return $refUrl->getHostUrl() . '/' . $params['slug'] . '/';
    }
}

RouterFactory.php

<?php declare(strict_types=1);

namespace App\Router;

use Nette\Application\Routers\RouteList;
use Nette\Routing\Router;
use Nette\StaticClass;

final class RouterFactory
{
    use StaticClass;

    public static function createRouter(): RouteList
    {
        $router = new RouteList;

        $router->add(new BlogRouter());
        $router->addRoute('/<slug [0-9a-z-]+>/', 'Page:default');
        $router->addRoute('/', 'Homepage:default');

        return $router;
    }
}

您只需更新 BlogRouter 代码即可使用数据库。但你应该缓存 uri,而不是在每个请求上查询它们。

© www.soinside.com 2019 - 2023. All rights reserved.