2017-12-09 7 views
0

Project StructureSchlanke Rahmen Nachricht: Callable Homecontroller nicht


public/index.php

<?php 


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

ini_set('display_errors', 'On'); 

if (PHP_SAPI == 'cli-server') { 
    // To help the built-in PHP dev server, check if the request was actually for 
    // something which should probably be served as a static file 
    $url = parse_url($_SERVER['REQUEST_URI']); 
    $file = __DIR__ . $url['path']; 
    if (is_file($file)) { 
     return false; 
    } 
} 



session_start(); 

// Instantiate the app 
$settings = require __DIR__ . '/../src/settings.php'; 



$app = new \Slim\App($settings); 

// Set up dependencies 
require __DIR__ . '/../src/dependencies.php'; 

// Register middleware 
require __DIR__ . '/../src/middleware.php'; 

// Register routes 
require __DIR__ . '/../src/routes.php'; 

// Run app 
$app->run(); 

Hier existiert haben wir die composer.json

Hier
{ 

"autoload":{ 
    "psr-4": { 
     "App\\": "src" 
    } 
}, 

"require": { 
    "php": ">=5.5.0", 
    "slim/slim": "^3.1", 
    "slim/php-view": "^2.0", 
    "monolog/monolog": "^1.17", 
    "illuminate/database": "~5.1", 
    "slim/twig-view": "^2.3" 
}, 
"require-dev": { 
    "phpunit/phpunit": ">=4.8 < 6.0" 
}, 

"autoload-dev": { 
    "psr-4": { 
     "Tests\\": "tests/" 
    } 
}, 
"config": { 
    "process-timeout" : 0 
}, 
} 

ist mein Controller, ich einen Fehler mit dem Namensraum erhalten und in allen Beispielen, die ich dies so gesehen haben, verwenden .. Ich weiß nicht, was mehr

<?php 

namespace \App\Controllers; 

class Homecontroller 
{ 
    protected $container; 

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

    public function home($request, $response, $args) { 
     echo "locura"; 
     // 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; 
    } 
} 
zu tun

Tatsächliche Konfiguration In meinem routes.php ich diese gesetzt haben:

$app->get('/new', \Homecontroller::class . ':home'); 

Vor der Konfiguration

In dem obigen Code, habe ich versucht, den Controller in die Behälter zu schaffen, und dann

$app->get('/new', '\HomeController:home'); 

verwenden Und in den dependencies.php Ich habe Dieser Code:

$container['HomeController'] = function($c) { 
$view = $c->get("view"); // retrieve the 'view' from the container 
return new HomeController($view); 

};

aber ich habe bekommen kein Ergebnis mit jeder Konfiguration


Ich möchte die Homecontroller von Router laden

Dies ist der Fehler, die ich habe, wenn ich setzen api.powertv/neu

Type: RuntimeException 
Message: Callable Homecontroller does not exist 
File:  /Users/alfonso/Sites/powertv_api/vendor/slim/slim/Slim/CallableResolver.php 
Line: 90 

Ich komme hierher, und ich stelle diesen Beitrag wie meine letzte Ressource, wenn dies fehlschlägt, weiß ich nicht, was ich tun werde.

+0

wenn u an den Controller Verzeichnis beziehen Der relative Pfad lautet: src/controllers. Wie füge ich genau eine andere Zeile hinzu? – Ratchet

+0

