zend tutorial mac framework composer php zend-framework2 zend-framework3

php - tutorial - Convierta ZF2 Service Manager a ZF3



zend tutorial 3 (2)

Vas a querer crear una fábrica para construir el controlador. Esta nueva clase implementará FactoryInterface . En la función __invoke, usarás la instancia $ container para recuperar todas tus dependencias de tu controlador y pasarlas como argumentos en el constructor o establecerlas en la instancia del constructor. Luego solo devuelve tu instancia de controlador desde esa función.

Su controlador necesitará ser actualizado con campos para apoyar esto. También deberá asegurarse de registrar su fábrica en su configuración.

Tengo una aplicación ZF2 simple que usa dos tablas y un servicio, y estoy tratando de convertirlo para que se ejecute en ZF3. No puedo encontrar la forma de actualizar el código del administrador del servicio. Aquí hay un ejemplo de uno de los controladores

<?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 ); } }

¿Qué código debería usar en lugar de llamar a getServiceLocator () ya que esto ya no es compatible con ZF3? En otra parte de Stack Overflow alguien respondió a otra pregunta y sugirió usar una función createService, pero esto también se ha eliminado de ZF3.


Hay un par de enfoques diferentes, pero ya está usando el más común: pasar las dependencias a través del constructor. Actualmente estás haciendo esto para tu clase $spydusService , así que cambia el constructor para aceptar también argumentos para las dos clases de tabla, algo como:

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.] }

luego, en algún lugar ya tiene una fábrica para SearchRestController (puede ser un cierre en su clase Module.php o una clase de fábrica independiente). Deseará modificar esto para pasar los argumentos adicionales:

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); } ) ); }