Совместное использование одного и того же экземпляра объекта: auryn vs. PHP -DI - PullRequest
1 голос
/ 06 февраля 2020

Я пытаюсь создать свое первое приложение без фреймворка PHP и следую этому руководству . Я относительно новичок в некоторых концепциях, описанных в руководстве. Несмотря на это, я решил использовать в качестве инжектора зависимостей PHP -DI вместо предложенного ( rdlowrey / auryn ).

Я создал все в соответствии с руководством, за исключением файла Bootstrap.php (и файл Dependencies.php:

<?php declare(strict_types = 1);

require(__DIR__ . '/../vendor/autoload.php');

...

$container = include('Dependencies.php');
$request = $container->make('Http\HttpRequest');
$response = $container->make('Http\HttpResponse');

...

switch ($routeInfo[0]) {
    ...
    case \FastRoute\Dispatcher::FOUND:
        $className = $routeInfo[1][0];
        $method = $routeInfo[1][1];
        $vars = $routeInfo[2];

        $class = $container->make($className);
        $class->$method($vars); // (**)
        break;
}

echo $response->getContent(); // (*)

$class может быть только экземпляром Homepage класс, который имеет только один метод (show()), вызываемый в (**):

class Homepage
{
    private $request;
    private $response;
    private $renderer;

    public function __construct(
        Request $request, 
        Response $response,
        Renderer $renderer
    ) {
        $this->request = $request;
        $this->response = $response;
        $this->renderer = $renderer;
    }

    public function show() {
        $data = [
            'name' => $this->request->getParameter('name', 'stranger'),
        ];
        $html = $this->renderer->render('Homepage', $data);
        $this->response->setContent($html); // (***)
    }
}

С учетом всего вышесказанного, приложение возвращает ответ HTTP 200 с пустым телом [здесь (*) ] но если я попытаюсь напечатать содержимое ответа HTTP после (***), я получу правильный ответ. Это может означать, что есть два разных экземпляра класса HttpResponse. (Это верно?)

Используя rdlowrey / auryn, автор учебника, использовал метод share() для совместного использования одного и того же экземпляра HttpReponse среди классов, как показано в «оригинальном» файле Dependencies.php:

<?php declare(strict_types = 1);
use \Auryn\Injector;
...
$injector = new Injector;
$injector->alias('Http\Response', 'Http\HttpResponse');
$injector->share('Http\HttpResponse');
...
return $injector;

Is Есть ли способ получить то же поведение, используя PHP -DI (с PHP определениями)?

Вот моя версия Dependencies.php:

<?php declare(strict_types = 1);

$definitions = [
    'Http\Request' => DI\create('Http\HttpRequest')->constructor(
        $_GET, $_POST, $_COOKIE, $_FILES, $_SERVER),
    'Http\HttpRequest' => function () {
        $r = new Http\HttpRequest($_GET, $_POST, $_COOKIE, $_FILES, $_SERVER);
        return $r;
    },
    'Http\Response' => DI\create('Http\HttpResponse'),

    'Twig\Environment' => function () {
        $loader = new Twig\Loader\FilesystemLoader(
            dirname(__DIR__) . '/templates');
        $twig = new Twig\Environment($loader);
        return $twig;
    },

    'Example\Template\TwigRenderer' => function (Twig\Environment $renderer) {
        return new Example\Template\TwigRenderer($renderer);
    },
    'Example\Template\Renderer' => DI\create(
        'Example\Template\TwigRenderer')->constructor(
            DI\get('Twig\Environment')),
];

$containerBuilder = new DI\ContainerBuilder;
$containerBuilder->addDefinitions($definitions);
$container = $containerBuilder->build();
return $container;

1 Ответ

0 голосов
/ 07 февраля 2020

В Bootstrap.php получение (get()) HttpRequest / HttpResponse экземпляров вместо создания (make()) их решило проблему.

...
$container = include('Dependencies.php');
$request = $container->get('Http\HttpRequest');
$response = $container->get('Http\HttpResponse');
...

Как четко указано в документация :

Метод make () работает подобно get (), за исключением того, что он разрешает запись при каждом вызове. [..] если запись является объектом, каждый раз будет создаваться новый экземпляр [..]

...