在类方法中访问函数变量

时间:2014-12-10 13:49:04

标签: php slim

我搜索了很多答案,但我找不到我需要的答案,因为我甚至不知道如何创建正确的问题。这是一个例子。

$app->map('/v1/:module/:group/:action(/:id)', function ($module, $group, $action, $id = NULL) use ($app) {

    $method = ucfirst($app->request->getMethod());
    $file = "modules/{$module}/{$group}/{$method}{$action}.php";

    if(!file_exists($file)) {
        $app->halt(404, Error::_('API Processor was not found!', 404));
    }

    include_once $file;

    $app->stop();
})

这是我瘦的restful框架的API方法。现在为Error::_('API Processor was not found!', 404)我有

class Error {
    public static function _($msg, $code = 500) {
        global $module, $group, $action;

        return json_encode(array(
            'error' => true,
            'code' => $code,
            'message' => $msg,
            'module' => $module
        ));
    }
} 

我希望操作系统能够访问$module, $group, $action个变量而不将它们传递给该函数。但就我而言,$moduleNULL

{
    "error":true,
    "code":404,
    "message":"API Processor was not found!",
    "module":null
}

可能的?

1 个答案:

答案 0 :(得分:1)

如果我使用Slim Error Handling功能正确理解了您的问题, 能够满足这些要求。如果它是我的项目,我会创建一个自定义异常,以便在您计划使用自定义错误函数的任何地方抛出。

注意 :以下所有代码都是未经测试的,并且在我的脑海中写下来。警告和所有这些。

class CustomErrorException extends \Exception
{
}

然后,无论我在哪里使用自定义错误函数,我都会抛出该异常。

if(!file_exists($file)) {
    throw new CustomErrorException('API Processor was not found!', 404);
}

最后,我写了一个看起来像这样的错误函数:

$app->error(function (\Exception $e) use ($app) {

    if ($e instanceof CustomErrorException) {
        // Parse $path to get $module, $group, and $action
        // (Seems like that would work based on the route in your example: '/v1/:module/:group/:action(/:id)')
        $path = $app->request->getPath();

        // Possible new method signature for Error::_
        Error::_($e->getMessage(), $e->getCode(), $module, $group, $action);

        // Render an error page, $app->halt(), whatever.
    }
});

这应该有助于DRY您的代码,并允许您转储这些global变量。