在Silex中处理ResourceNotFoundException

时间:2017-11-16 17:53:02

标签: symfony silex

我正在尝试重构一个较旧的代码库来使用Silex - 我的想法是我可以让Silex处理它理解的所有操作 - 并推迟它对传统控制器架构所做的一切:

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

// TODO: Refactor old actions into Silex incrementally 
//$app->get('/hello/{name}', function ($name) use ($app) {
//    return 'Hello ' . $app->escape($name);
//});

// NOTE: Defer handling to legacy controllers:actions
$app->error(function (\Symfony\Component\Routing\Exception\ResourceNotFoundException $e, $code) {
    echo 'Silex not provided URL - default to legacy';
    try {

        $response = new Spectra_Application_Environment_Http_Response();
        $request = new Spectra_Application_Environment_Http_Request();

        $router = new Spectra_Application_Controller_Router_Adapter(
          $_SERVER['PATH_INFO'], $request, new Common_Controller_Router($GLOBALS['AQUARIUS']['ROUTES'], key($GLOBALS['AQUARIUS']['ROUTES']))
        );

        $front = Spectra_Application_Controller_Front::getInstance();
        $front->setResponseObject($response)->setRequestObject($request);

        $front->addPrePluginFilter(new Common_Controller_Filter_ActionCheck());

        echo cadorath_main($router, $front)->sendResponse();
    }
    catch (Exception $e) {
        $result['success'] = false;
        $result['errors']['reason'] = $e->getMessage();

        header('Content-Type: application/json');
        echo json_encode($result);
    }
});

$app->run();

这不起作用。我怎么不理解Silex异常处理是如何工作的?

1 个答案:

答案 0 :(得分:0)

对不起,但在我给你答案之前,我觉得我必须指出一些事情,这对评论领域来说太长了。请把它们作为友好的建议,而不是批评。

首先,Silex很快就会停产。由于您刚刚开始迁移代码库,我建议使用不同的微内核框架(如SlimPHP或Lumen)或使用Flex切换到Symfony 4。后者可能与您使用相同组件的体验最接近,因为它使用相同的组件,它只是为您提供了一个更简单的途径,使用Symfony的功能扩展您的应用程序,而无需使用Silex手动连接所有内容。提供者逻辑。

我要提出的第二点是你使用echo:它可能在那里用于调试目的,但如果没有,请注意这个"打破"大多数框架,因为它们通常有一些在运行时触发的事件系统,只是打印出绕过的东西,在某些情况下甚至打破了那些。当您使用Silex / Symfony时,您应该使用Request和Response对象来处理传入和传出数据,如果要传递它们,请使用return。所以在你的情况下,而不是做

header('Content-Type: application/json');
echo json_encode($result);

你可以这样做:

return new JsonResponse($result);

当您使用JsonResponse对象时,它将为您设置标头并执行JSON编码。所以它比以前更容易和更短。

关于您的实际问题,请提供有关您获得的错误的更多信息。也许检查您的应用程序或服务器日志(apache,nginx,...)。

我最初的假设是您用于遗留应用程序的请求不包含所有必要信息。您可能必须从Symfony的Request对象或" fix"转移一些数据。一些值指向您的新应用程序,而不是遗留应用程序(例如SCRIPT_PATH),这可能会破坏旧代码中的某些假设。一般来说,尝试识别遗留代码库的哪些部分使用全局变量并检查这些值是否正确设置或重构您的应用程序以不需要那些全局变量,而是从配置文件中读取它们。例如。