4

私の人生では、 $this->getServiceLocator() をコントローラーで動作させることはできません。私はすべてを読んで試しました。私は何かが欠けていると思いますか?ここにいくつかのコードがあります。

namespace Login\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\Session\Container as SessionContainer;
use Zend\Session\SessionManager;
use Zend\View\Model\ViewModel;
use Zend\Mvc\Controller;

use Login\Model\UserInfo;

class LoginController extends AbstractActionController
{
    private $db;

    public function __construct()
    {
        $sm = $this->getServiceLocator();

        $this->db = $sm->get('db');
    }
    ...

私が得ているエラーは次のとおりです。

Fatal error: Call to a member function get() on a non-object in /product/WishList/module/Login/src/Login/Controller/LoginController.php on line 21 
4

2 に答える 2

5

私のコメントにもう少し意味を与えるために。ServiceLocator (またはすべての ControllerPlugins) は、コントローラーのライブサイクルの後の時点でのみ使用できます。アクション全体で簡単に使用できる変数を割り当てたい場合は、Lazy-Gettersを使用するか、 Factory パターンを使用してそれらを注入することをお勧めします

レイジーゲッター

class MyController extends AbstractActionController
{
    protected $db;
    public function getDb() {
        if (!$this->db) {
            $this->db = $this->getServiceLocator()->get('db');
        }
        return $this->db;
    }
}

工場パターン

//Module#getControllerConfig()
return array( 'factories' => array(
    'MyController' => function($controllerManager) {
        $serviceManager = $controllerManager->getServiceLocator();
        return new MyController($serviceManager->get('db'));
    }
));

//class MyController
public function __construct(DbInterface $db) {
    $this->db = $db;
}

それが理解できることを願っています;)

于 2013-08-14T21:58:24.557 に答える
0

Controller が ServiceLocatorAwareInterface のインターフェイスを実装していないためだと思います。construct メソッドでクラス Zend\ServiceManager\AbstractPluginManager を確認できます。

public function __construct(ConfigInterface $configuration = null)
{
    parent::__construct($configuration);
    $self = $this;
    $this->addInitializer(function ($instance) use ($self) {
        if ($instance instanceof ServiceLocatorAwareInterface) {
            $instance->setServiceLocator($self);
        }
    });
}

したがって、ServiceLocator を使用する場合はそれを実装するか、ServiceLocatorAwareInterface を実装したクラス Zend\Mvc\Controller\AbstractActionController を拡張する必要があります。

于 2013-08-15T03:01:25.313 に答える