私は2つのテーブルとサービスを使用する単純なZF2アプリケーションを持っています。私はZF3上で実行するように変換しようとしています。私は、サービスマネージャーコードを更新する方法を考えることができません。ここでは、コントローラ、これはもはやZF3でサポートされてどのようなコード私はgetServiceLocator()呼び出しの代わりに使用する必要があります 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);
}
}
の1の例ですか?スタックオーバーフローのどこか他の人が別の質問に答えて、createService関数を使って提案しましたが、これもZF3から削除されました。
コントローラをビルドする際に工場を使用したことはありますか? (サービスマネージャにアクセスできる)工場では、あなたの 'AuthorTable'と' BookTitleTable'とあなたの 'SpydusServiceInterface'を読み込み、あなたのコントローラを構築することができます。 – Thelonias
ZF3コントローラクラスでは、もはやServiceLocatorに対応していません。 @Theloniasが彼のコメントに書いたように、なぜあなたはすべきなのですか?ファクトリを作成し、ファクトリ内でサービスを作成し、コントローラクラスのコンストラクタに挿入します。 – Wilt