Ich bin großartig, dass Sie versucht haben, mir zu helfen, aber es funktioniert nicht :( – Ratchet

+0

Lesen Sie diesen Abschnitt der Composer-Dokumentation https://getcomposer.org/doc/04-schema.md#classmap Ich denke, es wird helfen. – Nima

Antwort

0

Versuchen in Ihrem absoluten Namespace-Pfad zu verwenden:

  1. dependencies.php

     
    $container['yourController'] = function ($c) { 
        $view = $c['view']; 
        return new \App\Controllers\YourController($view); 
    } 
    
  2. Routen.php

     
        $app->get('your_defined_route_name', \App\Controllers\YourController::class . ':YourControllerMethod'); 
    
+0

Es ist das erste Mal, dass ich einen anderen Fehler im Browser erhalte: Typ: Fehler Nachricht: Undefinierte Konstante 'App \ Controller' Datei: /Users/alfonso/Sites/powertv_api/src/Controllers/HomeController.php Zeile: 5. Diese Konstante ist der Namensraum, also nehme ich an, dass ich jetzt den composer.json modifizieren muss ?? aber wie? – Ratchet

+0

die compose.json war gut, wenn ich das in routes.php $ app-> get ('/ neu', '\ App \ controllers \ HomeController: home'); und im Heim-Controller in Zeile 3: Namespace App \ Controller; Es funktioniert für mich, danke Mann. Das Problem war, dass der Namespace in Zeile 5 war, nicht in 3. – Ratchet

0

Der Name im Inneren des Behälters und thoose, die Sie in der Route verwenden Muss Spiel Sie haben den Container Schlüssel zum HomeController und verwendet \HomeController in der Route gesetzt worden ist, sind diese Strings nicht gleich.

entweder selbst die Saiten

$container['HomeController'] = function($c) { 
    $view = $c->get("view"); // retrieve the 'view' from the container 
    return new HomeController($view); 
}; 
$app->get('/new', 'HomeController:home'); 

oder verwenden Sie die ::class Syntax für beide erstellen:

$container[HomeController::class] = function($c) { 
    $view = $c->get("view"); // retrieve the 'view' from the container 
    return new HomeController($view); 
}; 
$app->get('/new', [HomeController::class, 'home'); 
// or $app->get('/new', HomeController::class . ':home'); 
+0

Ich habe die 2 Optionen versucht und funktioniert nicht, erhalte ich diesen Fehler: Typ: Fehler Nachricht: Klasse 'HomeController' nicht gefunden File:/Users/alfonso/Sites/powertv_api/src/dependencies.php Zeile: 52 Ich muss auch sagen, dass im HomeController, wenn ich mit PHP storm entwickeln der Namespace gibt mir den nächsten Fehler: undefined Constant Controllers. Vielleicht habe ich den Fehler hier. – Ratchet

0

mit der Antwort von Pheara ich einen anderen Fehler zu erhalten, ist der nächste:

Type: Error 
Message: Undefined constant 'App\controllers' 
File:/Users/alfonso/Sites/powertv_api/src/Controllers/HomeController.php 
Line: 5 

die Spur des Fehlers ist der nächste:

/Users/alfonso/Sites/powertv_api/vendor/composer/ClassLoader.php(444): include() 
#1 /Users/alfonso/Sites/powertv_api/vendor/composer/ClassLoader.php(322): Composer\Autoload\includeFile('/Users/alfonso/...') 
#2 [internal function]: Composer\Autoload\ClassLoader- >loadClass('App\\Controllers...') 
#3 [internal function]: spl_autoload_call('App\\Controllers...') 
#4 /Users/alfonso/Sites/powertv_api/vendor/slim/slim/Slim/CallableResolver.php(89): class_exists('App\\Controllers...') 
#5 /Users/alfonso/Sites/powertv_api/vendor/slim/slim/Slim/CallableResolver.php(67): Slim\CallableResolver->resolveCallable('App\\Controllers...') 
#6 /Users/alfonso/Sites/powertv_api/vendor/slim/slim/Slim/CallableResolverAwareTrait.php(45): Slim\CallableResolver->resolve('App\\Controllers...') 
#7 /Users/alfonso/Sites/powertv_api/vendor/slim/slim/Slim/Route.php(330): Slim\Routable->resolveCallable('App\\Controllers...') 
#8 /Users/alfonso/Sites/powertv_api/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(117): Slim\Route->__invoke(Object(Slim\Http\Request), Object(Slim\Http\Response)) 
#9 /Users/alfonso/Sites/powertv_api/vendor/slim/slim/Slim/Route.php(313): Slim\Route->callMiddlewareStack(Object(Slim\Http\Request), Object(Slim\Http\Response)) 
#10 /Users/alfonso/Sites/powertv_api/vendor/slim/slim/Slim/App.php(495): Slim\Route->run(Object(Slim\Http\Request), Object(Slim\Http\Response)) 
#11 /Users/alfonso/Sites/powertv_api/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(117): Slim\App->__invoke(Object(Slim\Http\Request), Object(Slim\Http\Response)) 
#12 /Users/alfonso/Sites/powertv_api/vendor/slim/slim/Slim/App.php(388): Slim\App->callMiddlewareStack(Object(Slim\Http\Request), Object(Slim\Http\Response)) 
#13 /Users/alfonso/Sites/powertv_api/vendor/slim/slim/Slim/App.php(296): Slim\App->process(Object(Slim\Http\Request), Object(Slim\Http\Response)) 
#14 /Users/alfonso/Sites/powertv_api/public/index.php(39): Slim\App->run() 
#15 {main} 

Für diesen Fehler lösen Sie den Namespace in der 3-Spiel zu setzen haben:

<?php 

namespace [yournamespace] 

//rest of your controller 
Verwandte Themen