在我的Zend Framework 2项目中,我有一个外部lib,我想将我的信息与模型一起保存在库中。
。。。。……
编辑消息:
我再次解释了我的需求:在我的控制器中,我在数据库中进行插入和删除,并且我想将所有操作记录在"t_log"表中。为此,我考虑创建一个外部类。
我的问题是:如何从外部类调用models方法?
namespace Mynamespace;
use FirewallModelLogs;
use FirewallModelLogsTable;
class StockLog
{
public function addLog()
{
$log = $this->getServiceLocator()->get('FirewallModelLogTable');
$log->save('user added');
die('OK');
}
}
我的型号:
namespace FirewallModel;
use ZendDbTableGatewayTableGateway;
use ZendDbSqlSelect;
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 ?
}
}
谢谢!
getServiceLocator
是ZendMvcControllerAbstractActionController
的函数,因此它应该在控制器中使用。
我不知道你的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('FirewallModelUserTable');
}
}
然后,当您在控制器中创建StockLog对象时,注入servicelocator
public class yourController extends AbstractActionController {
public function yourAction(){
$mStockLog = new StockLog ();
$mStockLog->setServiceLocator($this->getServiceLocator());
/...
}
}
此外,如果您只需要'FirewallModelUserTable'
服务,则应该仅注入该服务,而不是注入serviceLocator。
无论如何,您应该尽量减少模型类对系统其余部分的了解,始终牢记依赖性反转原则,以获得更好的解耦
更新
注入日志表
namespace Mynamespace;
use FirewallModelLogs; use FirewallModelLogsTable;
class StockLog {
private $logTable= null;
public function setLogTable($logTable)
{
$this->logTable= $logTable;
}
public function addLog()
{
$this->logTable->save('user added');
die('OK');
}
}
然后,当你创建StockLog时(在你的控制器中,或者在你使用它之前,在你做它的任何地方),你注入了日志表对象
$mStockLog = new StockLog ();
$mStockLog->setLogTable($this->getServiceLocator()->get('FirewallModelLogTable'));
当然,我很高兴您正确地配置了FirewallModelLogTable
类,以便通过Module.php
中的getServiceConfig()
中的服务管理器进行检索
public function getServiceConfig() {
return array (
'factories' => array (
'FirewallModelLogTable' => function ($sm) {
$logTable = //create it as you use to
return $logTable;
}
)
}