Php 为什么可以';我不能在Slim的调用函数中使用$app吗?
我试图创建一个可重用的函数,但每次我尝试在远程函数中使用$app时,都会出现一个空白屏幕。以下是工作原理:Php 为什么可以';我不能在Slim的调用函数中使用$app吗?,php,json,slim,Php,Json,Slim,我试图创建一个可重用的函数,但每次我尝试在远程函数中使用$app时,都会出现一个空白屏幕。以下是工作原理: $app = new \Slim\Slim(); //GET CHAPTERS $app->get( '/chapters', function () use ($app) { $app->contentType('application/json'); executeSql('SELECT * FROM chapters OR
$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头,不能让它工作(得到空白的白屏):
我的语法或如何使用PHP有什么问题吗?我也尝试过完全不使用“use($app)”,但仍然存在相同的问题。除了使用名称空间之外,
use
关键字只适用于闭包构造。因此,不支持使用常规函数执行的操作。您必须使用global$app
,这通常被认为是不好的做法。您可以始终将$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() .'}}';
}
}
$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() .'}}';
}
}
解决这个问题的简单方法是使用getInstance()
将数据库调用和应用程序逻辑/表示分离会更干净。我会立即返回您的“chapters”对象,并处理executeSql函数之外的任何其他内容
$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() .'}}';
}
}
$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() .'}}';
}
}
你得到一张空白页后有没有出现错误?还有其他方法吗?当前我正在将$app对象作为参数传递。我不知道这样做对不对为什么不?您唯一的其他选择是使用全局声明访问Slim对象。您通常不希望使用全局变量。将细长对象作为参数传递是一种称为的模式。DI是一个很好的实践,因为它将函数中的代码与其依赖的依赖项解耦。您好,感谢这段代码。但我是一个PHP新手,这里的任何人都可以验证这是正确的方法。是的,Slim developer专门创建了getInstance方法,以便在函数中使用$app