ZF2:从外部类调用服务?

时间:2014-01-02 15:40:14

标签: php zend-framework2 service-factory

在我的Zend Framework 2项目中,我有一个外部库,我想用模型在基础中保存我的信息。

.... .... ....

编辑消息:

我再次解释我的需求:在我的控制器中,我在数据库中进行插入和删除,并且我想在“t_log”表中记录所有操作。为此,我想创建一个外部类。

我的问题是:如何从我的外部类中调用我的模型方法?

namespace Mynamespace;

use Firewall\Model\Logs;
use Firewall\Model\LogsTable;

class StockLog
{
    public function addLog()
    {
       $log = $this->getServiceLocator()->get('Firewall\Model\LogTable');
       $log->save('user added'); 
       die('OK');
    }
}

我的模特:

namespace Firewall\Model;

use Zend\Db\TableGateway\TableGateway;
use Zend\Db\Sql\Select;

class UserGroupTable
{

    protected $tableGateway;

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

    public function save()
    {
        // How I Can call this method from the StockLog method ?
    }
}

谢谢!

1 个答案:

答案 0 :(得分:3)

getServiceLocator\Zend\Mvc\Controller\AbstractActionController的函数,因此它应该在您的控制器中使用。

我不知道你的StockLog类是什么,但是它没有扩展任何其他类,所以我猜它没有那个功能而你的错误是前一步,在getSErviceLocator的调用中没有定义,所以它不返回一个对象。

您可以使用类似

的内容注入服务定位器
class StockLog 
{

  private $serviceLocator= null;

  public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
  {
    $this->serviceLocator = $serviceLocator;
  }


    public function add()
    {
       # Do you know how I can call the service ??
       $User = $this->serviceLocator->get('Firewall\Model\UserTable');
    }


}

然后,当您创建StockLog对象时,在控制器中注入servicelocator

public class yourController extends AbstractActionController {

   public function yourAction(){
      $mStockLog = new StockLog ();
       $mStockLog->setServiceLocator($this->getServiceLocator()); 
    /...

   }
}

此外,如果您只需要'Firewall\Model\UserTable'服务,则应该只注入,而不是serviceLocator。

无论如何,您应该尽量减少关于系统其他部分的模型类的知识,始终牢记dependency inversion principle,以获得更好的decoupling

更新

注入日志表

namespace Mynamespace;

use Firewall\Model\Logs; use Firewall\Model\LogsTable;

class StockLog {


 private $logTable= null;

  public function setLogTable($logTable)
  {
    $this->logTable= $logTable;
  }

public function addLog()
{

   $this->logTable->save('user added'); 
   die('OK');
}

}

然后,当您创建StockLog时(在您的控制器中,或在您使用它之前的任何地方),您注入了logtable对象

  $mStockLog = new StockLog ();
  $mStockLog->setLogTable($this->getServiceLocator()->get('Firewall\Model\LogTable')); 

当然,我建议您通过服务管理员在Firewall\Model\LogTable

中的getServiceConfig()中正确配置要检索的Module.php课程
  public function getServiceConfig() {
       return array (
            'factories' => array (
                    'Firewall\Model\LogTable' => function ($sm) {
                         $logTable = //create it as you use to  
                  return $logTable;
            }  

        )

  }