1

私のモジュール構成ファイルには、ライブラリとモデルを ServiceManager にロードして、コントローラーで取得できるようにするこれらの行があります。すべてのモデルが同じ依存関係を必要とすることがわかります。これらの反復的なコード ブロックを使用せずに、どうすればそれらを挿入できますか? これは私には間違っているように見えますが、異なるライブラリに対して同じコード行を実行する方法がわかりません。それとも、工場をまったく使用する必要がありますか? ありがとうございました!

'service_manager' => array(
    'abstract_factories' => array(
        'Zend\Cache\Service\StorageCacheAbstractServiceFactory',
        'Zend\Log\LoggerAbstractServiceFactory',
    ),
    'aliases' => array(
        'translator' => 'MvcTranslator',
    ),
    'factories' => array(
        // Models
        'Application\Model\Photo' => function($serviceLocator) {
            $coreLibrary = $serviceLocator->get('Project\CoreLibrary');
            $io = $serviceLocator->get('Project\IO');
            $class = new Application\Model\Photo($coreLibrary, $io);
            return $class;
        },
        'Application\Model\Album' => function($serviceLocator) {
            $coreLibrary = $serviceLocator->get('Project\CoreLibrary');
            $io = $serviceLocator->get('Project\IO');
            $class = new Application\Model\Album($coreLibrary, $io);
            return $class;
        },
        'Application\Model\Tag' => function($serviceLocator) {
            $coreLibrary = $serviceLocator->get('Project\CoreLibrary');
            $io = $serviceLocator->get('Project\IO');
            $class = new Application\Model\Tag($coreLibrary, $io);
            return $class;
        },
        'Application\Model\User' => function($serviceLocator) {
            $coreLibrary = $serviceLocator->get('Project\CoreLibrary');
            $io = $serviceLocator->get('Project\IO');
            $class = new Application\Model\User($coreLibrary, $io);
            return $class;
        },
        'Application\Model\Message' => function($serviceLocator) {
            $coreLibrary = $serviceLocator->get('Project\CoreLibrary');
            $io = $serviceLocator->get('Project\IO');
            $class = new Application\Model\Message($coreLibrary, $io);
            return $class;
        },
    ),
),
4

2 に答える 2

2

この場合、AbstractFactory の使用を検討する必要があります。以下のコードを参照してください。

namespace Application\Model;
use Zend\ServiceManager\AbstractFactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class AbstractModelFactory implements AbstractFactoryInterface
{
    public function canCreateServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName)
    {
        $requestedName = explode('\\', $requestedName);

        if ((!isset($requestedName[0]) || $requestedName[0] != 'Application')
            || (!isset($requestedName[1]) || $requestedName[1] != 'Model'))
        {
            return false;
        }

        $modelName = $requestedName[2];
        return class_exists('Application\Model\\'.$modelName);
    }

    public function createServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName)
    {
        $requestedName = explode('\\', $requestedName);
        $modelName = $requestedName[2];

        $coreLibrary = $serviceLocator->get('Project\CoreLibrary');
        $io = $serviceLocator->get('Project\IO');
        $class = 'Application\Model\\'.$modelName;
        return new $class($coreLibrary, $io);
    }
}

次に、次のようにファクトリを登録します。

'service_manager' => [
    'abstract_factories' => [
        'Application\Model\AbstractModelFactory'
    ]
]
于 2014-11-07T08:09:39.457 に答える