ZF2 Dependency Injection - внедрение таблиц в классы - PullRequest
1 голос
/ 27 ноября 2011

Обратите внимание: это была бета-версия ZF 1. Я сомневаюсь, что это то же самое для текущего выпуска

Я просто пытался внедрить зависимости в некоторые из моих классов. Я думал, что справился с этим, поскольку уже управлял этим с помощью нескольких вещей, таких как введение database configurations, DB adapters и auth adapters в мой UserMapper класс.

Я пытался сделать то же самое с некоторыми другими моими классами и никак не мог понять, почему он просто не работал, как мой класс UserMapper. Теперь я вижу, что класс UserMapper внедряется в контроллер, для которого установлен псевдоним в верхней части файла конфигурации.

Так что я предполагаю, не вводя его сначала с помощью контроллера ... как я должен вводить вещи в мои Модели? Я использую стандарт ZF2 Skeleton by EvanDotPro

Мои модели находятся в:

Application\Model\
Application\Model\DbTable

Мой конфиг сейчас выглядит примерно так:

<?php
return array(
'bootstrap_class' => 'Application\Bootstrap',
'layout'          => 'layouts/layout.phtml',
'di'              => array(
    'instance' => array(
        'alias' => array(
            'index'             => 'Application\Controller\IndexController',
            'view'              => 'Zend\View\PhpRenderer'
        ),

        'Zend\View\HelperLoader' => array(
            'parameters' => array(
                'map' => array(
                    'url' => 'Application\View\Helper\Url',
                ),
            ),
        ),

        'Zend\View\HelperBroker' => array(
            'parameters' => array(
                'loader' => 'Zend\View\HelperLoader',
            ),
        ),

        'Application\Controller\IndexController' => array(
            'parameters' => array(
                'userMapper' => 'Application\Model\UserMapper',
                'flashMessenger' => 'Zend\Mvc\Controller\Plugin\FlashMessenger'
            )
        ),

        'Application\Model\UserMapper' => array(
            'parameters' => array(
                'db' => 'Zend\Db\Adapter\PdoMysql',
                'authAdapter' => 'Zend\Authentication\Adapter\DbTable',
                'userTable' => 'Application\Model\DbTable\UserTable'
            )
        ),

        'Application\Model\DbTable\UserTable' => array(
            'parameters' => array(
                'config' => 'Zend\Db\Adapter\PdoMysql',
            )
        ),

            // Auth adapter

        'Zend\Authentication\Adapter\DbTable' => array(
            'parameters' => array(
                'zendDb' => 'Zend\Db\Adapter\PdoMysql',
                'tableName' => 'users',
                'identityColumn' => 'username',
                'credentialColumn' => 'password',
                'credentialTreatment' => 'MD5(CONCAT(?,"OSalTyr$"))'
            )
        ),

        // DB Adapter

        'Zend\Db\Adapter\PdoMysql' => array(
            'parameters' => array(
                'config' => array(
                    'host' => 'localhost',
                    'username' => 'root',
                    'password' => '',
                    'dbname' => 'blahblah',
                ),
            ),
        ),

        // View

        'Zend\View\PhpRenderer' => array(
            'parameters' => array(
                'resolver' => 'Zend\View\TemplatePathStack',
                'options'  => array(
                    'script_paths' => array(
                        'application' => __DIR__ . '/../views',
                    ),
                ),
                'broker' => 'Zend\View\HelperBroker',
            ),
        ),

    ),
),

'routes' => array(
    'default' => array(
        'type'    => 'Zend\Mvc\Router\Http\Regex',
        'options' => array(
            'regex'    => '/(?P<controller>[^/]+)(/(?P<action>[^/]+)?)?',
            'spec'     => '/%controller%/%action%',
            'defaults' => array(
                'controller' => 'error',
                'action'     => 'index',
            ),
        ),
    ),
    'home' => array(
        'type' => 'Zend\Mvc\Router\Http\Literal',
        'options' => array(
            'route'    => '/',
            'defaults' => array(
                'controller' => 'index',
                'action'     => 'index',
            ),
        ),
    ),
),
);

Спасибо, Доминик

1 Ответ

0 голосов
/ 01 декабря 2011

А-а-а ... Я выяснил, почему это не сработало.

Хотя приведенная выше конфигурация верна, и я определяю, что я хочу ввести в то, что ... Я на самом деле не использовалвставленный экземпляр рассматриваемого объекта.

Я подумал, когда использовал 'new thingy ();'что DI волшебным образом обнаружил, что у него есть зависимости, и применил их, когда это необходимо, но это не тот случай ...

То, что мне нужно было сделать ... было внедрить класс thingy в мои UserMapper классифицируйте как цепочку, а затем используйте внедренный экземпляр вместо того, чтобы создавать его new экземпляр без вставленных в него вещей.

Like:

RegisterController требует UserMapper, поэтомувнедрить его и использовать этот экземпляр UserMapper требует Thingy, поэтому внедрить его и использовать этот экземпляр

...