Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

pauLin panissa

[Problema] - ZF2 + Doctrine 2

Recommended Posts

Bom dia,

 

Estou com um problema,

 

Estou fazendo applicação ZF2 e Doctrine2, eh quando vou cadastrar News, oh ZF2 + Doctrine2 registra + no banco de dados fica null, estou quebrando a cabeça faz umas horas e nada, abaixo vou colocar codigo:

 

Controller

<?php

namespace SiteAdmin\Controller;

use Zend\Mvc\Controller\AbstractActionController,
    Zend\View\Model\ViewModel;

use SiteAdmin\Form\NewsForm as FormNews;

class NewsController extends AbstractActionController {
    /**
     * @var EntityManager
     */
    protected $em;
    
    
    /**
    * @Admin/Noticias
    */
    public function indexAction(){
        
        $listNews = $this->getEm()->getRepository('Site\Entity\News')
                                  ->findBy(array(), array('News_id'=>"DESC"), 10);
        
        return new ViewModel(array('news'=>$listNews));
        
    }
    /**
    * @Admin/Noticias/Add
    */
    public function addAction(){
        $form = new FormNews();
        
        if($this->getRequest()->getPost()){
            $form->setData($this->getRequest()->getPost());
            if($form->isValid()){
                $service = $this->getServiceLocator()->get('Site\Service\News');
                $service->insert($this->getRequest()->getPost()->toArray());
                
                return $this->redirect()->toRoute('site-admin', array('controller'=>'noticias'));

            }
            
        }

      return new ViewModel(array('form'=>$form));
        
    }
    
    /**
     * @return EntityManager
     */
    private function getEm(){
        if($this->em === null)
            $this->em = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
        
        return $this->em;
        
    }
    
    
    
    
}

 

Form

<?php

namespace SiteAdmin\Form;

use Zend\Form\Form;

class NewsForm extends Form {
	
	public function __construct($name = null){
		parent::__construct('newstransparalela');
	
		$this->setAttribute('method', 'post');
                $this->setInputFilter(new NewsFilter);

		$this->add(array(
			'name' => 'News_id',
			'attributes' => array(
				'type' => 'hidden',
			)
		));
                
                $this->add(array(
                        'name' => 'News_date',
                        'options'=>array(
                            'type'=>'hidden',
                        ),
                        'attributes' => array(
                            'id' => 'News_date',
                            'value' => \date("d/m/Y"),
                        )
                ));
                
		$this->add(array(
			'name' => 'News_title',
			'options' => array(
				'type'=> 'text',
				'label' => '<h3>Titulo</h3>',
			),
			'attributes' => array(
				'id' => 'News_title',
				'class' => 'input-xxlarge',
				'placeholder' => 'Titutlo da notícia'
			),

		));
                
        $this->add(array(
            'name' => 'News_subtitle',
            'options'=>array(
                    'type'=>'text',
                    'label'=>'<h3>Subtitulo</h3>',
            ),
            'attributes' => array(
                    'id' => 'News_subtitle',
                    'class' => 'input-xxlarge',
                    'placeholder' => 'Subtitulo da notícia',
            )
        ));
                
        $this->add(array(
            'name' => 'News_post',
            'options'=>array(
                    'label'=>'<h3>Post</h3>',
            ),
            'attributes' => array(
                    'id' => 'redactor',
                    'type'=>'textarea',
            )
        ));
                
        $this->add(array(
            'name' => 'News_description',
            'options'=>array(
                    'type'=>'text',
                    'label'=>'<h3>Descrição</h3>',
            ),
            'attributes' => array(
                    'id' => 'News_description',
                    'class' => 'input-xxlarge',
                    'placeholder' => 'Breve descrição da noticia.'
            )
        ));
        
        $this->add(array(
            'name' => 'News_keywords',
            'options'=>array(
                    'type'=>'text',
                    'label'=>'<h3>Tags</h3>',
            ),
            'attributes' => array(
                    'id' => 'News_keywords',
                    'class' => 'span2 tagManager',
                    'placeholder' => 'Tags'
            )
        ));
                                
        $this->add(array(
			'name' => 'News_slug',
			'options' => array(
				'type' => 'text',
				'label' => '<h3>Link</h3>',
    	),
			'attributes' => array(
				'id' => 'News_slug',
				'class' => 'input-xxlarge',
				'readonly' => 'readonly',
				'placeholder' => 'Link do post'
			),
		));
                
        $this->add(array(
            'name' => 'submit',
            'type' => 'Zend\Form\Element\Submit',
            'attributes' => array(
                'value'=> 'Salvar',
                'class' => 'btn btn-success'
            )
        ));

    }
}

 

