Zend framework2 正确引导Zend2插件的方法是什么?

Zend framework2 正确引导Zend2插件的方法是什么?,zend-framework2,Zend Framework2,目前我正在编写这样的插件: namespace Lawyers\Controller\Plugin; use Zend\Mvc\Controller\Plugin\AbstractPlugin, Braintree as BraintreeSDK; class Braintree extends AbstractPlugin { protected $__initialized = false; protected $__pm; protected $__e

目前我正在编写这样的插件:

namespace Lawyers\Controller\Plugin;

use Zend\Mvc\Controller\Plugin\AbstractPlugin,
    Braintree as BraintreeSDK;

class Braintree extends AbstractPlugin
{
    protected $__initialized = false;

    protected $__pm;
    protected $__em;

    /**
     * Set Braintree config settings
     *
     * @return void
     */
    protected function init() {
        if($this->__initialized) {
            return;
        }

        $this->__pm = $this->getController()->getEntityRepository();
        $this->__pm = $this->__pm['ExternalPayment'];
        $this->__em =  $this->getController()->getEntityManager();

        $config = $this->getController()->getServiceLocator()->get('Config');

        \Braintree_Configuration::environment($config['braintree']['env']);
        \Braintree_Configuration::merchantId($config['braintree']['merchant_id']);
        \Braintree_Configuration::publicKey($config['braintree']['public_key']);
        \Braintree_Configuration::privateKey($config['braintree']['private_key']);

        $this->__initialized = true;
    }  

    /**
     * Create new entity for transaction
     *
     * @return \Lawyers\Model\Entity\ExternalPayment
     */
    protected function spawn() {
        return new \Lawyers\Model\Entity\ExternalPayment();
    }



    /**
     * New sales transaction
     *
     * @param mixed $Payer - person who pays this transaction
     * @param mixed $Source - source of payment: Lawyers\Model\Entity\Questions or Lawyers\Model\Entity\Lead
     * @param array $transaction - payment details:
     *      'amount' => '1000.00',
     *      'creditCard' => array(
     *          'number' => '5105105105105100',
     *          'expirationDate' => '05/12'
     *      )
     * @return mixed - transaction id or null
     */
    public function sell($Payer, $Source, $transaction) {
        $this->init();

        $data = array(
            'status' => 'pending',
            'amount' => $transaction['amount'],
        );

        # ....
    }
}

不在每次调用中使用
$this->init()
初始化插件实例变量的正确方法是什么?我没有看到用于插件的类似构造函数的方法:(

您可以通过向插件管理器添加初始值设定项来实现这一点

首先让您的插件实现
Zend\Stdlib\InitializableInterface
(您还需要将init方法公开)

然后在模块引导中添加初始值设定项

<?php
namespace Lawyers;

use Zend\Stdlib\InitializableInterface;

class Module
{
    public function onBootstrap(MvcEvent $e)

        $sm = $e->getApplication()->getServiceManager();

        $plugins = $sm->get('ControllerPluginManager');            

        $plugins->addInitializer(function($plugin, $pm) {
            if ($plugin instanceof InitializableInterface) {
                $plugin->init();
            }
        }, false); // false tells the manager not to add to top of stack
    }
} 
Hmmm
\uuuu-construct()
或者可能
\uuu-invoke()
\uuuu-construct()
将使插件逻辑崩溃,将尝试
\uu-invoke()
<?php
namespace Lawyers;

use Zend\Stdlib\InitializableInterface;

class Module
{
    public function onBootstrap(MvcEvent $e)

        $sm = $e->getApplication()->getServiceManager();

        $plugins = $sm->get('ControllerPluginManager');            

        $plugins->addInitializer(function($plugin, $pm) {
            if ($plugin instanceof InitializableInterface) {
                $plugin->init();
            }
        }, false); // false tells the manager not to add to top of stack
    }
}