无法在 Slim 中调用现有的内部路由 API
Unable to call existing internal routes in a Slim API
我目前正在开发一个RESTfulAPI来维护一些数据库。理想情况下,我 应该 能够从我的应用程序中的另一条路线调用我的 APIs 路线,对吗?
我试过使用 subRequest
来调用现有路由,但无济于事。
在邮递员中执行我的路线时,我得到的只是以下内容:
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<title>Slim Application Error</title>
<style>body{margin:0;padding:30px;font:12px/1.5 Helvetica,Arial,Verdana,sans-serif;}h1{margin:0;font-size:48px;font-weight:normal;line-height:48px;}strong{display:inline-block;width:65px;}</style>
</head>
<body>
<h1>Slim Application Error</h1>
<p>A website error has occurred. Sorry for the temporary inconvenience.</p>
</body>
</html>
以下是我的 companies.php
API 路线,可以让所有公司进入 table 并将新公司放入 companies
table。
<?php
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;
// Get all companies
$app->get('/companies', function(Request $request, Response $response) {
$sql = "SELECT * FROM companies";
try {
// Get DB Object
$db = new db();
// Connect
$db = $db->connect();
$stmt = $db->query($sql);
$companies = $stmt->fetchAll(PDO::FETCH_OBJ);
$db = null;
echo '{"data":' . json_encode($companies) . '}';
} catch(PDOException $e) {
echo '{"error": { "text":' . $e->getMessage() . '}}';
}
});
// Add new company to companies table
$app->put('/new/company/{companyName}', function(Request $request, Response $response) {
$newCompany = $request->getAttribute('companyName');
$insert_sql = "INSERT INTO companies (company_name) VALUE (:newCompany)";
try {
$db = new db();
$db = $db->connect();
$insert_stmt = $db->prepare($insert_sql);
$newCompany = str_replace("'", "", $newCompany);
$insert_stmt->bindParam(':newCompany', $newCompany);
$insert_stmt->execute();
$newID = $db->lastInsertId();
$db = null;
echo '{"notice": {"text": "New Company Added (cid: '.$newID.')"}';
} catch(PDOException $e) {
echo '{"error": { "text":' . $e->getMessage() . '}}';
}
});
在另一条路线内,sites.php
,我想运行 PUT->'/new/company'
路线。所以,在 sites.php
的某个地方,我放置了以下内容:
$destinationComp = "myNewCompany";
$res = $this->subRequest('PUT', '/new/company/' . $destinationComp);
echo $res;
我希望我的输出与我从 Postman 手动发出 PUT 请求一样,而不是第一个代码部分中列出的错误。
此外,我尝试修改我的路由调用以包含 use ($app)
,希望通过 $app
变量而不是 $this
发出常规请求,案例 [=23] =] 没有工作。看起来像:
$app->put('/new/site/{sourceCompany}/{sourceProperty}/{destinationCompany}/{destinationProperty}', function(Request $request, Response $response) use ($app) {
$destinationComp = "myNewCompany";
$res = $app->put("/new/company/$destinationComp");
echo $res;
//More code to follow...
}
仅在执行时在 Postman 中收到相同的错误消息。
有什么建议吗?
您正试图调用 Container class 上的 subRequest 方法,而它应该是 App class。
inside route closure, $this is bound to the instance of Slim\Container
- Slim docs
改为引用 $app 变量,使用 use 关键字注入它。此外,return 响应对象而不是 echo:
return $app->subRequest('PUT', '/new/company/' . $destinationComp);
我目前正在开发一个RESTfulAPI来维护一些数据库。理想情况下,我 应该 能够从我的应用程序中的另一条路线调用我的 APIs 路线,对吗?
我试过使用 subRequest
来调用现有路由,但无济于事。
在邮递员中执行我的路线时,我得到的只是以下内容:
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<title>Slim Application Error</title>
<style>body{margin:0;padding:30px;font:12px/1.5 Helvetica,Arial,Verdana,sans-serif;}h1{margin:0;font-size:48px;font-weight:normal;line-height:48px;}strong{display:inline-block;width:65px;}</style>
</head>
<body>
<h1>Slim Application Error</h1>
<p>A website error has occurred. Sorry for the temporary inconvenience.</p>
</body>
</html>
以下是我的 companies.php
API 路线,可以让所有公司进入 table 并将新公司放入 companies
table。
<?php
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;
// Get all companies
$app->get('/companies', function(Request $request, Response $response) {
$sql = "SELECT * FROM companies";
try {
// Get DB Object
$db = new db();
// Connect
$db = $db->connect();
$stmt = $db->query($sql);
$companies = $stmt->fetchAll(PDO::FETCH_OBJ);
$db = null;
echo '{"data":' . json_encode($companies) . '}';
} catch(PDOException $e) {
echo '{"error": { "text":' . $e->getMessage() . '}}';
}
});
// Add new company to companies table
$app->put('/new/company/{companyName}', function(Request $request, Response $response) {
$newCompany = $request->getAttribute('companyName');
$insert_sql = "INSERT INTO companies (company_name) VALUE (:newCompany)";
try {
$db = new db();
$db = $db->connect();
$insert_stmt = $db->prepare($insert_sql);
$newCompany = str_replace("'", "", $newCompany);
$insert_stmt->bindParam(':newCompany', $newCompany);
$insert_stmt->execute();
$newID = $db->lastInsertId();
$db = null;
echo '{"notice": {"text": "New Company Added (cid: '.$newID.')"}';
} catch(PDOException $e) {
echo '{"error": { "text":' . $e->getMessage() . '}}';
}
});
在另一条路线内,sites.php
,我想运行 PUT->'/new/company'
路线。所以,在 sites.php
的某个地方,我放置了以下内容:
$destinationComp = "myNewCompany";
$res = $this->subRequest('PUT', '/new/company/' . $destinationComp);
echo $res;
我希望我的输出与我从 Postman 手动发出 PUT 请求一样,而不是第一个代码部分中列出的错误。
此外,我尝试修改我的路由调用以包含 use ($app)
,希望通过 $app
变量而不是 $this
发出常规请求,案例 [=23] =] 没有工作。看起来像:
$app->put('/new/site/{sourceCompany}/{sourceProperty}/{destinationCompany}/{destinationProperty}', function(Request $request, Response $response) use ($app) {
$destinationComp = "myNewCompany";
$res = $app->put("/new/company/$destinationComp");
echo $res;
//More code to follow...
}
仅在执行时在 Postman 中收到相同的错误消息。
有什么建议吗?
您正试图调用 Container class 上的 subRequest 方法,而它应该是 App class。
inside route closure, $this is bound to the instance of Slim\Container - Slim docs
改为引用 $app 变量,使用 use 关键字注入它。此外,return 响应对象而不是 echo:
return $app->subRequest('PUT', '/new/company/' . $destinationComp);