Reputation: 147
whats this wrong with this? I'm new in zend framework...........................................................................................................................
this is my folder struct
UserControllerFactory.php
<?php
namespace Admin\Controller\Factory;
use Admin\Controller\UserController;
use User\Entity\User;
use Admin\Form\UserForm;
use User\Model\UserTable;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Mapping\Entity;
use Interop\Container\ContainerInterface;
class UserControllerFactory
{
public function __invoke(ContainerInterface $container)
{
/** @var EntityManager $entityManager */
$entityManager = $container->get(EntityManager::class);
$repository = $entityManager->getRepository(User::class);
$userForm = $container->get(UserForm::class);
return new UserController($entityManager, $repository, $userForm);
}
}
UserController.php
<?php
namespace Admin\Controller;
//use User\Entity\User;
use Admin\Form\UserForm;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityRepository;
use Zend\Hydrator\ClassMethods;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\Http\Request;
use Zend\View\Model\ViewModel;
class UserController extends AbstractActionController
{
/**
* @var EntityRepository
*/
private $repository;
/**
* @var EntityManager
*/
private $entityManager;
private $form;
public function __constructor(EntityManager $entityManager, EntityRepository $repository, UserForm $form){
$this->form = $form;
$this->repository = $repository;
$this->entityManager = $entityManager;
}
public function indexAction()
{
return new ViewModel([
'users' => $this->repository->fetchAll()
]);
}
public function addAction()
{
$form = $this->form;
$form->get('submit')->setValue('Adicionar');
$request = $this->getRequest();
if (!$request->isPost()) {
return ['form' => $form];
}
$form->setData($request->getPost());
if (!$form->isValid()) {
return ['form' => $form];
}
$post = $form->getData();
$this->entityManager->persist($post);
$this->entityManager->flush();
return $this->redirect()->toRoute('admin/user');
}
public function editAction()
{
$id = (int)$this->params()->fromRoute('id', 0);
if (!$id || !($post = $this->repository->find($id))) {
return $this->redirect()->toRoute('admin/user');
}
$form = $this->form;
$form->bind($post);
$form->get('submit')->setAttribute('value', 'Edit Post');
$request = $this->getRequest();
if (!$request->isPost()) {
return [
'id' => $id,
'form' => $form
];
}
$form->setData($request->getPost());
if (!$form->isValid()) {
return [
'id' => $id,
'form' => $form
];
}
$this->entityManager->flush();
return $this->redirect()->toRoute('admin/user');
}
public function deleteAction()
{
$id = (int)$this->params()->fromRoute('id', 0);
if (!$id || !($post = $this->repository->find($id))) {
return $this->redirect()->toRoute('admin/user');
}
$this->entityManager->remove($post);
$this->entityManager->flush();
return $this->redirect()->toRoute('admin/user');
}
}
UserTable.php
<?php
/**
* Created by PhpStorm.
* User: jho
* Date: 24/06/2017
* Time: 18:55
*/
namespace User\Model\Factory;
use Zend\Db\Exception\RuntimeException;
use Zend\Db\TableGateway\TableGatewayInterface;
class UserTable
{
private $tableGateway;
public function find($id)
{
$id = (int)$id;
$rowset = $this->tableGateway->select(['id' => $id]);
$row = $rowset->current();
if (!row) {
throw new RuntimeException(sprintf(
'Could not retrieve the row %d', $id
));
}
return $row;
}
public function fetchAll(){
return $this->tableGateway->select();
}
public function save(User $user){
$data = [
'username'=>$user->username,
'fullname'=>$user->fullname,
'password'=>$user->password,
];
$id = (int) $user->id;
if((int)$user->id === 0){
$this->tableGateway->insert($data);
return;
}
if(!$this->find($id)){
throw new RuntimeException(sprintf(
'Could not retrieve the row %d', $id
));
}
$this->tableGateway->update($data, ['id'=>$id]);
}
}
User.php
<?php
namespace User\Model;
class User
{
public $id;
public $fullname;
public function exchangeArray(array $data){
$this->id = (!empty($data['id'])) ? $data['id']: null;
$this->title = (!empty($data['fullname'])) ? $data['fullname']: null;
}
public function getArrayCopy(){
return[
'id'=>$this->id,
'fullname'=>$this->fullname,
];
}
}
Upvotes: 0
Views: 74
Reputation: 1382
You are mixing up two different approaches of retrieving data from your database.
You can either use the Zend approach as in TableGateway
's or you can go with Doctrine (EntityManager/Repositories).
So you've got to make a choice between one of the methods you want to use within your controller.
So if you want to stick with Doctrine, you could take a look at the following slides of Ocramius: http://ocramius.github.io/presentations/doctrine-orm-and-zend-framework-2/#/59
So you pretty much have to update your User
model:
namespace User\Model;
use Doctrine\ORM\Mapping AS ORM;
/**
* @ORM\Entity()
*/
class User
{
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer")
*/
public $id;
/** @ORM\Column(type="string") */
public $fullname;
public function exchangeArray(array $data){
$this->id = (!empty($data['id'])) ? $data['id']: null;
$this->title = (!empty($data['fullname'])) ? $data['fullname']: null;
}
public function getArrayCopy(){
return[
'id'=>$this->id,
'fullname'=>$this->fullname,
];
}
}
Update the following file module.config.php
of your User module and add the following to your configuration:
array(
'doctrine' => array(
'driver' => array(
'application_entities' => array(
'class' =>'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
'cache' => 'array',
'paths' => array(__DIR__ . '/../src/User/Model')
),
'orm_default' => array(
'drivers' => array(
'User\model' => 'application_entities'
)
),
)
),
Notice that this requires the Doctrine-ORM-module. See: https://github.com/doctrine/DoctrineORMModule
Upvotes: 1