PHP-DI 容器中的精简路由

问题描述 投票:0回答:1

我正在使用 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-&gt;__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-&gt;handle(Object(Slim\Http\ServerRequest))
#3 C:\xampp\htdocs\vendor\slim\slim\Slim\MiddlewareDispatcher.php(65):
Slim\MiddlewareDispatcher-&gt;handle(Object(Slim\Http\ServerRequest))
#4 C:\xampp\htdocs\vendor\slim\slim\Slim\Routing\Route.php(315):
Slim\MiddlewareDispatcher-&gt;handle(Object(Slim\Http\ServerRequest))
#5 C:\xampp\htdocs\vendor\slim\slim\Slim\Routing\RouteRunner.php(68):
Slim\Routing\Route-&gt;run(Object(Slim\Http\ServerRequest))
#6 C:\xampp\htdocs\vendor\slim\slim\Slim\MiddlewareDispatcher.php(65):
Slim\Routing\RouteRunner-&gt;handle(Object(Slim\Http\ServerRequest))
#7 C:\xampp\htdocs\vendor\slim\slim\Slim\App.php(199):
Slim\MiddlewareDispatcher-&gt;handle(Object(Slim\Http\ServerRequest))
#8 C:\xampp\htdocs\vendor\slim\slim\Slim\App.php(183): Slim\App-&gt;handle(Object(Slim\Http\ServerRequest))
#9 C:\xampp\htdocs\public\index.php(50): Slim\App-&gt;run()
#10 {main}
thrown in <b>C:\xampp\htdocs\src\routes.php</b> on line <b>20</b><br />

我想了解我在哪里犯了错误。 谢谢

php post routes slim php-di
1个回答
0
投票

错误消息包含

bool
?你有
$container = require_once
吗?我很清楚发生了什么事。

看,

require_once
的作用与
require
不同。不仅因为它只需要一次代码,而且对于返回值的脚本也是如此。

您第一次需要它时,您将获得预期的值。

但是第二次,你只会得到

false
。那是因为文件已经加载过,所以没有再次加载。

遗憾的是,没有“全局 require_once 返回值缓存”。

您所要做的就是仅需要一次,然后传播该变量,而不是再次加载它。

© www.soinside.com 2019 - 2024. All rights reserved.