zf2 如何调用可调用对象
zf2 how to call invokables
我有一个 IndexController
,我正在尝试调用写在 Utility
文件夹中的邮件服务 class。
我的文件夹结构是这样的:
Module
Application
src
Application
Controller
IndexController
Model
Utility
SendMailClass
View
在我的IndexController.php
public function testAction()
{
$obj1 = $this->getServiceLocator()->get('SendEmailClass');
$res = $obj1->sendEmail($test);
}
在我的 Utility
文件夹中:
<?php
namespace Application\Utility;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Zend\Session\Container;
use Zend\View\Model\JsonModel;
use Zend\Debug\Debug;
use Zend\Db\TableGateway\AbstractTableGateway;
use Zend\Db\Adapter\Adapter;
class SendEmailClass
{
public function __construct(){
echo "Constructor Called";
}
public function sendEmail($mailInfo)
{
$mail ='test function called';
return $mail;
exit;
}
}
在我的Module
、module.php
public function getServiceConfig()
{
return array(
'factories' => array(
'SendEmailClass' => function ($sm) {
$sendEmailClass = $sm->get('Lib\Utility\SendEmailClass');
$sendEmailClassObj = new SendEmailClass($sendEmailClass);
return $sendEmailClassObj;
},
),
);
}
在我的 Module
、module_config.php、
<?php
return array(
'controllers' => array(
'invokables' => array(
'Users\Controller\Users' => 'Users\Controller\UsersController',
'Lib\Controller\Locations' => 'Lib\Controller\LocationsController',
'Lib\Utility\SendEmailClass' => 'Lib\Utility\SendEmailClass',
),
),
);
我应该如何获得服务?
您应该从 module.php
中删除代码。要获得可调用的 class,您不需要定义工厂。在您的测试操作中,您可以简单地执行以下操作:
$service = $this->getServiceLocator()->get('Application\Utility\SendEmailClass');
但是您必须像这样在配置数组中的名为 service_manager
的键下注册服务,并且您还应该指向 Application
文件夹。您当前的结构中没有 lib
文件夹。
'service_manager' => array(
'invokables' => array(
'Application\Utility\SendEmailClass' => 'Application\Utility\SendEmailClass',
)
)
控制器密钥专门用于控制器 classes,不适用于电子邮件服务等其他服务。
如果您希望该服务也可以在别名 SendEmailClass
下使用,那么您可以将其添加到您的 service_manager
配置中:
'service_manager' => array(
// your previous invokables service config:
'invokables' => array(
'Application\Utility\SendEmailClass' => 'Application\Utility\SendEmailClass',
),
// added an alias for the SendEmailClass
'aliases' => array(
'SendEmailClass' => 'Application\Utility\SendEmailClass'
)
)
现在这也适用于您的控制器:
$service = $this->getServiceLocator()->get('SendEmailClass');
我有一个 IndexController
,我正在尝试调用写在 Utility
文件夹中的邮件服务 class。
我的文件夹结构是这样的:
Module
Application
src
Application
Controller
IndexController
Model
Utility
SendMailClass
View
在我的IndexController.php
public function testAction()
{
$obj1 = $this->getServiceLocator()->get('SendEmailClass');
$res = $obj1->sendEmail($test);
}
在我的 Utility
文件夹中:
<?php
namespace Application\Utility;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Zend\Session\Container;
use Zend\View\Model\JsonModel;
use Zend\Debug\Debug;
use Zend\Db\TableGateway\AbstractTableGateway;
use Zend\Db\Adapter\Adapter;
class SendEmailClass
{
public function __construct(){
echo "Constructor Called";
}
public function sendEmail($mailInfo)
{
$mail ='test function called';
return $mail;
exit;
}
}
在我的Module
、module.php
public function getServiceConfig()
{
return array(
'factories' => array(
'SendEmailClass' => function ($sm) {
$sendEmailClass = $sm->get('Lib\Utility\SendEmailClass');
$sendEmailClassObj = new SendEmailClass($sendEmailClass);
return $sendEmailClassObj;
},
),
);
}
在我的 Module
、module_config.php、
<?php
return array(
'controllers' => array(
'invokables' => array(
'Users\Controller\Users' => 'Users\Controller\UsersController',
'Lib\Controller\Locations' => 'Lib\Controller\LocationsController',
'Lib\Utility\SendEmailClass' => 'Lib\Utility\SendEmailClass',
),
),
);
我应该如何获得服务?
您应该从 module.php
中删除代码。要获得可调用的 class,您不需要定义工厂。在您的测试操作中,您可以简单地执行以下操作:
$service = $this->getServiceLocator()->get('Application\Utility\SendEmailClass');
但是您必须像这样在配置数组中的名为 service_manager
的键下注册服务,并且您还应该指向 Application
文件夹。您当前的结构中没有 lib
文件夹。
'service_manager' => array(
'invokables' => array(
'Application\Utility\SendEmailClass' => 'Application\Utility\SendEmailClass',
)
)
控制器密钥专门用于控制器 classes,不适用于电子邮件服务等其他服务。
如果您希望该服务也可以在别名 SendEmailClass
下使用,那么您可以将其添加到您的 service_manager
配置中:
'service_manager' => array(
// your previous invokables service config:
'invokables' => array(
'Application\Utility\SendEmailClass' => 'Application\Utility\SendEmailClass',
),
// added an alias for the SendEmailClass
'aliases' => array(
'SendEmailClass' => 'Application\Utility\SendEmailClass'
)
)
现在这也适用于您的控制器:
$service = $this->getServiceLocator()->get('SendEmailClass');