2017-09-02 19 views
0

我正在使用php-di中的依賴注入。請求首先到達配置php-di的route.php文件(例如,當需要IAccountService時使用AccountService),然後容器被要求創建適當的控制器。 route.php的源代碼是如下:PHP-DI不注入所需的類

<?php 
    spl_autoload_register(function ($class_name) { 
    switch ($class_name){ 
     case 'AccountController': 
     require_once 'controllers/account_controller.php'; 
     break; 
     case 'AccountService': 
     case 'IAccountService': 
     require_once 'services/account_service.php'; 
     break; 
     case 'URLHELPER': 
     require_once 'helpers/URLHELPER.php'; 
     break; 
     case 'STRINGHELPER': 
     require_once 'helpers/STRINGHELPER.php'; 
     break; 
     case 'STRINGHELPER': 
     require_once "helpers/HASHHELPER.php"; 
     break; 
    } 
    }); 

    function call($controller, $action) { 
    $container = DI\ContainerBuilder::buildDevContainer(); 
    $container->set('IAccountService', \DI\object('AccountService')); 

    // require the file that matches the controller name 
    require_once('controllers/' . $controller . '_controller.php'); 

    // create a new instance of the needed controller 
    switch($controller) { 
     case 'home': 
     $controller = $container->get('HomeController'); 
     case 'account': 
     $controller = $container->get('AccountController'); 
     break; 
    } 

    // call the action 
    $controller->{ $action }(); 
    } 

    // just a list of the controllers we have and their actions 
    // we consider those "allowed" values 
    $controllers = array(
    'home' => ['index', 'error'] 
    ,'account' => ['login'] 
); 

    // check that the requested controller and action are both allowed 
    // if someone tries to access something else he will be redirected to the error action of the pages controller 
    if (array_key_exists($controller, $controllers)) { 
    if (in_array($action, $controllers[$controller])) { 
     call($controller, $action); 
    } else { 
     call('home', 'error'); 
    } 
    } else { 
    call('home', 'error'); 
    } 
?> 

現在提到這一點線$controller = $container->get('AccountController');當選擇AccountController。在此之後,我得到了錯誤。

AccountController的源代碼:

<?php 
    class AccountController { 

    private $accountService; 

    public function __construct(IAccountService $accountService) { 
     echo $accountService == null; 
     $this->accountService = $accountService; 
    } 

    public function login() { 
     if(isset($_POST) && isset($_POST["email"]) && isset($_POST["password"])){ 
      $loginResult = $this->$accountService->login($_POST["email"], $_POST["password"]); 
      if($loginResult){ 
       $this->URLHELPER::redirectToAction("home", "index"); 
       die; 
      } 
      else{ 
       echo "Oops! this Email and Password combination not found"; 
      } 
     } 
     require_once('views/account/login.php'); 
    } 
    } 
?> 

看來,DI不噴射AccountService和誤差如下:

Notice: Undefined variable: accountService in /opt/lampp/htdocs/UMTest/controllers/account_controller.php on line 13

Notice: Undefined property: AccountController::$ in /opt/lampp/htdocs/UMTest/controllers/account_controller.php on line 13

Fatal error: Uncaught Error: Call to a member function login() on null in /opt/lampp/htdocs/UMTest/controllers/account_controller.php:13 Stack trace: #0 /opt/lampp/htdocs/UMTest/routes.php(40): AccountController->login() #1 /opt/lampp/htdocs/UMTest/routes.php(54): call(Object(AccountController), 'login') #2 /opt/lampp/htdocs/UMTest/views/layout.php(10): require_once('/opt/lampp/htdo...') #3 /opt/lampp/htdocs/UMTest/index.php(36): require_once('/opt/lampp/htdo...') #4 {main} thrown in /opt/lampp/htdocs/UMTest/controllers/account_controller.php on line 13

哪裏是我的錯嗎?

在此先感謝。 TG。

+0

這僅僅是一個檢查是否是測試'$ accountService'空或不是。賦值語句是'$ this-> accountService = $ accountService;' – ConductedClever

回答

0

爲了訪問屬性,你必須使用$this->accountService$this->$accountService變化以下行login()

$loginResult = $this->$accountService->login($_POST["email"], $_POST["password"]); 

$loginResult = $this->accountService->login($_POST["email"], $_POST["password"]); 
+0

哦。多麼糟糕的錯誤。謝謝。 – ConductedClever

+0

很高興幫助@ConductedClever :) –