Solucionado (ver solução)
Solucionado
(ver solução)
9
respostas

Problema com doctrine

Olá!

Qual seria o comando no windows para substituir este comando

./vendor/bin/doctrine-module orm:schema-tool:create

se eu executar este comando abaixo ele me retorna a seguinte saída:

C:\estoque\skeleton-application
λ php vendor\bin\doctrine-module orm:schema-tool:create

dir=$(d=${0%[/\\]*}; cd "$d" > /dev/null; cd "../doctrine/doctrine-module/bin" && pwd)

# See if we are running in Cygwin by checking for cygpath program
if command -v 'cygpath' >/dev/null 2>&1; then
        # Cygwin paths start with /cygdrive/ which will break windows PHP,
        # so we need to translate the dir path to windows format. However
        # we could be using cygwin PHP which does not require this, so we
        # test if the path to PHP starts with /cygdrive/ rather than /usr/bin
        if [[ $(which php) == /cygdrive/* ]]; then
                dir=$(cygpath -m "$dir");
        fi
fi

dir=$(echo $dir | sed 's/ /\ /g')
"${dir}/doctrine-module" "$@"

e no arquivo doctrine-mapping.xsd está com uma marcação de erro com essa mensagem:

cos-nonambig: WC[##other:"http://doctrine-project.org/schemas/orm/doctrine-mapping"] and WC[##other:"http://doctrine-project.org/schemas/orm/doctrine-mapping"] (or elements from their substitution group) 
 violate "Unique Particle Attribution". During validation against this schema, ambiguity would be created for those two particles.
9 respostas

Não sou um especialista nessas coisas, mas eu acho que é isso:

@ECHO OFF

mkdir EXPORT
call .\vendor\bin\doctrine-module orm:convert-mapping --force --from-database annotation ./EXPORT/
call .\vendor\bin\doctrine-module orm:generate-entities ./EXPORT/ --generate-annotations=true

pause

Oi Eduardo, tudo bom?

Esse tipo de erro costuma acontecer no windows quando tentamos executar scripts sem as configurações de ambiente necessárias.

Eu aconselharia você instalar o doctrine no seu ambiente mesmo.

Aqui eu deixei um tutorial completo de como subir o ambiente do zend e do doctrine no windows. Da uma olhada e depois tenta executar o comando:

doctrine orm:schema-tool:create

No seu terminal =)

Como estamos trabalhando bastante com o doctrine nesse curso, é bom manter ele instalado e configurado nas suas variaveis de ambiente para evitar esse tipo de problema =)

Ou, você também pode tentar executar o doctrine como um script php, algo como:

php vendor/doctrine/orm/bin/doctrine.php orm:schema-tool:create
// executa doctrine.php como um script php =)
// o diretório pode variar um pouco

Qualquer coisa é só falar.

Abraço!

Opa!

Fiz os procedimentos indicados e agora está me retornando este problema:

C:\estoque\skeleton-application
λ php vendor\doctrine\doctrine-module\bin\doctrine-module.php orm:schema-tool:create
ATTENTION: This operation should not be executed in a production environment.

Creating database schema...


  [Doctrine\ORM\Tools\ToolsException]
  Schema-Tool failed with Error 'SQLSTATE[HY000] [1045] Access denied for user 'username'@'localhost' (using password: YES)' while executing DDL: CREATE TABLE Produto (id INT AUTO_INCREMENT NOT N
  ULL, nome VARCHAR(255) NOT NULL, preco NUMERIC(10, 2) NOT NULL, descricao VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB



  [PDOException]
  SQLSTATE[HY000] [1045] Access denied for user 'username'@'localhost' (using password: YES)


orm:schema-tool:create [--dump-sql]

segue minha classe:

<?php 

namespace Estoque\Entity;

use Doctrine\ORM\Mapping as ORM;


/**
 * @ORM\Entity
 */
class Produto
{
    /**
     *@ORM\Id
     *@ORM\GeneratedValue(strategy='AUTO')
     *@ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string")
     */
    private $nome;

    /**
     * @ORM\Column(type="decimal",scale=2)
     */
    private $preco;

    /**
     * @ORM\Column(type="string")
     */
    private $descricao;
}
solução!

Eduardo, acredito que o problema seja seu usuario/senha do mysql:

  SQLSTATE[HY000] [1045] Access denied for user 'username'@'localhost' (using password: YES)

Ele está tentando conectar pelo usuario chamado username com senha. Esse usuario realmente existe no seu banco?

Da uma olhada no seu arquivo doctrine.local.php na pasta do autoload. Deve ser algo como:

autoload/doctrine.local.php
<?php 
return array(
  'doctrine' => array(
    'connection' => array(
      'orm_default' => array(
        'driverClass' =>'Doctrine\DBAL\Driver\PDOMySql\Driver',
        'params' => array(
          'host'     => 'localhost',
          'port'     => '3306',
          'user'     => 'seuUsuario',
          'password' => 'suaSenha',
          'dbname'   => 'loja',
)))));
 ?>

Estamos quase lá rsrs

Aparentemente está criando a tabela, ele mostra esta mensagem no prompt só que quando vou no banco dar um refresh all a tabela não está lá.

C:\estoque\skeleton-application
λ php vendor\doctrine\doctrine-module\bin\doctrine-module.php orm:schema-tool:create --dump-sql
CREATE TABLE Produtoss (id INT AUTO_INCREMENT NOT NULL, nome VARCHAR(255) NOT NULL, preco NUMERIC(10, 2) NOT NULL, descricao VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;

Como você está consultando o banco exatamente?

Acessando pelo terminal deveria ser algo parecido com:

mysql -u SeuUsuario -p SuaSenha
use loja
show tables;

Deveria aparecer na lista a tabela Produtoss

Na verdade estou acessando pelo workbench, conferi meu usuário e senha e está correto fiz estes comandos agora no mysql pela linha de comando e não mostra a tabela, não sei de onde está vindo este usuário username que ele está mostrando na mensagem de erro!!

Estranho... executei a query:

CREATE TABLE Produtoss (id INT AUTO_INCREMENT NOT NULL, nome VARCHAR(255) NOT NULL, preco NUMERIC(10, 2) NOT NULL, descricao VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;

Aqui no terminal e ele criou a tabela tranquilo:

mysql> desc Produtoss;
+-----------+---------------+------+-----+---------+----------------+
| Field     | Type          | Null | Key | Default | Extra          |
+-----------+---------------+------+-----+---------+----------------+
| id        | int(11)       | NO   | PRI | NULL    | auto_increment |
| nome      | varchar(255)  | NO   |     | NULL    |                |
| preco     | decimal(10,2) | NO   |     | NULL    |                |
| descricao | varchar(255)  | NO   |     | NULL    |                |
+-----------+---------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)

Isso significa que o problema não está na query sendo gerada pelo doctrine e sim pela execução do comando.

Isso pode estar relacionado a algum problema de permissão, já que estamos executando o comando pelo script do doctrine não pela ferramenta instalada e configurada no sistema operacional.

Uma abordagem é tentar executar seu terminal como adminstrador.

Outra abordagem é tentar utilizar o update do schema ao invés do create:

doctrine orm:schema-tool:update

No pior dos casos,aqui na documentação do doctrine diz:

orm:schema-tool:create Processes the schema and either create it directly on EntityManager Storage Connection or generate the SQL output.

Ou seja, ele cria o schema diretamente pelo entityManager ou devolve o sql como saida.

Uma abordagem é tentar o comando sem o dump para ver o que está sendo retornado realmente:

php vendor/doctrine/orm/bin/doctrine.php orm:schema-tool:create

Assim a gente sabe qual caso estamos pegando mesmo =)

Consegui aqui na verdade eu estava colocando as configurações de acesso ao banco de dados no lugar errado

<?php
return array(
        'doctrine' => array(
                'connection' => array(
                        'orm_default' => array(
                                'driverClass' =>'Doctrine\DBAL\Driver\PDOMySql\Driver',
                                'params' => array(
                                        'host'     => 'localhost',
                                        'port'     => '3306',
                                        'user'     => 'root',
                                        'password' => 'root',
                                        'dbname'   => 'lojas',
                                )))));

esta configuração estava colocando no config/autoload/local.php.dist e na verdade ele deve ficar no config/autoload/doctrine.local.php agora funcionou perfeito! por isso ele não estava encontrando o usuário do banco de dados.