2012-07-24 11 views
5

Ich verwende Silex zum ersten Mal. Alles funktioniert gut während der Entwicklung vor Ort. Sobald alles auf den Produktionsserver hochgeladen wurde, funktionieren parametrisierte Routen nicht mehr.Silex Routing nicht gefunden

Haben Sie eine Idee?
Fehle ich irgendwo Produktionskonfigurationen?
Fehle ich irgendwo Dateiberechtigungen?

Ich erhalte diese zwei Ausnahmen:

NotFoundHttpException: No route found for "GET /prevendita/hello/sadfasdf" 
in /var/www/vhosts/teatrodellamemoria.it/httpdocs/assets/modules/prevendita/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/RouterListener.php line 92 
    at RouterListener->onKernelRequest(object(GetResponseEvent)) 
    at call_user_func(array(object(RouterListener), 'onKernelRequest'), object(GetResponseEvent)) in /var/www/vhosts/teatrodellamemoria.it/httpdocs/assets/modules/prevendita/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcher.php line 164 
    at EventDispatcher->doDispatch(array(array(object(Application), 'onEarlyKernelRequest'), array(object(SessionServiceProvider), 'onEarlyKernelRequest'), array(object(RouterListener), 'onKernelRequest'), array(object(LocaleListener), 'onKernelRequest'), array(object(Application), 'onKernelRequest')), 'kernel.request', object(GetResponseEvent)) in /var/www/vhosts/teatrodellamemoria.it/httpdocs/assets/modules/prevendita/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcher.php line 53 
    at EventDispatcher->dispatch('kernel.request', object(GetResponseEvent)) in /var/www/vhosts/teatrodellamemoria.it/httpdocs/assets/modules/prevendita/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpKernel.php line 110 
    at HttpKernel->handleRaw(object(Request), '1') in /var/www/vhosts/teatrodellamemoria.it/httpdocs/assets/modules/prevendita/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpKernel.php line 73 
    at HttpKernel->handle(object(Request), '1', true) in /var/www/vhosts/teatrodellamemoria.it/httpdocs/assets/modules/prevendita/vendor/silex/silex/src/Silex/Application.php line 509 
    at Application->handle(object(Request)) in /var/www/vhosts/teatrodellamemoria.it/httpdocs/assets/modules/prevendita/vendor/silex/silex/src/Silex/Application.php line 484 
    at Application->run() in /var/www/vhosts/teatrodellamemoria.it/httpdocs/assets/modules/prevendita/web/index.php line 49 

Und:

ResourceNotFoundException: 
in /var/www/vhosts/teatrodellamemoria.it/httpdocs/assets/modules/prevendita/vendor/symfony/routing/Symfony/Component/Routing/Matcher/UrlMatcher.php line 81 
    at UrlMatcher->match('/prevendita/hello/sadfasdf') in /var/www/vhosts/teatrodellamemoria.it/httpdocs/assets/modules/prevendita/vendor/symfony/routing/Symfony/Component/Routing/Matcher/RedirectableUrlMatcher.php line 30 
    at RedirectableUrlMatcher->match('/prevendita/hello/sadfasdf') in /var/www/vhosts/teatrodellamemoria.it/httpdocs/assets/modules/prevendita/vendor/silex/silex/src/Silex/LazyUrlMatcher.php line 51 
    at LazyUrlMatcher->match('/prevendita/hello/sadfasdf') in /var/www/vhosts/teatrodellamemoria.it/httpdocs/assets/modules/prevendita/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/RouterListener.php line 78 
    at RouterListener->onKernelRequest(object(GetResponseEvent)) 
    at call_user_func(array(object(RouterListener), 'onKernelRequest'), object(GetResponseEvent)) in /var/www/vhosts/teatrodellamemoria.it/httpdocs/assets/modules/prevendita/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcher.php line 164 
    at EventDispatcher->doDispatch(array(array(object(Application), 'onEarlyKernelRequest'), array(object(SessionServiceProvider), 'onEarlyKernelRequest'), array(object(RouterListener), 'onKernelRequest'), array(object(LocaleListener), 'onKernelRequest'), array(object(Application), 'onKernelRequest')), 'kernel.request', object(GetResponseEvent)) in /var/www/vhosts/teatrodellamemoria.it/httpdocs/assets/modules/prevendita/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcher.php line 53 
    at EventDispatcher->dispatch('kernel.request', object(GetResponseEvent)) in /var/www/vhosts/teatrodellamemoria.it/httpdocs/assets/modules/prevendita/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpKernel.php line 110 
    at HttpKernel->handleRaw(object(Request), '1') in /var/www/vhosts/teatrodellamemoria.it/httpdocs/assets/modules/prevendita/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpKernel.php line 73 
    at HttpKernel->handle(object(Request), '1', true) in /var/www/vhosts/teatrodellamemoria.it/httpdocs/assets/modules/prevendita/vendor/silex/silex/src/Silex/Application.php line 509 
    at Application->handle(object(Request)) in /var/www/vhosts/teatrodellamemoria.it/httpdocs/assets/modules/prevendita/vendor/silex/silex/src/Silex/Application.php line 484 
    at Application->run() in /var/www/vhosts/teatrodellamemoria.it/httpdocs/assets/modules/prevendita/web/index.php line 49 

