ZF2 - 如何将构造函数参数传递给Module.php中的Service

时间:2015-04-01 21:23:14

标签: php zend-framework2

我有一个PHP类,它有一个带参数的构造函数:

例如:

Users.php

namespace Forms;
class Users
{
  protected $userName;
  protected $userProperties = array();

  public function __construct($userName, array $userProperties = null) 
  {
     $this->userName = $userName;
     $this->userProperties = $userProperties;
  }
  public function sayHello()
  {
    return 'Hello '.$this->userName;
  }
}

现在,我正在尝试在这样的模型文件中使用此类:

$form = new Forms\Users( 'frmUserForm', array(
            'method' => 'post',
            'action' => '/dosomething',
            'tableWidth' => '800px'
            ) );

它运作得很好。但是,为了编写单元测试,我需要将其重构为服务工厂,因此我可以模拟它。

所以,我的服务工厂现在看起来像这样:

public function getServiceConfig()
    {
        return array(
            'initializers' => array(
                function ($instance, $sm)
                {
                    if ( $instance instanceof ConfigAwareInterface )
                    {
                        $config = $sm->get( 'Config' );
                        $instance->setConfig( $config[ 'appsettings' ] );
                    }
                }
            ),
            'factories' => array(
                'Forms\Users' => function ($sm )
                {
                    $users = new \Forms\Users();
                    return $users;
                },
            )
        );
    }

通过这种重构,我有两个问题:

  1. 如果在模型文件中没有ServiceLocator,我如何在模型文件中使用Forms \ Users Service?
  2. 如何在模型中实例化Users类时更改Service Factory实例以获取构造函数的参数。

1 个答案:

答案 0 :(得分:2)

我有一段时间遇到过类似的问题。然后我决定不将参数传递给Factory本身。但是构建用于处理此问题的setter方法。

namespace Forms;
class Users
{
  protected $userName;
  protected $userProperties = array();

  public function setUserName($userName) 
  {
      $this->userName = $userName;
  }
  public function setUserProperties($userProperties) 
  {
      $this->userProperties = $userProperties;
  }         
  public function sayHello()
  {
      return 'Hello '.$this->userName;
  }
}

您可以实现您的模型ServiceLocatorAwareInterface接口然后它可以调用以下任何服务。

use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class MyModel implements ServiceLocatorAwareInterface
{
    protected $service_manager;
    public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
    {
        $this->service_manager = $serviceLocator;
    }

    public function getServiceLocator()
    {
        return $this->service_manager;
    }

    public function doTask($name, $properties)
    {
        $obj =  $this->getServiceLocator('Forms\Users');
        $obj->setUserName($name);
        $obj->setUserProperties($properties);
    }
}