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;
  }

 }