web-dev-qa-db-ja.com

Slimコントローラーの問題:ContainerInterfaceのインスタンスである必要があり、Slim \\ Containerのインスタンスが指定されている必要があります

Slimでコントローラーを使おうとしていますが、エラーが発生し続けます

PHPのキャッチ可能な致命的なエラー:引数1がに渡されました
TopPageController :: __construct()はContainerInterfaceのインスタンスである必要があります。
Slim\Containerのインスタンスが指定されました

私のindex.php

<?php
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;

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

spl_autoload_register(function ($classname) {
    require ("../classes/" . $classname . ".php");
});

$app = new \Slim\App(["settings" => $config]);
$app->get('/', function (Request $request, Response $response) {
    $response->getBody()->write("Welcome");
    return $response;
});
$app->get('/method1', '\TopPageController:method1');
$app->run();
?>

私のTopPageController.php

<?php
class TopPageController {
   protected $ci;
   //Constructor
   public function __construct(ContainerInterface $ci) {
       $this->ci = $ci;
   }

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

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

   public function method3($request, $response, $args) {
        //your code
        //to access items in the container... $this->ci->get('');
        $response->getBody()->write("Welcome3");
        return $response;
   }
}
?>

ありがとう。 Slim3を使用しています。

8
lost111in

あなたのコードは、 http://www.slimframework.com/docs/objects/router.html のSlim 3ドキュメントに基づいているようです。これには、例外がスローされないようにするために必要なすべてのコードが含まれていません。 。

基本的に、それを機能させるには2つのオプションがあります。

オプション1:

RequestResponseに対して行われているのと同じように、index.phpに名前空間をインポートします。

use \Interop\Container\ContainerInterface as ContainerInterface;

オプション2:

TopPageControllerのコンストラクターを次のように変更します。

public function __construct(Interop\Container\ContainerInterface $ci) {
    $this->ci = $ci;
}

TL; DR

例外がスローされる理由は、Slim\ContainerクラスがInterop\Container\ContainerInterfaceインターフェイスを使用しているためです(ソースコードを参照)。

use Interop\Container\ContainerInterface;

Slim\ContainerPimple\Containerを拡張しているため、以下はすべて、コントローラーのメソッドに対して有効な(機能する)型宣言である必要があります。

public function __construct(Pimple\Container $ci) {
    $this->ci = $ci;
}

...あるいは...

public function __construct(ArrayAccess $ci) {
    $this->ci = $ci;
}
16
Werner

以下のコードをコントローラーに貼り付けるだけです

use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;
use \Interop\Container\ContainerInterface as ContainerInterface;

コントローラの構成は次のようになります。

public function __construct(ContainerInterface $container) {
        parent::__construct($container);

    }

ContainerInterfaceのコントローラーで名前空間を指定するのを間違えていると思います。

2
user5271805