1

これは私の最初のクラスです

<?php 

namespace Config\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Config\Model\Config;
use Config\Form\ConfigForm;

class ConfigController extends AbstractActionController
{ 
protected $configTable;



public function indexAction()
{
    $this->getSMTPConfigTable();
    return new ViewModel(array(
            'config' => $this->getConfigTable()->fetchAll(),
    ));

}

public function addAction()
{
    $form = new ConfigForm();
    $form->get('submit')->setValue('Add');

    $request = $this->getRequest();
    if ($request->isPost()) {
        $config = new Config();
        $form->setInputFilter($config->getInputFilter());
        $form->setData($request->getPost());

        if ($form->isValid()) {
            $config->exchangeArray($form->getData());
            $this->getConfigTable()->saveConfig($config);

            return $this->redirect()->toRoute('zfcadmin/config');
        }
    }
    return array('form' => $form);
}

public function editAction()
{
    $id = (int) $this->params()->fromRoute('id', 0);
    if (!$id) {
        return $this->redirect()->toRoute('zfcadmin/config', array(
                'action' => 'add'
        ));
    }

    try {
        $config = $this->getConfigTable()->getConfig($id);
    }
    catch (\Exception $ex) {
        return $this->redirect()->toRoute('zfcadmin/config', array(
                'action' => 'index'
        ));
    }

    $form  = new ConfigForm();
    $form->bind($config);
    $form->get('submit')->setAttribute('value', 'Edit');

    $request = $this->getRequest();
    if ($request->isPost()) {
        $form->setInputFilter($config->getInputFilter());
        $form->setData($request->getPost());

        if ($form->isValid()) {
            $this->getConfigTable()->saveConfig($form->getData());

            return $this->redirect()->toRoute('zfcadmin/config');
        }
    }

    return array(
            'id' => $id,
            'form' => $form,
    );
}

public function getConfigTable()
{
    if (!$this->configTable) {
        $sm = $this->getServiceLocator();
        $this->configTable = $sm->get('Config\Model\ConfigTable');
    }
    return $this->configTable;
}

public function getSMTPConfigTable()
{
    $pr=$this->getConfigTable()->fetchAll();
    return $pr;
}

    }

別のモジュールクラスではどうすればいいですか? 私はほとんどの方法を試しましたが、失敗しています。助けてください。(私の英語でごめんなさい) $temp=new ConfigController(); が必要です。$temp->getSMTPConfigTable();

4

3 に答える 3

4

まず、あなたの質問が正しいかどうかを確認したいと思います。質問の名前と内容を読んで、モジュールの別のコントローラーまたはクラスでConfigTable(モデル)を取得する方法について質問していると思います。

オブジェクトとサービスが ZF2 でどのように管理されているかを理解するには、次の ZF2 マニュアル ページを参照することをお勧めします。

http://framework.zend.com/manual/2.0/en/modules/zend.service-manager.quick-start.html

ページの「ServiceLocator 対応クラスの作成」セクションに注意を払うと、サービス マネージャー自体を介して、サービス マネージャーに登録された任意のオブジェクトにアクセスできることがわかります。サービス マネージャは、その用語で、ServiceLocatorAwareInterfaceまたは という名前のメソッドを実装するすべてのオブジェクトに注入されますsetServiceLocator()

それを明確にして、ZF2Zend\Mvc\Controller\AbstractActionControllerはこのインターフェースを実装しています。つまり、オブジェクトでサービスマネージャーを取得できるため、それに登録されている他のオブジェクトを取得できます。次のメソッド ( からConfig\Controller) を見ると、サービス マネージャーからモデルを取得する良い例があります。

public function getConfigTable()
{
    if (!$this->configTable) {
        $sm = $this->getServiceLocator();
        $this->configTable = $sm->get('Config\Model\ConfigTable'); // <-- HERE!
    }
    return $this->configTable;
}

したがって、ServiceManagerand を介して作成されたすべてのクラスsetServiceLocator()(およびオプションのgetServiceLocator()) メソッドでは、同じ方法でモデルにアクセスできます。

$sm = $this->getServiceLocator();
// or 
$sm = $this->serviceLocator; // or whatever attribute you have set it to.
$configTable = $sm->get('Config\Model\ConfigTable');

モデルのメソッドを呼び出すfetchAll()方法については、どこで行うかはあなたに任せます。

于 2013-03-27T14:30:57.260 に答える
2

これはまさにあなたが使用する部分ですServiceManager

TableGateway次のように(または「モデルテーブル」として使用しているものは何でも)登録しますServiceManager

//Module.php 
public function getServiceConfig()
{
    return array(
        'factories' => array(
            'my-model-gateway' => function($sm) {
               $gw = new MyTableGateway($sm->get('Zend\Db\Adapter\Adapter'));
               return $gw;
            }
        )
    }
}

これは単なるショーケース シナリオです。このようなコピー アンド ペーストは機能しません。コードをうまく理解できていませんが、この簡単な例を使用して、何が行われたかを知ることができます。というサービスを登録するとmy-model-gateway、このサービスは というクラスを作成しますMyTableGateway。このクラスは、Zend\Db\Adapter\AdapterConstructor-Injection を介してデフォルトで注入されます。

これを使用すると、次のように、任意のモジュールの任意のコントローラーからこのサービスにアクセスできます。

$gw = $this->getServiceLocator()->get('my-model-gateway');

これで始められることを願っています。

于 2013-03-27T14:30:15.263 に答える
0

そのためにはコンストラクターが必要です。これを試してください:

class ConfigController {
   function __construct() {
   }
}

空の場合でも、クラスのインスタンスを取得し、すべてのパラメーターにアクセスできるようになります。おそらく、クラスの一般的な設定のために init も作成する必要があるでしょう。

于 2013-03-27T13:25:05.540 に答える