Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何创建多个非共享实例而不在ZendFramework2中注入ServiceLocator?_Php_Dependency Injection_Zend Framework2_Factory_Service Locator - Fatal编程技术网

Php 如何创建多个非共享实例而不在ZendFramework2中注入ServiceLocator?

Php 如何创建多个非共享实例而不在ZendFramework2中注入ServiceLocator?,php,dependency-injection,zend-framework2,factory,service-locator,Php,Dependency Injection,Zend Framework2,Factory,Service Locator,我在module.config.php文件中有一个创建非共享服务的工厂和一个控制器工厂。这部分配置如下所示: "service_manager" => [ "factories" => [ Entity\User::class => Factory\Entity\UserFactory::class ], "shared" => [ Entity\User::class => false ] ], "c

我在module.config.php文件中有一个创建非共享服务的工厂和一个控制器工厂。这部分配置如下所示:

"service_manager" => [
    "factories" => [
        Entity\User::class => Factory\Entity\UserFactory::class
    ],
    "shared" => [
        Entity\User::class => false
    ]
],
"controllers" => [
    "factories" => [
        Controller\UserAdminController::class => Factory\Controller\UserAdminControllerFactory::class
    ]
]
<?php

namespace User\Factory\Controller\Core;

use User\Controller\UserAdminController;
use Interop\Container\ContainerInterface;
use User\Entity\User;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class UserAdminControllerFactory implements FactoryInterface{

    /**
     * @param ContainerInterface $container
     * @param string $requestedName
     * @param array|null $options
     *
     * @return UserAdminController
     */
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null){
        $serviceLocator = $container->getServiceLocator();

        return new UserAdminController($serviceLocator->get(User::class));
    }

    /**
     * @param  ServiceLocatorInterface $serviceLocator
     *
     * @return UserAdminController
     */
    public function createService(ServiceLocatorInterface $serviceLocator){
        return $this($serviceLocator, UserAdminController::class);
    }

}
用户实体是非共享的,因为我允许管理员同时添加多个用户,因此我需要实例化用户实体类的多个实例

这是我的控制器工厂:

<?php

namespace User\Factory\Controller\Core;

use User\Controller\UserAdminController;
use Interop\Container\ContainerInterface;
use User\Entity\User;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class UserAdminControllerFactory implements FactoryInterface{

    /**
     * @param ContainerInterface $container
     * @param string $requestedName
     * @param array|null $options
     *
     * @return UserAdminController
     */
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null){
        $serviceLocator = $container->getServiceLocator();

        return new UserAdminController($serviceLocator->get(User::class));
    }

    /**
     * @param  ServiceLocatorInterface $serviceLocator
     *
     * @return UserAdminController
     */
    public function createService(ServiceLocatorInterface $serviceLocator){
        return $this($serviceLocator, UserAdminController::class);
    }

}

最好的方法是将用户实体的新实例注入控制器。控制器工厂应如下所示:

"service_manager" => [
    "factories" => [
        Entity\User::class => Factory\Entity\UserFactory::class
    ],
    "shared" => [
        Entity\User::class => false
    ]
],
"controllers" => [
    "factories" => [
        Controller\UserAdminController::class => Factory\Controller\UserAdminControllerFactory::class
    ]
]
<?php

namespace User\Factory\Controller\Core;

use User\Controller\UserAdminController;
use Interop\Container\ContainerInterface;
use User\Entity\User;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class UserAdminControllerFactory implements FactoryInterface{

    /**
     * @param ContainerInterface $container
     * @param string $requestedName
     * @param array|null $options
     *
     * @return UserAdminController
     */
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null){
        $serviceLocator = $container->getServiceLocator();

        return new UserAdminController($serviceLocator->get(User::class));
    }

    /**
     * @param  ServiceLocatorInterface $serviceLocator
     *
     * @return UserAdminController
     */
    public function createService(ServiceLocatorInterface $serviceLocator){
        return $this($serviceLocator, UserAdminController::class);
    }

}

最好的方法是将用户实体的新实例注入控制器。控制器工厂应如下所示:

"service_manager" => [
    "factories" => [
        Entity\User::class => Factory\Entity\UserFactory::class
    ],
    "shared" => [
        Entity\User::class => false
    ]
],
"controllers" => [
    "factories" => [
        Controller\UserAdminController::class => Factory\Controller\UserAdminControllerFactory::class
    ]
]
<?php

namespace User\Factory\Controller\Core;

use User\Controller\UserAdminController;
use Interop\Container\ContainerInterface;
use User\Entity\User;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class UserAdminControllerFactory implements FactoryInterface{

    /**
     * @param ContainerInterface $container
     * @param string $requestedName
     * @param array|null $options
     *
     * @return UserAdminController
     */
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null){
        $serviceLocator = $container->getServiceLocator();

        return new UserAdminController($serviceLocator->get(User::class));
    }

    /**
     * @param  ServiceLocatorInterface $serviceLocator
     *
     * @return UserAdminController
     */
    public function createService(ServiceLocatorInterface $serviceLocator){
        return $this($serviceLocator, UserAdminController::class);
    }

}

我不确定您现在看到的可能是什么,但是为什么不将工厂注入控制器并创建用户实体呢?您还可以共享UserFactory的内容吗?您是否有充分的理由为域实体编写工厂?无论如何,我会尝试为这样的任务编写一个控制器插件,因为我的工厂需要服务定位器,如果我注入工厂,我也必须注入服务定位器,这是一种反模式。因此,我不能这样做。有什么想法吗?@edigu我认为创建一个控制器插件不是一个好主意,因为它会在控制器中引入更多的依赖项,更具体地说,在每个控制器中,因为控制器插件在应用程序范围内都是可用的。我将添加UserFactory,但这适用于每个具有依赖项的obejct。例如,一个表单或一个必须重复多次(才能有多个实例)的字段集,用于查询数据库。@edigu我已经添加了UserFactory,您可以看一下。也许这里是您正在查看的内容,我不确定,但是为什么不将工厂注入控制器并创建用户实体呢?您还可以共享UserFactory的内容吗?您是否有充分的理由为域实体编写工厂?无论如何,我会尝试为这样的任务编写一个控制器插件,因为我的工厂需要服务定位器,如果我注入工厂,我也必须注入服务定位器,这是一种反模式。因此,我不能这样做。有什么想法吗?@edigu我认为创建一个控制器插件不是一个好主意,因为它会在控制器中引入更多的依赖项,更具体地说,在每个控制器中,因为控制器插件在应用程序范围内都是可用的。我将添加UserFactory,但这适用于每个具有依赖项的obejct。例如,一个表单或一个必须重复多次(才能有多个实例)的字段集,用于查询数据库。@edigu我已经添加了UserFactory,您可以查看一下。