Миграция с ZF2 на ZF 3 без getServicelocator();

Я новичок в ZF3 и мне нужна ваша помощь. В ZF3 больше нет службы Locator. Поэтому я создал класс Factory, чтобы заменить сервисный локатор в своем коде.

Вот мой код с сервисным локатором в моем файле AbstractController.php:

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

Теперь я заменил сервис Locator в 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?


person gp_stack    schedule 18.12.2017    source источник
comment
Сервисного локатора нет, потому что использовать его вне заводов — плохая практика. Вы не должны пытаться воспроизвести, как это работает, вы должны понять, как получить такое же поведение, не используя его.   -  person Unex    schedule 19.12.2017
comment
Привет, спасибо за ответ. Хорошо, я понимаю, но верна ли идея моего кода?   -  person gp_stack    schedule 19.12.2017
comment
Как я вижу правильно. Но было бы лучше удалить getService(), так как он вам больше не нужен. Вы вводите $service в конструктор и назначаете его контроллеру. Позже в Controller вы можете просто использовать $this-›service   -  person tasmaniski    schedule 19.12.2017
comment
Не могли бы вы опубликовать свой заводской пример в качестве ответа и принять его, чтобы этот вопрос можно было пометить как ответ.   -  person Xerkus    schedule 21.12.2017
comment
Ты имеешь ввиду меня? @Ксеркус   -  person gp_stack    schedule 22.12.2017


Ответы (1)


В ZF3 первое, что вы делаете, это создаете свой сервис и фабрику для него. Возьмем в этом примере UserManager.php в папке Services.

Итак, у нас есть в папке Service -> UserManager.php и в Service -> 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.

Удачи!

person Norbert Boros    schedule 04.05.2018