Каков правильный интерфейс для контейнера Slim? - PullRequest
0 голосов
/ 19 мая 2018

Я пытаюсь реализовать часть Allow Slim to instantiate the controller, описанную https://www.slimframework.com/docs/v3/objects/router.html.. При этом я получаю следующую ошибку:

Аргумент 1 передан Michael \ Test \ HomeController:: __ construct () должен быть экземпляром Slim \ ContainerInterface, экземпляром Slim \ Container, указанным в /var/www/slimtest/vendor/slim/slim/Slim/CallableResolver.php в строке 93

Думая, что это могло быть связано с пространством имен, я также попытался в пространстве имен \, но получил ту же ошибку.

Является ли документация по https://www.slimframework.com/docs/v3/objects/router.html неверной и должен ли тип объявления аргумента конструктора HomeController бытьSlim\Container, или я что-то не так делаю, а Slim\ContainerInterface правильно?

<?php
namespace Michael\Test;

error_reporting(E_ALL);
ini_set('display_startup_errors', 1);
ini_set('display_errors', 1);

require '../vendor/autoload.php';

use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;

$app = new \Slim\App();
$container = $app->getContainer();
//$container['view'] = function ($c) {};

//Question.  Do I need to use the fully qualified class name???
$app->get('/', \Michael\Test\HomeController::class . ':home');
//$app->get('/', '\Michael\Test\HomeController:home');

$app->run();

Домашний контроллер

namespace Michael\Test;
class HomeController
{
    protected $container;

    // constructor receives container instance
    public function __construct(\Slim\ContainerInterface $container) {
        $this->container = $container;
    }

    public function home($request, $response, $args) {
        // your code
        // to access items in the container... $this->container->get('');
        return $response;
    }

    public function contact($request, $response, $args) {
        // your code
        // to access items in the container... $this->container->get('');
        return $response;
    }
}

1 Ответ

0 голосов
/ 19 мая 2018

\Slim\ContainerInterface не существует (см. здесь ).Если посмотреть на реализацию \Slim\Container, интерфейс, который вам нужно использовать, это Interop\Container\ContainerInterface или вы можете просто использовать реализацию Slim \Slim\Container в качестве параметра типа.

...