par
Zef » 18 mars 2013, 23:59
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).
<?php
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);
}
}
?>
Je ne comprend pas comment résoudre ce problème...
Pour information voici ma config:
<?php
define('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/login2',
'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 API
call_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();
?>
Pour tomber sur l'erreur en question j'appel le script avec l'url: localhost/Higgs/User/login2 sachant que Higgs un link vers le dossier "web" de mon projet.
Merci de votre aide !
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).
[php]<?php
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);
}
}
?>[/php]
Je ne comprend pas comment résoudre ce problème...
Pour information voici ma config:
[php]<?php
define('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/login2',
'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 API
call_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();
?>[/php]
Pour tomber sur l'erreur en question j'appel le script avec l'url: localhost/Higgs/User/login2 sachant que Higgs un link vers le dossier "web" de mon projet.
Merci de votre aide !