18

作成した各ページをルートに関連付けることができる CMS を作成したため、動的ルートを作成しようとしています。私はこのリンクの例を使用しています - http://php-and-symfony.matthiasnoback.nl/2012/01/symfony2-dynamically-add-routes/すべて正常に動作しますが、ルーティングはキャッシュされているため、ルートは 1 つです動作しますが、キャッシュをクリアしない限り次は動作しません。この段階でルーティング キャッシュだけを削除することは可能ですか、それとも別の方法がありますか? 意味がないので、ページの読み込みごとにキャッシュディレクトリ全体を削除したくありません。コード例は次のとおりです。

namespace Acme\RoutingBundle\Routing;

use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\Config\Loader\LoaderResolver;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;

class ExtraLoader implements LoaderInterface
{
private $loaded = false;

public function load($resource, $type = null)
{
    if (true === $this->loaded) {
        throw new \RuntimeException('Do not add this loader twice');
    }

    $routes = new RouteCollection();

    $pattern = '/extra';
    $defaults = array(
        '_controller' => 'AcmeRoutingBundle:Demo:extraRoute',
    );

    $route = new Route($pattern, $defaults);
    $routes->add('extraRoute', $route);

    return $routes;
}

public function supports($resource, $type = null)
{
    return 'extra' === $type;
}

public function getResolver()
{
}

public function setResolver(LoaderResolver $resolver)
{
    // irrelevant to us, since we don't need a resolver
}
}

次に、ExtraLoader のサービスを作成しました。

<!-- in /src/Acme/RoutingBundle/Resources/config/services.xml -->
<?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services       http://symfony.com/schema/dic/services/services-1.0.xsd">

    <services>
        <service id="acme.routing_loader" class="Acme\RoutingBundle\Routing\ExtraLoader">
            <tag name="routing.loader"></tag>
        </service>
    </services>
</container>

最後に、/app/config/routing.yml に数行追加する必要があります。

AcmeRoutingBundle:
    resource: .
    type: extra
4

4 に答える 4

1

プロジェクトDynamicRouterから見ましたか?symfony-cmfこれはあなたのニーズに合っており、ユースケースに合わせて作成されていると思います.

現在の実装には、知っておくべき実際の問題がいくつかあります。まず、作成/編集/削除するルートごとに、ルーティング キャッシュをクリアする必要があります。これにより、理由もなく競合状態とメモリ ピークが発生します。

symfony のデフォルトの実装は、動的ルートではなく、静的ルートを処理することです。

于 2018-01-11T21:37:22.660 に答える
0

少し調べて試してみたところ、次のファイルを削除するだけでよいことがわかりました。

開発者向け:

/app/cache/dev/appDevUrlGenerator.php
/app/cache/dev/appDevUrlGenerator.php.meta
/app/cache/dev/appDevUrlMatcher.php
/app/cache/dev/appDevUrlMatcher.php.meta

製品の場合:

/app/cache/prod/appProdUrlGenerator.php
/app/cache/prod/appProdUrlMatcher.php

これには、わずかな欠点が 1 つだけあります。現在のルートを使用して、メニュー項目がアクティブかどうかを判断しています。

{% set currentPath = path(app.request.attributes.get('_route'), app.request.attributes.get('_route_params')) %}

...

<li{% if currentPath == path('mybundle_default_index') %} class="active"{% endif %}>

この場合app.request.attributes.get('_route')、もう存在しない可能性があるルートとしてまだキャッシュされています。これが小枝キャッシュだけに関係するのか、それとも他の部分にも関係するのかはまだわかりません。

また、ページの読み込みごとにキャッシュ全体を削除する必要がある理由がわかりませんか? 新しいルートが追加されたときにのみ、キャッシュをクリアする必要があります。

于 2014-11-08T16:23:21.227 に答える