zf2如何调用invokables

时间:2015-08-17 14:25:00

标签: php zend-framework zend-framework2

我有一个IndexController,我试图调用一个写在Utility文件夹中的邮件服务类。

My Folder Strucure是这样的:

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', 
        ),
    ),
);

我该如何获得服务?

1 个答案:

答案 0 :(得分:1)

您应该从module.php中删除代码。要获得可调用的类,您不需要定义工厂。在您的测试操作中,您可以执行以下操作:

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

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

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

控制器密钥专门用于控制器类,而不适用于您的电子邮件服务等其他服务。

如果您希望该服务也可以在别名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');