Конвертировать ZF2 Service Manager в ZF3

У меня есть простое приложение ZF2, которое использует две таблицы и службу, и я пытаюсь преобразовать его для запуска на ZF3. Я не могу понять, как обновить код менеджера сервисов. Вот пример одного из контроллеров

    <?php
namespace LibraryRest\Controller;

use Zend\Mvc\Controller;

use Library\Service\SpydusServiceInterface;
use Library\Service\SpydusService;
use Library\Model\BookTitle;
use Library\Model\BookTitleTable;
use Library\Model\Author;
use Library\Model\AuthorTable;

use Zend\Mvc\Controller\AbstractRestfulController;
use Zend\View\Model\JsonModel;

class SearchRestController extends AbstractRestfulController {

protected $bookTitleTable;

public function getBookTitleTable() {
if (! $this->bookTitleTable) {
$this->bookTitleTable = $this->getServiceLocator ()->get ( 'BookTitleTable' );
}
return $this->bookTitleTable;
}

protected $authorTable;

public function getAuthorTable() {
if (! $this->authorTable) {
$sm = $this->getServiceLocator ();
$this->authorTable = $sm->get ( 'AuthorTable' );
}
return $this->authorTable;
}

protected $spydusService;

public function __construct(SpydusServiceInterface $spydusService) {
$this->spydusService = $spydusService;
}

public function getList($action, $first, $last) {
if ($action == 'search') {
return $this->searchAction ( $first, $last );
}
}

public function searchAction() {
$message = array ();
$results = array ();
$first = urldecode ( $this->params ()->fromRoute ( 'first' ) );
$last = urldecode ( $this->params ()->fromRoute ( 'last' ) );
if ($this->getAuthorTable ()->getAuthorId ( $first, $last ) === false) {
$results [0] = array ('count' => 0, 'message' => 'This author not found in database', 'first' => $first, 'last' => $last, 'title' => '', 'titleCode' => '', 'link' => '', 'authorId' => '' );
} else {
$authorId = $this->getAuthorTable ()->getAuthorId ( $first, $last )->author_id;
$books = $this->spydusService->searchBooks ( $first, $last );
$count = count ( $books );
foreach ( $books as $foundTitle ) {
if ($foundTitle->getMessage () == 'Nothing found') {
$results [0] = array ('count' => 0, 'message' => 'Nothing found by library search', 'first' => $first, 'last' => $last, 'title' => '', 'titleCode' => '', 'link' => '', 'authorId' => '' );
break;
}
$searchBooks = $this->getBookTitleTable ()->getId ( $foundTitle->getTitle (), $authorId );
if ($searchBooks->count () == 0) {
$addUrl = "http://newlib.rvw.dyndns.org/library/search/add/" . $authorId . '/' . $foundTitle->getTitle ();
$results [] = array ('count' => $count, 'message' => $foundTitle->getMessage (), 'title' => $foundTitle->getTitle (), 'titleCoded' => $foundTitle->getTitleCoded (), 'first' => $foundTitle->getAuthorFirst (), 'last' => $foundTitle->getAuthorLast (), 'link' => $foundTitle->getLink (), 'authorId' => $authorId, 'addUrl' => $addUrl );
}
}
}
if (count ( $results ) == 0) {
$results [0] = array ('count' => 0, 'message' => 'Nothing found by library search', 'first' => $first, 'last' => $last, 'title' => '', 'titleCode' => '', 'link' => '', 'authorId' => '' );
}
return new JsonModel ( $results );
}
}

Какой код я должен использовать вместо вызова getServiceLocator (), так как он больше не поддерживается в ZF3? В другом месте Stack Overflow кто-то ответил на другой вопрос и предложил использовать функцию createService, но это также было исключено из ZF3.

3

Решение

Есть несколько разных подходов, но вы уже используете самый распространенный: прохождение зависимостей через конструктор. Вы в настоящее время делаете это для вашего $spydusService класс, поэтому измените конструктор так, чтобы он также принимал аргументы для двух предложений таблицы, что-то вроде:

class SearchRestController extends AbstractRestfulController
{
protected $bookTitleTable;

protected $authorTable;

protected $spydusService;

public function __construct(SpydusServiceInterface $spydusService, $bookTitleTable, $authorTable)
{
$this->spydusService = $spydusService;
$this->bookTitleTable = $bookTitleTable;
$this->authorTable = $authorTable;
}

[etc.]
}

тогда где-то у вас уже есть фабрика для SearchRestController (это может быть закрытием в вашем Module.php класс или автономный заводской класс). Вы хотите изменить это, чтобы передать дополнительные аргументы:

public function getControllerConfig()
{
return array(
'factories' => array(
'SearchRestController' => function ($sm) {
$spydusService = $sm->get('SpydusService'); // this part you already have
$bookTitleTable = $sm->get('BookTitleTable');
$authorTable = $sm->get('AuthorTable');

return new SearchRestController($spydusService, $bookTitleTable, $authorTable);
}
)
);
}
3

Другие решения

Вы захотите создать фабрику для сборки контроллера. Этот новый класс будет реализовывать FactoryInterface, В функции __invoke вы будете использовать экземпляр $ container для получения всех ваших зависимостей вашего контроллера и либо передавать их в качестве аргументов в конструкторе, либо устанавливать их в экземпляре конструктора. Затем просто верните экземпляр вашего контроллера из этой функции.

Ваш контроллер должен быть обновлен с полями для поддержки этого. Вы также должны будете обязательно зарегистрировать свой завод в своей конфигурации.

2

По вопросам рекламы [email protected]