2016-06-19 26 views
5

Sto cercando di utilizzare controller Slim tuttavia continuo a ricevere l'erroreproblema del controller Slim: deve essere un'istanza di ContainerInterface, istanza di Slim \ Container dato

PHP errore fatale catchable: Argomento 1 passato a
TopPageController :: __ construct() deve essere un'istanza di ContainerInterface,
istanza di Slim \ Container dato

mio 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(); 
?> 

My 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; 
    } 
} 
?> 

Grazie. Sto usando Slim 3.

+1

Non si dispone dello spazio dei nomi corretto sulla ContainerInterface. Dovrebbe essere 'Interop \ Container \ ContainerIterface' – geggleto

risposta

12

Il tuo codice sembra essere basato sulla documentazione di Slim 3 allo http://www.slimframework.com/docs/objects/router.html che non contiene tutto il codice richiesto per evitare l'eccezione generata.

In pratica hai due opzioni per farlo funzionare.

Opzione 1:

importare lo spazio nella vostra index.php, proprio come è stato fatto per Request e Response:

use \Interop\Container\ContainerInterface as ContainerInterface; 

Opzione 2:

Cambiare il costruttore del TopPageController:

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

TL; DR

Il motivo viene generata l'eccezione è che la classe Slim\Container sta utilizzando l'interfaccia Interop\Container\ContainerInterface (vedere il codice sorgente):

use Interop\Container\ContainerInterface; 

Dal Slim\Container è estendendo Pimple\Container, le seguenti dichiarazioni dovrebbero essere valide (funzionanti) di tipo per il metodo del controller:

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

... o anche ...

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

semplicemente incollare sotto il codice nel controller

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

costrutto del controller dovrebbe essere alla ricerca come qui di seguito

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

    } 

Penso che tu stia sbagliando dando namep spazio nel controller per ContainerInterface.