0

這是什麼問題呢?我是zend框架中的新成員........................................... .................................................. ..............................ZF - Doctrine2無法檢索知識庫

enter image description here

這是我的文件夾結構

enter image description here

enter image description here

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, 
     ]; 
    } 
} 
+0

請同時在此處放入User \ Entity \ User的源代碼 –

回答

1

你混合了從數據庫中檢索數據的兩種不同的方法。

您可以使用Zend方法,如TableGateway's或者您可以使用Doctrine(EntityManager/Repositories)。

所以你必須在你想要在你的控制器中使用的一種方法之間做出選擇。

所以,如果你想堅持原則,你可以在Ocramius的下面的幻燈片看看:http://ocramius.github.io/presentations/doctrine-orm-and-zend-framework-2/#/59

那麼你很可能需要更新您的User型號:

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, 
     ]; 
    } 
} 

更新跟隨您的用戶模塊的文件module.config.php,並將以下內容添加到您的配置中:

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' 
    ) 
    ), 
) 
), 

請注意,t他需要Doctrine-ORM模塊。請參閱:https://github.com/doctrine/DoctrineORMModule