PHP-DI 没有注入所需的 class
PHP-DI does not inject the required class
我正在使用 php-di 进行依赖注入。请求首先到达配置 php-di 的 route.php 文件(例如,当需要 IAccountService
时使用 AccountService
),然后要求容器创建适当的控制器. route.php源码如下:
<?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
我的错误在哪里?
要访问 属性,您必须使用 $this->accountService
而不是 $this->$accountService
更改 login()
中的以下行
$loginResult = $this->$accountService->login($_POST["email"], $_POST["password"]);
至
$loginResult = $this->accountService->login($_POST["email"], $_POST["password"]);
我正在使用 php-di 进行依赖注入。请求首先到达配置 php-di 的 route.php 文件(例如,当需要 IAccountService
时使用 AccountService
),然后要求容器创建适当的控制器. route.php源码如下:
<?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
我的错误在哪里?
要访问 属性,您必须使用 $this->accountService
而不是 $this->$accountService
更改 login()
$loginResult = $this->$accountService->login($_POST["email"], $_POST["password"]);
至
$loginResult = $this->accountService->login($_POST["email"], $_POST["password"]);