Zend2 - 如何在控制器中访问模型

时间:2014-04-11 17:28:51

标签: php zend-framework2

我的zend2应用程序将一些函数移动到其他源,例如我的控制器如下所示:

public function someAction() {
  $logic = new \Home\Logic\Home($this->getServiceLocator);

  return ('data' => $logic->getSomeStuff());
}

我喜欢这种构建我的应用程序的方式,因为我习惯在Zend1中这样做,这使得我的代码非常简单易读/编辑。整个逻辑不是控制器代码的一部分。在Zend2中我遇到了很多问题 - 第一件事 - 我必须在我的逻辑构造函数中推送serviceLocator - 这对我来说是非常糟糕的解决方案。 :(有时我需要访问模型在视图中 - 有很多原因(例如,为了方便访问字典字段 - 这意味着在表所有者我有id_car,链接到表车。我不想查看为此,但只是指出我的模型所有者应该使用哪个字段来从另一个模型中读取...现在让我们来看看我的逻辑:

public function getSomeStuff() {
  $model = $this->serviceLocator->get('someTable');

  return $model->fetchAll();
}

我的问题是 - 如何在不将serviceLocator从控制器推送到我的逻辑的情况下访问我的模型?

编辑:我的视图示例(传递的数据是$ data)index.phtml:

<?php echo $this->partial('/partial/show_some_table.phtml', array('data' => $data)); ?>

部分(这就是我看到的):

$this->placeHolder('table-body')->captureStart();
foreach ($this->data as $data) {
  if (isset($data['dictionary']) {
    $dic = new \Home\Logic\Dictionary($data['dictionary']); // this thing should return my dictionary which translate given id to text representation
    echo $dic[$data['field']];
  } else {
    echo $data['field'];
  }
}
$this->placeHolder('table-body')->captureEnd();

类似的东西。

$ data ['dictionary']将保留:应该用于获取字段文本表示的表的名称,字典的id字段的名称,字典的文本字段的名称。所以如果我传递:array('Cars','id','name')那么我的字典应该知道我想打开表Cars并获得id =&gt; name的返回数组。

1 个答案:

答案 0 :(得分:1)

从这些示例开始,您的应用程序的运作方式并不十分清楚,但要回答您的问题,如果Home\Logic\Home需要访问someTable服务,则将其作为依赖项传递。而不是将整个服务定位器传递给via。在构造函数中,您告诉ZF2如何使用工厂创建Home\Logic\Home实例。

在你的Module.php中:

public function getServiceConfig()
{
    return array(
        'factories' => array(
            'Home\Logic\Home' => function($sm) {
                $someTable = $sm->get('someTable');
                $home = new \Home\Logic\Home($someTable);

                return $home;
            }
        )
    );
}

修改home类以在其构造函数中接受该对象:

namespace Home\Logic;

class Home
{
    protected $someTable;

    public function __construct($someTable)
    {
        $this->someTable = $someTable;
    }
}

然后在您的控制器中,让服务管理器为您创建Home\Logic\Home实例:

public function someAction()
{
    $logic = $this->getServiceLocator()->get('Home\Logic\Home');

    return ('data' => $logic->getSomeStuff());
}

现在Home\Logic\Home可以自动访问someTable类。