2017-02-14 60 views
2

嗨,我是新來的苗條我停留在這個任何人的幫助,請修身贖回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,但您可以在composer.json中指定的名稱空間(例如App)映射到Composer自動加載器中調用src的目錄。

通常情況下,它看起來是這樣的:

"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的工作 –