Aller au contenu

[Silex] SecurityProvider Fakeroute


Zef

Messages recommandés

Bonjour !

J'ai un petit soucis avec Silex et le composant Security de symfony. Il me renvoie l'erreur suivante:

"LogicException: The controller must return a response (null given). Did you forget to add a return statement somewhere in your controller?"

Après plusieurs heures de recherche j'ai compris que c'est parce que le controller qui est appeler est en faite une fonction vide :

Dans le SecurityServiceProvider, je passe par la fonction anonyme function() {} qui ne renvoie rien (j'ai vérifier à coup de breakpoints).

   public function boot(Application $app)   {       // FIXME: in Symfony 2.2, this is a proper subscriber       //$app['dispatcher']->addSubscriber($app['security.firewall']);       $app['dispatcher']->addListener('kernel.request', array($app['security.firewall'], 'onKernelRequest'), ;       foreach ($this->fakeRoutes as $route) {           list($method, $pattern, $name) = $route;           $app->$method($pattern, function() {})->bind($name);       }   }

Je ne comprend pas comment résoudre ce problème...

Pour information voici ma config:

<?phpdefine('ROOT_DIR', realpath(__DIR__.'/../../..'));require_once ROOT_DIR.'/vendor/autoload.php';$app = new \Silex\Application();require_once __DIR__.'/config/load.php';use \Symfony\Component\HttpFoundation\Request;use \Symfony\Component\HttpFoundation\Response;$app->register(new \Propel\Silex\PropelServiceProvider(), array(   'propel.path'        => ROOT_DIR.'/vendor/propel/propel1/runtime/lib/Propel.php',   'propel.config_file' => ROOT_DIR.'/resources/propel/build/conf/Higgs-conf.php',   'propel.model_path'  => ROOT_DIR.'/resources/propel/build/classes',));$app->register(new \Silex\Provider\ValidatorServiceProvider());$app->register(new \Silex\Provider\FormServiceProvider());$app->register(new \Silex\Provider\SessionServiceProvider());$app->register(new \Silex\Provider\SecurityServiceProvider(), array(   'providers' => [       'main' => [           'entity' => [               'class' => '\Higgs\Model\User',               'property'    =>    'username'           ]       ]   ]   // TODO : http://symfony.com/doc/current/book/security.html));$app['security.firewalls'] = array(   'main' => array(       'pattern' => '^/User',       'form' => array(           'check_path'                     => '/User/login',           'login_path'                     => '/login',           'default_target_path'            => '/logged',       ),       'anonymous' => '~',   ),);$app->before(function (Request $request) {   if (0 === strpos($request->headers->get('Content-Type'), 'application/json')) {       $data = json_decode($request->getContent(), true);       $request->request->replace(is_array($data) ? $data : array());   }});// include APIcall_user_func(function () use($app) {   chdir(__DIR__.'/Route');   foreach (glob('*.php') as $file) {       $api = substr($file,0,-4);       $controller = '\\Higgs\\API\\Route\\'.$api;       $app->mount('/'.$api, new $controller);   }});$app->error(function(\Exception $e, $code) use($app) {   if ($app['debug']) return;   switch ($code) {       case 400:    $message = 'Bad request';    break;       case 403:    $message = 'Forbidden'; break;       case 404:    $message = 'API not found'; break;       default:    $message = 'Internal Error';   }   return new Response($message, $code);    });$app->after(function(Request $request, Response $response) use ($app) {   if ($app['debug'] && $response->getStatusCode() != 200)       return;   $response->headers->set('Content-type', 'text/json');});$app->run();?>
Lien vers le commentaire
Partager sur d’autres sites

Je me lance sans filets, n'ayant jamais touché à Symphony jusqu'à maintenant. :transpi:

Mais la chose c'est que vu comment tu présentes ton problème, et le message d'erreur, tel que je te lis ça donne : "Symphony oblige mon code à retourner une valeur. Mon code ne retourne rien. Quelqu'un voit pourquoi ça ne fonctionne pas ?" :transpi::transpi:

Alors peut-être que ma non-connaissance de cet outil fait que ça n'est pas si simple. Mais si le fonctionnement est similaire à Struts (et de tête, Rails fonctionne comme ça aussi), la valeur retournée par le contrôleur sert à indiquer à Symphony quelle vue doit être construite par la suite. Et donc forcément, si le contrôleur ne fournit rien à Symphony, savoir quelle vue construire est quelque peu compliqué.

J'espère ne pas être totalement à l'ouest. J'avoue que je n'ai absolument aucune idée de comment le ServiceSecurityProvider fonctionne avec tout ça. :transpi::transpi::transpi:

Lien vers le commentaire
Partager sur d’autres sites

Merci pour ta participation !

Ta réponse serait presque correcte dans le cas général. Sauf que dans mon cas c'est une page spéciale (page check_path du SecurityProvider).

Normalement je n'ai pas à écrire le contrôleur pour cette page, c'est le module Security de Symfony qui est censé le faire.

Donc pour résumer il y a une erreur sur une partie du code que je ne contrôle pas donc je suppose que c'est un problème de configuration.

Une dernière chose c'est du Silex et non pas du Symfony :)

Encore merci d’essayer d'aider !

Lien vers le commentaire
Partager sur d’autres sites

sans filet également :

J'ai trouvé ça sur github

public function boot(Application $app){	// FIXME: in Symfony 2.2, this is a proper subscriber	//$app['dispatcher']->addSubscriber($app['security.firewall']);	$app['dispatcher']->addListener('kernel.request', array($app['security.firewall'], 'onKernelRequest'), 8)/>/>;	foreach ($this->fakeRoutes as $route) {		list($method, $pattern, $name) = $route;		$app->$method($pattern, function() {})->bind($name);	}}

et en comparant au tien tu as des />/>/> a la fin de la ligne

$app['dispatcher']->addListener('kernel.request', array($app['security.firewall'], 'onKernelRequest'), 8)/>;

et foreach n'est pas aligné correctement et comme je ne sais pas si le compilateur regarde l'indentation, alignement etc.

Sinon dans ta config tu as un ^ qui traine et me semble bizarre ?

'pattern' => '^/User',
Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...