Dies ist der Code:

<?php 
require_once __DIR__.'/../vendor/autoload.php'; 

use Teatro\Models\Reservation; 
use Teatro\Models\ReservationsSeat; 
use Symfony\Component\Validator\Constraints; 
use Symfony\Component\Form\FormError; 

$app = new Silex\Application(); 
$app['debug'] = true; 

$app->register(new Silex\Provider\TwigServiceProvider(), array(
    'twig.path' => __DIR__.'/../views', 
)); 
$app->register(
    new Silex\Provider\UrlGeneratorServiceProvider() 
); 
$app->register(
    new Silex\Provider\SessionServiceProvider(), array(
//  'session.storage.options' => array('name' => 'test') 
    ) 
); 
$app->register(
    new Silex\Provider\FormServiceProvider() 
); 
$app->register(
    new Silex\Provider\ValidatorServiceProvider() 
); 
$app->register(new Silex\Provider\TranslationServiceProvider(), array(
    'translator.messages' => array(), 
)); 
$app->register(
    new Silex\Provider\SwiftmailerServiceProvider() 
); 

$app->get('/prevendita/hello/{name}/', function ($name) use ($app) { 
    return "Hello $name!"; 
})->bind('hello_name'); 

$app->get('/prevendita/hello', function() use ($app) { 
    return "Hello!"; 
})->bind('hello'); 

$app->run(); 

Entwicklung Server ist PHP 5.4 eingebauten Webserver Produktionsserver ist PHP 5.3 CentOS

.htaccess-Dateien sind grundsätzlich gleich. Bei der Herstellung env, die silex App ist in einem Unterordner von Document-Root sagen wir mal/prevendita ich

so hinzugefügt
RewriteRule ^prevendita /prevendita/web/index.php [L] 

auf jede Anfrage zu umleiten, beginnend mit/prevendita meiner silex App

+0

Können Sie die Stacktraces einfügen? – Florent

+0

Gemäß der zweiten Ausnahme stimmt keine Route überein. Vielleicht können Sie Ihre Routen einfügen? – Florent

+0

Problem ist lokal die gleiche Datei funktioniert perfekt.Außerdem funktioniert es perfekt in der Produktion, wenn die Route statisch ist. Wenn ich einen Parameter in der Route hinzufüge, wird die Route nicht gefunden. – user1170896

Antwort

8

Sie schrieb:

/prevendita/hello/{name}/ 

Aber angefordert:

/prevendita/hello/sadfasdf 

Sie haben den Schrägstrich vergessen.
Ich denke, das ist das Problem.

Edit: Nach Fabien Potencier (Autor von Silex):

  • Jede Ressource eine eindeutige URL (so ist /foo/ unterscheidet sich von /foo) haben müssen.
  • Als Annehmlichkeit für den Endbenutzer (nicht der Entwickler), wenn eine URL mit einem / enden muss und wenn er vergisst, es einzugeben, leitet Silex ihn an die richtige URL (mit einem /) statt an 404 zurück.
  • Wenn Silex URLs generiert, verwenden sie immer die kanonische URL, so dass die Umleitung nur erfolgt, wenn ein Benutzer manuell eine URL eingibt und vergisst, die nachgestellte / hinzuzufügen, aber nie vom Framework selbst verwendet wird.
+1

ist dies leider nicht der Fall. Es gibt einen Fehler bezüglich des abschließenden Schrägstrichs, aber keiner der beiden funktioniert mit oder ohne den abschließenden Schrägstrich. – user1170896

+1

@Florent, ist es möglich, den End-Schrägstrich als optional zu definieren, so dass ich nur eine Route anstelle von zwei Routen angeben muss, die dasselbe tun, wo eine Route den Endstrich enthält und die andere nicht? – forestclown

1

Die beste Option besteht darin, Ihre Domäne auf /prevendita/web/ zu verweisen und die Umschreibe-Engine nicht zur Verarbeitung von Unterverzeichnissen zu verwenden. Ich nehme an, Sie haben etwas anderes unter Domain, also können Sie es vielleicht nicht auf Ihre Silex-App verweisen, aber Sie können Subdomain verwenden und yourdomain.com/prevendita/web/index.php anfordern können Sie prevendita.yourdomain.com/index.php anfordern (mit Domain auf web).