Service

<?php

namespace Site\Service;

use Doctrine\ORM\EntityManager;
use Site\Entity\News as NewsEntity;

class News {

    /**
     * @var EntityManager
     */
    protected $em;
    
    public function __construct(EntityManager $em){
        $this->em = $em;
    }
    
    public function insert(array $data){
        $entity = new NewsEntity($data);
        
        $this->em->persist($entity);
        $this->em->flush();
        return $entity;        
    }
}

?>

 

Entity

<?php

namespace Site\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

use Site\Entity\Configurator;

/**
 * @ORM\Entity
 * @ORM\Table(name="newstransparalela")
 * @ORM\Entity(repositoryClass="Site\Entity\NewsRepository")
 */
class News {
    
    public function __construct($options = null){
        Configurator::configure($this, $options);
    }
    
     /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     * @var int
     */
    protected $News_id;
    /**
     * @ORM\Column(type="text")
     * @var string
     */
    protected $News_slug;
    /**
     * @ORM\Column(type="text")
     * @var string
     */
    protected $News_title;
    /**
     * @ORM\Column(type="text")
     * @var string
     */
    protected $News_subtitle;
    /**
     * @ORM\Column(type="text")
     * @var string
     */
    protected $News_post;
    /**
     * @ORM\Column(type="text")
     * @var string
     */
    protected $News_date;
    /**
     * @ORM\Column(type="text")
     * @var string
     */
    protected $News_description;
    /**
     * @ORM\Column(type="text")
     * @var string
     */
    protected $News_keywords;
    /**
     * @ORM\Column(type="text")
     * @var string
     */
    protected $News_robots;
    /**
     * @ORM\Column(type="integer")
     * @var int
     */
    protected $News_situation;
    /**
     * @ORM\Column(type="integer")
     * @var int
     */
    protected $News_author;
    
    public function getNews_id() {
        return $this->News_id;
    }

    public function setNews_id($News_id) {
        $this->News_id = $News_id;
    }

    public function getNews_slug() {
        return $this->News_slug;
    }

    public function setNews_slug($News_slug) {
        $this->News_slug = $News_slug;
    }

    public function getNews_title() {
        return $this->News_title;
    }

    public function setNews_title($News_title) {
        $this->News_title = $News_title;
    }

    public function getNews_subtitle() {
        return $this->News_subtitle;
    }

    public function setNews_subtitle($News_subtitle) {
        $this->News_subtitle = $News_subtitle;
    }

    public function getNews_post() {
        return $this->News_post;
    }

    public function setNews_post($News_post) {
        $this->News_post = $News_post;
    }

    public function getNews_date() {
        return $this->News_date;
    }

    public function setNews_date($News_date) {
        $this->News_date = $News_date;
    }

    public function getNews_description() {
        return $this->News_description;
    }

    public function setNews_description($News_description) {
        $this->News_description = $News_description;
    }

    public function getNews_keywords() {
        return $this->News_keywords;
    }

    public function setNews_keywords($News_keywords) {
        $this->News_keywords = $News_keywords;
    }

    public function getNews_robots() {
        return $this->News_robots;
    }

    public function setNews_robots($News_robots) {
        $this->News_robots = $News_robots;
    }

    public function getNews_situation() {
        return $this->News_situation;
    }

    public function setNews_situation($News_situation) {
        $this->News_situation = $News_situation;
    }

    public function getNews_author() {
        return $this->News_author;
    }

    public function setNews_author($News_author) {
        $this->News_author = $News_author;
    }

    public function toArray(){
        return array(
            'News_id'=>$this->getNews_id(),
            'News_slug'=>$this->getNews_slug(),
            'News_title'=>$this->getNews_title(),
            'News_subtitle'=>$this->getNews_subtitle(),
            'News_post'=>$this->getNews_post(),
            'News_date'=>$this->getNews_date(),
            'News_description'=>$this->getNews_description(),
            'News_keywords'=>$this->getNews_keywords(),
        );
    }
    
    
}

 

