【问题标题】:Migration from ZF2 to ZF 3 without getServicelocator();在没有 getServicelocator() 的情况下从 ZF2 迁移到 ZF 3;
【发布时间】:2017-12-18 19:16:58
【问题描述】:

我是 ZF3 的新手,需要您的帮助。 在 ZF3 中不再有服务定位器。所以我创建了一个工厂类来替换我代码中的服务定位器。

这是我的 AbstractController.php 文件中带有服务定位器的代码:

protected function getService()
{
    return $this->getServiceLocator()->get($service); //remove from ZF3
    return $this->service = $service;
}

现在我替换了 AbstractController.php 中的服务定位器:

protected function getService($service)
{
    $service = $this->service;
    return $this->service = $service;
}

在 Module.Config.php 中我添加了以下几行:

return [
    'controllers' => [
        'factories' => [
            Controller\AbstactController::class => Controller\AbstactControllerFactory::class,
        ],
],

我创建了一个 AbstractControllerFactory 文件,其中包含以下几行:

<?php

namespace Application\Controller;

use Application\Controller\AbstractController;
use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;

    class AbstractControllerFactory implements FactoryInterface
    {
        protected function __invoke(ContainerInterface $container, $requestedName, array $options = null)
        {
            return new AbstractController($container->get(service::class));
        }
    }

我需要知道这是否是从 ZF2 到 ZF3 的正确迁移?

【问题讨论】:

  • 没有服务定位器,因为在工厂外使用它是一种不好的做法。您不应该尝试重现它的工作原理,您应该了解如何在不使用它的情况下获得相同的行为。
  • 您好,感谢您的回复。好的,我明白了,但我的代码背后的想法是否正确?
  • 我认为是正确的。但是最好删除 getService() 因为您不再需要它。您在构造函数中注入 $service 并将其分配给控制器。稍后在控制器中,您可以使用 $this->service
  • 能否请您发布您的工厂示例作为答案并接受它,以便可以将此问题标记为已回答。
  • 你是说我吗? @Xerkus

标签: php zend-framework2 migration zend-framework3


【解决方案1】:

在 ZF3 中,您要做的第一件事就是为其创建 Service 和 Factory。让我们以 Services 文件夹中的 UserManager.php 为例。

所以我们在文件夹 Service -> UserManager.phpService -> Factory -> UserManagerFactory.php

UserManagerFactory.php:

<?php
namespace User\Service\Factory;

use Interop\Container\ContainerInterface;
use User\Service\UserManager;

/**
 * This is the factory class for UserManager service. The purpose of the factory
 * is to instantiate the service and pass it dependencies (inject dependencies).
 */
class UserManagerFactory
{
    /**
     * This method creates the UserManager service and returns its instance. 
     */
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
    {        
        $entityManager = $container->get('doctrine.entitymanager.orm_default');

        return new UserManager($entityManager);
    }
}

UserManager.php:

<?php
namespace User\Service;

use User\Entity\User;

/**
 * This service is responsible for adding/editing users
 * and changing user password.
 */
class UserManager
{
    /**
     * Doctrine entity manager.
     * @var Doctrine\ORM\EntityManager
     */
    private $entityManager;  

    /**
     * Constructs the service.
     */
    public function __construct($entityManager) 
    {
        $this->entityManager = $entityManager;
    }

// REST OF YOUR CODE

}

现在我们有了服务,我们进入 User\config\modules.config.php

'service_manager' => [
    'factories' => [
        Service\UserManager::class => Service\Factory\UserManagerFactory::class,
    ],
],

基本上就是这样,我们可以在控制器中注入服务并完成工作:

<?php
namespace User\Controller;

use Zend\Mvc\Controller\AbstractActionController;

/**
 * This controller is responsible for user management (adding, editing, 
 * viewing users and changing user's password).
 */
class UserController extends AbstractActionController 
{
    /**
     * User manager.
     * @var User\Service\UserManager 
     */
    private $userManager;

    /**
     * Constructor. 
     */
    public function __construct($userManager)
    {
        $this->userManager = $userManager;
    }

   // REST OF YOUR CODE
}

我真的希望这能帮助您了解如何在 ZF3 中使用 Service。

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 2014-06-27
    • 1970-01-01
    • 2019-07-29
    相关资源
    最近更新 更多