我正在使用 PHP-DI 容器化将我的一个项目转移到 Slim Microframework 中。 我需要将一些 JSON 数据发布到 http://localhost/api/base (XAMPP) 并获得确认(至少在开始时)。 这是我的index.php:
<?php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;
use Slim\Exception\HttpMethodNotAllowedException;
use Slim\Exception\HttpNotFoundException;
use Slim\Routing\RouteContext;
use DI\ContainerBuilder;
// Set error reporting to display all errors
error_reporting(E_ALL);
ini_set('display_errors', 'On');
// Autoloading using Composer's autoload
require __DIR__ . '/../vendor/autoload.php';
// Include dependencies file
$container = require_once __DIR__ . '/../config/dependencies.php';
// Create Slim app
$app = AppFactory::create();
// Include routes
require __DIR__ . '/../src/routes.php';
$app->run();
这是routes.php:
<?php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use App\Controllers\HotelBaseController;
// Include dependencies file
$container = require_once __DIR__ . '/../config/dependencies.php';
// Define basic route
$app->get('/', function (Request $request, Response $response) {
$response->getBody()->write('Hello, World!');
return $response;
});
// Route for handling POST request to /api/base
$app->post('/api/base', function (Request $request, Response $response) use ($container) {
// Get the HotelBaseController service from the container
$hotelBaseController = $container->get('HotelBaseController');
// Call the handlePostRequest method
return $hotelBaseController->handlePostRequest($request, $response);
});
$app->get('/api/base/', function (Request $request, Response $response) {
return $response->withStatus(301)->withHeader('Location', '/api/base');
});
这是dependency.php:
<?php
use DI\ContainerBuilder;
// use Psr\Http\Message\ResponseInterface as Response;
// use Psr\Http\Message\ServerRequestInterface as Request;
require __DIR__ . '/../vendor/autoload.php';
// Create ContainerBuilder instance
$containerBuilder = new ContainerBuilder();
// Set up your container configuration
$containerBuilder->addDefinitions([
'HotelBaseController' => DI\create(\App\Controllers\HotelBaseController::class),
]);
// Build the container
return $containerBuilder->build();
最后,这是 hotelBaseController.php:
<?php
namespace App\Controllers;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
class HotelBaseController {
public function handlePostRequest(Request $request, Response $response) {
// Get the JSON data from the request body
$data = $request->getParsedBody();
// You can access the individual fields from the JSON data
$userId = $data['userId'] ?? '';
$apiKey = $data['apiKey'] ?? '';
$documentType = $data['document_type'] ?? '';
$hotelId = $data['hotel_id'] ?? '';
$hotelName = $data['name'] ?? '';
$res = 'Who knows';
return $res;
}
}
?>
发送任何包含简单 JSON 的 POST 请求时,我收到错误:
<b>Fatal error</b>: Uncaught Error: Call to a member function get() on bool in C:\xampp\htdocs\src\routes.php:20
Stack trace:
#0 C:\xampp\htdocs\vendor\slim\slim\Slim\Handlers\Strategies\RequestResponse.php(38):
{closure}(Object(Slim\Http\ServerRequest), Object(Slim\Http\Response), Array)
#1 C:\xampp\htdocs\vendor\slim\slim\Slim\Routing\Route.php(358):
Slim\Handlers\Strategies\RequestResponse->__invoke(Object(Closure), Object(Slim\Http\ServerRequest),
Object(Slim\Http\Response), Array)
#2 C:\xampp\htdocs\vendor\slim\slim\Slim\MiddlewareDispatcher.php(65):
Slim\Routing\Route->handle(Object(Slim\Http\ServerRequest))
#3 C:\xampp\htdocs\vendor\slim\slim\Slim\MiddlewareDispatcher.php(65):
Slim\MiddlewareDispatcher->handle(Object(Slim\Http\ServerRequest))
#4 C:\xampp\htdocs\vendor\slim\slim\Slim\Routing\Route.php(315):
Slim\MiddlewareDispatcher->handle(Object(Slim\Http\ServerRequest))
#5 C:\xampp\htdocs\vendor\slim\slim\Slim\Routing\RouteRunner.php(68):
Slim\Routing\Route->run(Object(Slim\Http\ServerRequest))
#6 C:\xampp\htdocs\vendor\slim\slim\Slim\MiddlewareDispatcher.php(65):
Slim\Routing\RouteRunner->handle(Object(Slim\Http\ServerRequest))
#7 C:\xampp\htdocs\vendor\slim\slim\Slim\App.php(199):
Slim\MiddlewareDispatcher->handle(Object(Slim\Http\ServerRequest))
#8 C:\xampp\htdocs\vendor\slim\slim\Slim\App.php(183): Slim\App->handle(Object(Slim\Http\ServerRequest))
#9 C:\xampp\htdocs\public\index.php(50): Slim\App->run()
#10 {main}
thrown in <b>C:\xampp\htdocs\src\routes.php</b> on line <b>20</b><br />
我想了解我在哪里犯了错误。 谢谢
错误消息包含
bool
?你有$container = require_once
吗?我很清楚发生了什么事。
看,
require_once
的作用与 require
不同。不仅因为它只需要一次代码,而且对于返回值的脚本也是如此。
您第一次需要它时,您将获得预期的值。
但是第二次,你只会得到
false
。那是因为文件已经加载过,所以没有再次加载。
遗憾的是,没有“全局 require_once 返回值缓存”。
您所要做的就是仅需要一次,然后传播该变量,而不是再次加载它。