Configurator


<?php

namespace Site\Entity;
 
class Configurator {
    /** Configure a target object with the provided options.
     * 
     *  The options passed in must be a Traversable object with option names for keys.
     *  Option names are case insensitive and will be stripped of underscores. By convention,
     *  option names are in lowercase and with underscores separated words.
     * 
     *  The target object is expected to have a setter method for each option passed. By convention,
     *  setters are named using camelcase with a 'set' prefix.
     * 
     *  Example: option_name -> setOptionName()
     * 
     *  @param object $target The object that needs to be configured.
     *  @param \Traversable $options The configuration to apply. Traversable is amongst
                                     others implemented by Zend\Config and arrays
     *  @param boolean $tryCall When true and $target has a __call() function, try call if no setter is available.
     *  @return void Nothing
 
     */
    public static function configure($target, $options, $tryCall=false)
    {
        if ( !is_object($target) )
        {
            throw new \Exception('Target should be an object');
        }
        if ( !($options instanceof Traversable) && !is_array($options) )
        { 
            throw new \Exception('$options should implement Traversable');
        }
         
        $tryCall = (bool) $tryCall && method_exists($target, '__call');
         
        foreach ($options as $name => &$value)
        { 
            $setter = 'set' . str_replace(' ', '', ucwords(str_replace('_', ' ', $name))); 
     
            if( $tryCall || method_exists($target,$setter) )
            {
                call_user_func(array($target,$setter),$value);
            }
            else
            {
                continue; // instead of throwing an exception
            }
        }   
        return $target;
    }
 
}
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu dei uma olhada meio por cima do seu código e vou arriscar a dizer que o problema ocorre porque os campos da sua tabela estão meio fora do padrão, com os nomes começando com letras maiúsculas, daí como você está usando o configurador que faz os sets automáticos dá erro.

 

Tente fazer os sets manualmente pra ver se não dá erro, se não der provavelmente o erro é este mesmo.

 

Por exemplo, em vez disso:

 

 

 
public function insert(array $data){
        $entity = new NewsEntity($data);
        
        $this->em->persist($entity);
        $this->em->flush();
        return $entity;        
    }

 

Tente fazer assim:

 

 

 

 
public function insert(array $data){
   $entity = new NewsEntity();
 
   $entity->setNews_slug($data['News_slug']);
   $entity->setNews_title($data['News_title']);
   $entity->setNews_subtitle($data['News_subtitle']);
   $entity->setNews_post($data['News_post']);
   // e assim por diante, com os demais sets
 
   $this->em->persist($entity);
   $this->em->flush();
    return $entity;        
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi pauLin.

 

Você está gerando a classe de entidade automaticamente pelo Doctrine?

 

Se você observar a lógica do método configure da classe Configurator, ele remove os underlines e deixa a próxima letra maiúscula, ou seja, se você passar um índice "News_description" ele vai chamar o método setNewsDescription da sua entidade, entretanto, se você observar na sua entidade o método está como setNews_description, entendeu?

 

Se você criou esses getter e setters manualmente faça a correção deles, você pode fazer isso automaticamente usando a sua IDE. Se você está gerando pelo Doctrine e está ficando errado é porque os campos da tabela estão fora do padrão como eu havia dito, tente deixar os campos da tabela começando com letra minúscula que deve resolver.

 

Qualquer coisa posta aí.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi pauLin.

 

Você está gerando a classe de entidade automaticamente pelo Doctrine?

 

Se você observar a lógica do método configure da classe Configurator, ele remove os underlines e deixa a próxima letra maiúsculas, ou seja, se você passar um índice "News_description" ele vai chamar o método setNewsDescription da sua entidade, entretando se você observar na sua entidade o método está como setNews_description, entendeu?

 

Se você criou esses getter e setters manualmente faça a correção deles, você pode fazer isso automaticamente usando a sua IDE. Se você está gerando pelo Doctrine e está ficando errado é porque os campos da tabela estão fora do padrão como eu havia dito, tente deixar os campos da tabela começando com letra minúscula que deve resolver.

 

Qualquer coisa posta aí.

 

 

Eu acabei de ver o erro, ta no Configurator.php

 

ele ta removendo o _ (underline),

 

vlws por tudo Leozitho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.