为什么我不能在Slim的被调用函数中使用$ app?

时间:2013-07-28 14:48:10

标签: php json slim

我正在尝试制作一个可重复使用的功能,但每次我尝试在远程功能中使用$ app时,我都会看到一个空白屏幕。这是有用的:

$app = new \Slim\Slim();

//GET CHAPTERS
$app->get(
    '/chapters',
    function () use ($app) {
        $app->contentType('application/json');
        executeSql('SELECT * FROM chapters ORDER BY id');
    }
);

//GENERIC SQL EXECUTE
function executeSql($sql) {
    try {
        $db = getConnection();
        $stmt = $db->query($sql);  
        $results = $stmt->fetchAll(PDO::FETCH_OBJ);
        $db = null;
        echo json_encode($results);
    } catch(PDOException $e) {
        echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    }
}

但是我试图在函数中移动json标头并且无法使其工作(获取空白屏幕):

$app = new \Slim\Slim();

//GET CHAPTERS
$app->get(
    '/chapters',
    function () {
        executeSql('SELECT * FROM chapters ORDER BY id');
    }
);

//GENERIC SQL EXECUTE
function executeSql($sql) use ($app) {
        $app->contentType('application/json');
    try {
        $db = getConnection();
        $stmt = $db->query($sql);  
        $results = $stmt->fetchAll(PDO::FETCH_OBJ);
        $db = null;
        echo json_encode($results);
    } catch(PDOException $e) {
        echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    }
}

我的语法有问题或者我是如何使用PHP的?我也试过没有“使用($ app)”,但仍然存在同样的问题。

4 个答案:

答案 0 :(得分:13)

解决此问题的简便方法是使用getInstance();

function yourFunction(){
   $app = \Slim\Slim::getInstance();
}

答案 1 :(得分:5)

您总是可以将$ app对象作为参数传递给您的函数。

$app = new \Slim\Slim();

//GET CHAPTERS
$app->get(
    '/chapters',
    function () use ($app) {
        executeSql($app, 'SELECT * FROM chapters ORDER BY id');
    }
);

//GENERIC SQL EXECUTE
function executeSql(\Slim\Slim $app, $sql) {
        $app->contentType('application/json');
    try {
        $db = getConnection();
        $stmt = $db->query($sql);  
        $results = $stmt->fetchAll(PDO::FETCH_OBJ);
        $db = null;
        echo json_encode($results);
    } catch(PDOException $e) {
        echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    }
}

答案 2 :(得分:2)

将数据库调用和应用程序逻辑/表示分开保持更清晰。我会立即返回你的“章节”对象并处理executeSql函数之外的任何其他内容。

$app = new \Slim\Slim();

// GET CHAPTERS
$app->get('/chapters', function () use ($app) {

  $app->contentType('application/json');

  $chapters = executeSql('SELECT * FROM chapters ORDER BY id');

  if ($chapters) {
    $app->response->setStatus(200);
    echo json_encode($results);
  } else {
    $app->response->setStatus(400);
    echo '{"error":{"text":"error getting chapters"}}';
  }

});

// GENERIC SQL EXECUTE
function executeSql($sql) {
  try {
    $db = getConnection();
    $stmt = $db->query($sql);  
    $results = $stmt->fetchAll(PDO::FETCH_OBJ);
    $db = null;
    return $results;
  } catch(PDOException $e) {
    echo '{"error":{"text":'. $e->getMessage() .'}}'; 
  }
}

答案 3 :(得分:0)

use关键字仅适用于闭包构造,除了使用命名空间。所以你不支持使用常规功能。你将不得不使用通常被认为是不良做法的global $app