11

こんにちは、私は zend フレームワークが初めてです。サービスマネージャーに追いつくようにしてください。Zendフレームワークのドキュメントに基づいて、次のように述べています。

factory 、サービス名/ファクトリ クラス名のペアの配列ファクトリは、Zend\ServiceManager\FactoryInterface を実装するクラスまたは呼び出し可能なクラスのいずれかである必要があります。PHP 構成ファイルを使用している場合は、任意の PHP 呼び出し可能ファイルをファクトリとして提供できます。

invokables、サービス名/クラス名のペアの配列。クラス名は、コンストラクタ引数なしで直接インスタンス化できるクラスにする必要があります。

しかし、私はまだそれらの違いを理解していません。いつ呼び出し可能として使用する必要があり、いつ工場を使用する必要がありますか? 利活用工場とは?どうもありがとう。

4

1 に答える 1

23

呼び出し可能オブジェクトは、コンストラクターで他の依存関係などを必要としない単純なオブジェクトをインスタンス化するために使用する必要があります。

オブジェクトのインスタンス化の背後にもう少し複雑なロジックがある場合は、ファクトリを使用する必要があります。コードをファクトリに移動すると、オブジェクトを元に戻す必要があるときにコードを複製する必要がなくなります。

工場の例:

    'factories' => array(
        'Application\Acl' => 'Application\Service\AclFactory',

AclFactory.php

namespace Application\Service;

use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\Permissions\Acl\Resource\GenericResource;
use Zend\Permissions\Acl\Role\GenericRole;

class AclFactory implements FactoryInterface
{
     /**
     * Create a new ACL Instance
     *
     * @param ServiceLocatorInterface $serviceLocator
     * @return Demande
     */
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        $acl = new \Zend\Permissions\Acl\Acl();
        /**
         * Here you can setup Resources, Roles or some other stuff.
         * If it's complex you can make a factory like this to keep
         * the code out of the service config, and it will save you 
         * having to duplicate the code when ever you need your ACL
         */

        return $acl;
    }

}

単純なクラス/オブジェクトを元に戻したい場合は、オブジェクトを元に戻すために定型コードが必要ないため、呼び出し可能オブジェクトを使用できます。

'invokables' => array(
    'MyClass'          => 'Application\Model\MyClass',

コントローラーを使用した別の例:

必要な依存関係のない単純なコントローラーがある場合は、呼び出し可能なものを使用します。

'invokables' => array(
    'index'          => 'Mis\Controller\IndexController',

しかし、コントローラーをインスタンス化するときに、コントローラーに追加の依存関係を追加したい場合があります。

'factories' => array(
        /**
         * This could also be added as a Factory as in the example above to
         * move this code out of the config file..
         */
        //'users' => 'Application\Service\UsersControllerFactory',
        'users' => function($sm) {
            $controller = new \Application\Controller\UsersController();
            $controller->setMapper($sm->getServiceLocator()->get('UserMapper'));
            $controller->setForm($sm->getServiceLocator()->get('UserForm'));

            return $controller;
        },
于 2013-05-24T08:26:42.560 に答える