我有一个IndexController
,我试图调用在Utility
文件夹中编写的邮件服务类。
我的文件夹结构如下:
Module
Application
src
Application
Controller
IndexController
Model
Utility
SendMailClass
View
In my IndexController.php
public function testAction()
{
$obj1 = $this->getServiceLocator()->get('SendEmailClass');
$res = $obj1->sendEmail($test);
}
在我的Utility
文件夹:
<?php
namespace ApplicationUtility;
use ZendMvcControllerAbstractActionController;
use ZendViewModelViewModel;
use ZendSessionContainer;
use ZendViewModelJsonModel;
use ZendDebugDebug;
use ZendDbTableGatewayAbstractTableGateway;
use ZendDbAdapterAdapter;
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('LibUtilitySendEmailClass');
$sendEmailClassObj = new SendEmailClass($sendEmailClass);
return $sendEmailClassObj;
},
),
);
}
在我的Module
, module_config.php,
<?php
return array(
'controllers' => array(
'invokables' => array(
'UsersControllerUsers' => 'UsersControllerUsersController',
'LibControllerLocations' => 'LibControllerLocationsController',
'LibUtilitySendEmailClass' => 'LibUtilitySendEmailClass',
),
),
);
我该如何获得这项服务?
您应该从您的module.php
中删除代码。要获得可调用的类,您不需要定义工厂。在您的测试操作中,您可以简单地执行:
$service = $this->getServiceLocator()->get('ApplicationUtilitySendEmailClass');
但是你必须像这样在你的配置数组中注册一个名为service_manager
的密钥下的服务,你也应该指向Application
文件夹。当前结构中没有lib
文件夹
'service_manager' => array(
'invokables' => array(
'ApplicationUtilitySendEmailClass' => 'ApplicationUtilitySendEmailClass',
)
)
controller键是专门用于控制器类的,而不是用于其他服务,如电子邮件服务。
如果你想在别名SendEmailClass
下也提供服务,那么你可以将此添加到service_manager
配置:
'service_manager' => array(
// your previous invokables service config:
'invokables' => array(
'ApplicationUtilitySendEmailClass' => 'ApplicationUtilitySendEmailClass',
),
// added an alias for the SendEmailClass
'aliases' => array(
'SendEmailClass' => 'ApplicationUtilitySendEmailClass'
)
)
现在这也将在你的控制器中起作用:
$service = $this->getServiceLocator()->get('SendEmailClass');