在我的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 ?
}
}
谢谢!
答案 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;
}
)
}