如何调用可调用对象


zf2 how to call invokables

我有一个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 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中删除代码。要获得可调用的类,您不需要定义工厂。在您的测试操作中,您可以简单地执行:

$service = $this->getServiceLocator()->get('Application'Utility'SendEmailClass');

但是你必须像这样在你的配置数组中注册一个名为service_manager的密钥下的服务,你也应该指向Application文件夹。当前结构中没有lib文件夹

'service_manager' => array(
    'invokables'    => array(
        'Application'Utility'SendEmailClass' => 'Application'Utility'SendEmailClass', 
    )
)

controller键是专门用于控制器类的,而不是用于其他服务,如电子邮件服务。

如果你想在别名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');