2017-02-14 6 views
2

Привет я новичок в тонкий я застрял на этом кто-нибудь помочь, пожалуйста,Тонкий Callable UserController не существует RuntimeException

routes.php

$app->get('/', 'UserController:index'); 

dependencis.php

$container['src\UserController'] = function ($container) { 
    return new \src\UserController($container->get('settings')); 
}; 

UserController.php

namespace App\Controllers; 

use Psr\Http\Message\ServerRequestInterface as Request; 
use Psr\Http\Message\ResponseInterface as Response; 
use App\src\Controller; 
class UserController extends Controller { 
    public function index(Request $request, Response $response) { 
     return $this->db; 
    } 
} 

и controller.php

namespace App\src; 

class Controller { 
    protected $container; 
    public function __construct($c) { 
     $this->container = $c; 
    } 

    public function __get($property) { 
     if($this->container->has($property)) { 
      return $this->container->get($property); 
     } 
     return $this->{$property}; 
    } 
} 
+0

Вы уверены, что в своем контейнере вы должны вернуть 'new \ src \ UserController()', а не 'new \ App \ src \ UserController'? –

+0

$ container ['src \ UserController'] = function ($ container) { return new \ src \ UserController(); }; здесь это скорее всего из-за изменения пути \ src \ UserController(); и return new \ src \ UserController ($ contianer); –

+0

Привет @ShahzadNasir, у меня проблема, которая похожа на вашу. Могу ли я получить от вас помощь для этого: http://stackoverflow.com/questions/43449493/slim-framework-routing-http-requests-to-static-class-methods. Спасибо – red

ответ

2

Как вы определили свой маршрут как:

$app->get('/', 'UserController:index'); 

Затем вам нужно определить свой DI завод, как:

$container['UserController'] = function ($container) { 
    // return an instantiated UserController here. 
}; 

Вы также должны посмотреть, как пространство имен и сопоставление PSR-4 имени пространства имен работа в каталоге. В общем случае в имени пространства никогда не существует src, но вы видите пространство имен, такое как App, сопоставленное с вызовом каталога src в автозагрузчике композитора, как указано в composer.json.

Обычно это выглядит примерно так:

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

Это означает, что у вас есть каталог с именем src и любого класса внутри этого каталога, будет иметь базовое пространство имен из App, а затем другие каталоги выступают в качестве суб -namespaces.

т.е. если у вас есть файл с именем src/Controllers/UserController.php, то определение класса в этом файле будет:

<?php 
namespace App\Controllers; 
class UserController 
{ 
    // methods here 
} 

Следует также отметить, что капитализация файла совпадает с именем класса, а капитализация матча каталогов капитализация подэлементов.

Продолжая пример, я бы ожидать DI завод, чтобы выглядеть следующим образом:

$container['UserController'] = function ($container) { 
    return new \App\Controllers\UserController($container->get('settings')); 
}; 

Это действительно необычно видеть src в определении пространства имен, так что пройти и проверить, что ваши пространства имен и файлов на диске все совпадают, поскольку код в вопросе противоречив.

+0

Спасибо @ Rob Allen его сработало –

Смежные вопросы