1

現在、3 つのデータベース テーブルにアクセスする必要がある ZF2 モジュールがあります。他のモジュールがこれらのテーブルにアクセスする必要はありません。

だから私の質問は(パフォーマンスも念頭に置いてください)私が行ってきたように、実際にModule.phpに工場を追加する必要があります:

/**
 * Service Configuration
 *
 * @return array
 */
public function getServiceConfig()
{
    return array(
        'invokables' => array(
            'Login\Service\Authenticate' => 'Login\Service\Authenticate',
            'Login\Service\Oauth'        => 'Login\Service\Oauth'
        ),
        'factories'  => array(
            'Login\Form\Login'                   => function () {
                $form = new Form\Login();
                $form->setInputFilter(new FormFilter\Login());

                return $form;
            },
            'Login\Model\GaclEmployeePermission' => function ($sm) {
                return new Model\GaclEmployeePermission($sm->get('OTWebsoft\Db\Adapter\Master'), $sm->get('OTWebsoft\Db\Adapter\Slave'));
            },
            'Login\Model\Passport'               => function ($sm) {
                return new Model\Passport($sm->get('OTWebsoft\Db\Adapter\Master'), $sm->get('OTWebsoft\Db\Adapter\Slave'));
            },
            'Login\Model\PassportLog'            => function ($sm) {
                return new Model\PassportLog($sm->get('OTWebsoft\Db\Adapter\Master'), $sm->get('OTWebsoft\Db\Adapter\Slave'));
            }
        )
    );
}

次に、次のことを行う抽象クラスがあります。

/**
 * Table GaclEmployeePermission
 *
 * @return \Login\Model\GaclEmployeePermission
 */
protected function getTableGaclEmployeePermission()
{
    return $this->getServiceManager()->get('Login\Model\GaclEmployeePermission');
}

または、Module.php から構成を削除し、抽象クラスでこれを行う必要があります。

/**
 * Table GaclEmployeePermission
 *
 * @return \Login\Model\GaclEmployeePermission
 */
protected function getTableGaclEmployeePermission()
{
    return new GaclEmployeePermission($this->getMasterAdapter(), $this->getSlaveAdapter());
}

どちらもまったく同じように機能するようです。しかし、パフォーマンスに関しては、どれをお勧めしますか? これら 3 つのテーブルは、このモジュール以外の他のモジュールからアクセスする必要はありません。

4

1 に答える 1

1

サービス マネージャーまたは依存性注入コンテナーを使用する主な理由は、他のサービスがそれにアクセスできるからではありません。主な理由は、依存性注入を適用し、それによって制御の反転を適用することです。これにより、オブジェクトの使用が容易になり、実装を簡単に交換できるようになり、クラスをテストする機能が強化され、含まれるロジックについてクラスが責任を持ち、その依存関係に煩わされることがなくなります。

どちらの例でも、実際にはサービス マネージャーを使用していますが、パターンは同じです。クラス (内部getTableGaclEmployeePermission()) が何を取得するかを決定します。サービス マネージャーまたは直接インスタンス化のどちらを使用しても、実際にはそれほど重要ではありません。

あなたのモジュール構成では、アプリケーションにあるレイヤーとそれらが何をするか (特にその抽象クラスについて) を把握できませんが、一般的には、その依存関係を注入する必要があります。

abstract class SomeAbstract
{
    protected $permission;

    public function __construct(Permission $permission)
    {
        $this->permission = $permission;
    }
}

class Permission
{
    protected $master;
    protected $slave;

    public function __construct(TableAdapter $master, TableAdapter $slave = null)
    {
        $this->master = $master;

        if (null !== $slave) {
            $this->slave = $slave;
        }
    }
}

次に、サービス マネージャー構成を作成して、定義したサービスの依存関係を注入します。

'factories' => array(
    'Login\Model\Permission' => function ($sl) {
        $master = $sl->get('My\MasterAdapter');

        $slave  = null;
        if ($some_flag) {
            $slave = $sl->get('My\SlaveAdapter');
        }

        return new Login\Model\Permission($master, $slave);
    },

    'Login\Some\ConcreteImplementation' => function ($sl) {
        $permission = $sl->get('Login\Model\Permission');

        return new Login\Some\ConcreteImplementation($permission);
    }
),

次に、要求するLogin\Some\ConcreteImplementationと、すべてのインジェクション ( $master$slaveおよび$permission) が自動的に実行され、上記のすべての利点が有効になります。

于 2013-07-11T19:49:22.420 に答える