Zend framework2 如何访问控制器内的Zend\db\Adapter\Plugin\MyPlugins ZF2?
如何从控制器插件中访问Zend framework2 如何访问控制器内的Zend\db\Adapter\Plugin\MyPlugins ZF2?,zend-framework2,Zend Framework2,如何从控制器插件中访问Zend\db\Adapter 我想执行 $this->getServiceLocator() ->getServiceLocator() ->get('Zend\Db\Adapter\Adapter') ->query("Select * from ABC ") 从插件中,您可以访问控制器(只要它扩展了Zend\Mvc\controller\plugin\AbstractPlugin),从而访问服务管理器,方法是:
Zend\db\Adapter
我想执行
$this->getServiceLocator()
->getServiceLocator()
->get('Zend\Db\Adapter\Adapter')
->query("Select * from ABC ")
从插件中,您可以访问控制器(只要它扩展了
Zend\Mvc\controller\plugin\AbstractPlugin
),从而访问服务管理器,方法是:
$this->getController()->getServiceLocator();
然而,访问服务管理器从插件中获取插件依赖项(适配器)是非常糟糕的做法
更好的解决方案是使用服务工厂“注入”适配器
use MyModule\Mvc\Controller\Plugin\MyPlugin;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\ServiceManager\FactoryInterface;
class MyPluginFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $pluginManager)
{
$serviceManager = $pluginManager->getServiceLocator();
return new MyPlugin(
$serviceManager->get('My/Db/Adapter') // inject db adapter
);
}
}
修改插件的\u构造
以允许适配器进入
class MyPlugin extends AbstractPlugin
{
protected $dbAdapter;
public function __construct(Adapter $dbAdapter)
{
$this->dbAdapter = $dbAdapter;
}
//...
}
最后,将其注册为Module.php
(或Module.config.php
)中的控制器插件
这是我的代码片段 在控制器路径“modules/Admin/controller/AreaController.php”中 下面是“modules/Admin/Controller/Plugin/SearchBox.php”中SearchBox的代码
namespace Admin\Controller\Plugin;
类搜索框扩展\Zend\Mvc\Controller\Plugin\AbstractPlugin{
受保护的$RawSearch=array();
//获取用户数据
公共函数设置按钮($label、$opt、$dbcols、$values=”“){
$this->$RawSearch=array(
'label'=>$label,
'opt'=>$opt,
'values'=>$values,
'dbcols'=>$dbcols,
);
}
//处理搜索值
公共函数ProcessSearchValue($val){
开关($val['opt'])){
案例“日期”:
案例“文本”:
$vHtml='';
打破
“查询”案例:
$dbadpater=$this->getController()->getServiceLocator()->get('Zend\Db\Adapter\Adapter');
$Statement=$dbadpater->query($val['values']);
$results=$Statement->execute();
$vHtml='';
如果(!空($results)){
foreach($rkey=>$rval的结果){
$vHtml.=''.$rval['text'].';
}
}
$vHtml.='';
打破
}
返回$vHtml;
}
公共函数ProcessOptValue($val){
$oHtml='';
$oHtml.=‘相等’;
开关($val['opt'])){
案例“日期”:
打破
案例“文本”:
$oHtml.='Contain';
$oHtml.='不包含';
打破
“查询”案例:
$oHtml.='小于';
$oHtml.='大于';
$oHtml.=‘小于等于’;
$oHtml.=“大于等于”;
打破
}
$oHtml.='';
返回$oHtml;
}
公共函数renderSearchBox(){
如果(!empty($this->RawSearch)){
$Sbox='';
foreach($this->RawSearch as$key=>$val){
$Sbox.=''美元
“.$val['label']”
“.$this->ProcessOptValue($val)。”
“.$this->ProcessSearchValue($val)。”
. '';
}
$Sbox.='';
}
返回$Sbox;
}
}
现在,当我执行语句“$box=$Search->renderSearchBox();”时,它会告诉我错误。
我无法在插件内执行查询。在插件内尝试了以下代码$this->getController()->getServiceLocator();将错误获取为致命错误:在非对象上调用成员函数getServiceLocator(),我还尝试检查$this->getController(),但没有显示任何内容。
// Module.php
public function getControllerPluginConfig()
{
return array(
'factories' => array(
'MyPlugin' => 'MyModule\Mvc\Controller\Plugin\MyPluginFactory'
),
);
}
public function arealistAction() {
$Search = new Plugin\SearchBox(); //calling the searchbox class
$Search->setButtons('Operator', 'query', 'Select id,name as text from Operator where Status=1 ');
//passing parameter for searchbox
$box = $Search->renderSearchBox();
}
namespace Admin\Controller\Plugin;
class SearchBox extends \Zend\Mvc\Controller\Plugin\AbstractPlugin {
protected $RawSearch = array();
//Get the user data
public function setButtons($label, $opt, $dbcols, $values = "") {
$this->$RawSearch = array(
'label' => $label,
'opt' => $opt,
'values' => $values,
'dbcols' => $dbcols,
);
}
//Process the search value
public function ProcessSearchValue($val) {
switch ($val['opt']) {
case 'date':
case 'text':
$vHtml = '<input type="text" name="' . $val['dbcols'] . '" id="' . $val['dbcols'] . '">';
break;
case 'query':
$dbadpater = $this->getController()->getServiceLocator()->get('Zend\Db\Adapter\Adapter');
$Statement = $dbadpater->query($val['values']);
$results = $Statement->execute();
$vHtml = '<select name="' . $val['dbcols'] . '" id="' . $val['dbcols'] . '">';
if (!empty($results)) {
foreach ($results as $rkey => $rval) {
$vHtml .='<option value="' . $rval['id'] . '">' . $rval['text'] . '</option>';
}
}
$vHtml .='</select>';
break;
}
return $vHtml;
}
public function ProcessOptValue($val) {
$oHtml = '<select name="' . $val['dbcols'] . '" id="' . $val['dbcols'] . '">';
$oHtml .='<option value="eq">Equal</option>';
switch ($val['opt']) {
case 'date':
break;
case 'text':
$oHtml .='<option value="cnt">Contain</option>';
$oHtml .='<option value="ncnt">Not Contain</option>';
break;
case 'query':
$oHtml .='<option value="lth">Less Than</option>';
$oHtml .='<option value="gth">Greater Than</option>';
$oHtml .='<option value="leq">Less than Equal</option>';
$oHtml .='<option value="geq">Greater than Equal</option>';
break;
}
$oHtml .= '</select>';
return $oHtml;
}
public function renderSearchBox() {
if (!empty($this->RawSearch)) {
$Sbox = '<table cellspacing="0px" cellpadding="0px">';
foreach ($this->RawSearch as $key => $val) {
$Sbox.= '<tr>'
. '<td><label>'.$val['label'].'</label></td>'
. '<td>'.$this->ProcessOptValue($val).'</td>'
. '<td>'.$this->ProcessSearchValue($val).'</td>'
. '</tr>';
}
$Sbox.='</table>';
}
return $Sbox;
}
}