Ich versuche, dynamische Routen zu erstellen, da ich ein CMS erstellt habe, bei dem jede erstellte Seite einer Route zugeordnet werden kann. Ich benutze das Beispiel von diesem Link - http://php-and-symfony.matthiasnoback.nl/2012/01/symfony2-dynamically-add-routes/ und alles funktioniert gut, aber das Routing ist im Cache, daher wird eine Route funktionieren, aber dann die nächste wird nicht, wenn ich den Cache löschen. Ist es möglich, nur den Routing-Cache zu diesem Zeitpunkt zu entfernen, oder gibt es eine andere Alternative? Ich möchte nicht das gesamte Cache-Verzeichnis bei jedem Laden der Seite entfernen, da dies keinen Sinn ergibt. Hier ist der Beispielcode:Symfony2 dynamisches Routing - Caching Problem
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
}
}
Dann habe ich einen Dienst für die ExtraLoader gemacht:
<!-- 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>
Das letzte, was wir brauchen, ist ein paar zusätzliche Zeilen in/app/config/Routing. yml:
AcmeRoutingBundle:
resource: .
type: extra
1+ für interessante Frage –