getServicelocator()
comete un error. Por lo tanto, necesita una forma alternativa. Y extiende AbstractTableGateway
o ServiceLocatorAwareInterface
tienen errores.
La implementación en fábrica ayudará al controlador a obtener objetos.
* El código de muestra del usuario será similar al del álbum.
1) clase de fábrica (RegisterControllerFactory.php) * copiado createUser función de controlador de
namespace Users\Controller\Factory;
use Users\Controller\RegisterController;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\ServiceManager\Exception\ServiceNotCreatedException;
class RegisterControllerFactory
{
public function __invoke($serviceLocator)
{
$sm = $serviceLocator;
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$resultSetPrototype = new \Zend\Db\ResultSet\ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new \Users\Model\User);
$tableGateway = new \Zend\Db\TableGateway\TableGateway('user' /* table name */, $dbAdapter, null, $resultSetPrototype);
$user = new \Users\Model\User();
$userTable = new \Users\Model\UserTable($tableGateway);
$controller = new RegisterController($userTable, $serviceLocator);
return $controller;
}
}
2) controlador (RegisterController) de espacio de nombres de Usuarios \ Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Users\Form\RegisterForm;
use Users\Form\RegisterFilter;
use Users\Model\User;
use Users\Model\UserTable;
use Zend\ServiceManager\ServiceLocatorInterface;
class RegisterController extends AbstractActionController
{
protected $userTable;
protected $serviceManager;
public function __construct(UserTable $userTable, ServiceLocatorInterface $serviceManager)
{
$this->userTable = $userTable;
$this->serviceManager = $serviceManager;
}
public function indexAction()
{
$form = new RegisterForm();
$viewModel = new ViewModel(array('form' => $form));
return $viewModel;
}
public function processAction()
{
if (!$this->request->isPost()) {
return $this->redirect()->toRoute(NULL , array(
'controller' => 'register',
'action' => 'index'
));
}
$post = $this->request->getPost();
$form = new RegisterForm();
$inputFilter = new RegisterFilter();
$form->setInputFilter($inputFilter);
$form->setData($post);
if (!$form->isValid()) {
$model = new ViewModel(array(
'error' => true,
'form' => $form,
));
$model->setTemplate('users/register/index');
return $model;
}
// Create user
$this->createUser($form->getData());
return $this->redirect()->toRoute(NULL , array(
'controller' => 'register',
'action' => 'confirm'
));
}
public function confirmAction()
{
$viewModel = new ViewModel();
return $viewModel;
}
protected function createUser(array $data)
{ /*able to delete or modify */
$sm = $this->serviceManager;
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$resultSetPrototype = new \Zend\Db\ResultSet\ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new \Users\Model\User);
$tableGateway = new \Zend\Db\TableGateway\TableGateway('user' /* table name */, $dbAdapter, null, $resultSetPrototype);
$user = new User();
$user->exchangeArray($data);
$userTable = new UserTable($tableGateway);
$userTable->saveUser($user);
return true;
}
}
3) module.config.php
return array(
'controllers' => array(
'invokables' => array(
'Users\Controller\Index' => 'Users\Controller\IndexController',
'Users\Controller\login' => 'Users\Controller\LoginController',
//delete 'Users\Controller\Register'
),
'factories' => array(
'Users\Controller\Register' => 'Users\Controller\Factory\RegisterControllerFactory',
),
),
Bien, muchas gracias, realmente funciona! Y cómo estar con clases distintas de la clase se extiende AbstractTableGateway, por ejemplo, con las clases de los formularios (se extiende Zend \ Form), las clases de los elementos (se extiende Zend \ Form \ Element)? ¿Cómo usar el ServiceLocator allí?O úselo, ¿hay una mala idea? ... – Eremite
Si la clase se crea a través del ServiceManager que implementa la interfaz conocida, el ServiceManager se inyecta después de que se crea la clase. Para Zend \ Form, esto puede plantear un problema ya que gran parte de la configuración de los elementos se realiza generalmente en el constructor (SM inyectado después de este punto). Hay una publicación en el blog que habla de esto: http://www.michaelgallego.fr/blog/?p=205 – DrBeza
Entendí la esencia de tu método. No está claro cómo hacer que ServiceManager llame automáticamente al método setServiceManager cuando crea una instancia del formulario que amplía la clase de formulario que describe en su blog. Usted escribe la necesidad de usar la matriz 'invokables' para el ServiceManager, podría decir en detalle cómo hacerlo. Gracias. – Eremite