Невозможно вызвать существующие внутренние маршруты в Slim API

В настоящее время я разрабатываю RESTful API для поддержки ряда баз данных. В идеале я должен быть в состоянии вызывать маршруты моих API из другого маршрута в моем приложении, правильно?

Я пытался использовать 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-маршруты, чтобы собрать все компании в таблицу и поместить новую компанию в companies Таблица.

<?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;

Я ожидаю, что мой вывод будет таким же, как если бы я сделал запрос PUT вручную от Postman, вместо ошибки, указанной в первом разделе кода.

Кроме того, я попытался изменить мой маршрутный вызов, чтобы включить use ($app) в надежде сделать регулярный запрос через $app переменная, а не $thisэто случай $this не работал Который выглядел как:

$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...
}

Только для получения того же сообщения об ошибке в Почтальоне при исполнении.

Какие-либо предложения?

0

Решение

Вы пытаетесь вызвать метод subRequest для класса Container, когда это должен быть класс App.

закрытие внутреннего маршрута, $ this привязано к экземпляру Slim \ Container
Тонкие документы

Вместо этого назовите переменную $ app, добавьте ее с ключевым словом use. Кроме того, возвращайте объект ответа вместо выполнения echo:

return $app->subRequest('PUT', '/new/company/' . $destinationComp);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]