maker-bundle icon indicating copy to clipboard operation
maker-bundle copied to clipboard

make:user and make:entity workflow not working properly with Symfony 6.2

Open fabpico opened this issue 2 years ago • 3 comments

I want to use make:user as in https://symfony.com/doc/current/security.html#the-user.

I have PHP 8.1.11. My composer.json:

{
  "require": {
    "symfony/runtime": "^6.2",
    "symfony/http-kernel": "^6.2",
    "symfony/framework-bundle": "^6.2",
    "symfony/console": "^6.2",
    "doctrine/doctrine-bundle": "^2.8"
  },
  "require-dev": {
    "phpunit/phpunit": "^9.5",
    "symfony/maker-bundle": "^1.48",
    "symfony/security-bundle": "^6.2"
  },
  "autoload": {
    "psr-4": {
      "App\\": "src/"
    }
  },
  "config": {
    "allow-plugins": {
      "symfony/runtime": true
    }
  }
}

When I make

php bin/console make:user

I receive

[ERROR] Missing package: Doctrine must be installed to store user data in the database, run:                           
                                                                                                                        
         composer require orm

I assume this is a Flex alias. Because when I do:

composer require orm

I receive

Did you mean one of these?   
      doctrine/orm             
      nelmio/alice             
      propel/propel            
      symfony/orm-pack         
      topthink/think

I propose to directly suggest the needed package, to be friendly with non-Flex users. So when I do (after removing composer.lock):

composer require symfony/orm-pack

I can use make:user until this happens

Doctrine ORM Manager named "" does not exist.

So I go the other way around and configure the ORM first https://symfony.com/doc/current/doctrine.html . It says I have to install:

symfony/orm-pack
symfony/maker-bundle

Already done.

DBAL connection works, tested with temporary call in controller:

$result = $this->connection->executeQuery('SELECT * FROM "public"."foo"');
$foo = $result->fetchAssociative();

Now I try out make:entity (just to test ORM)

https://symfony.com/doc/current/doctrine.html#creating-an-entity-class

Still I get

Doctrine ORM Manager named "" does not exist.

I suggest that a minimum ORM configuration is described in this make:entity documentation, or a least a direct link to another documentation page to quickly configure ORM. As in https://stackoverflow.com/questions/35810105/doctrine-orm-manager-named-does-not-exist I tried

  orm:
    auto_generate_proxy_classes: '%kernel.debug%'
    auto_mapping: true

I run make:entity again, I receive

created: src/Entity/User.php
created: src/Repository/UserRepository.php
                                                                                                                        
 [ERROR] Only attribute mapping is supported by make:entity, but the <info>App\Entity\User</info> class uses a different
         format. If you would like this command to generate the properties & getter/setter methods, add your mapping    
         configuration, and then re-run this command with the <info>--regenerate</info> flag.

https://stackoverflow.com/a/73145112/4840661 /which relates to https://github.com/symfony/maker-bundle/issues/1152 and https://github.com/symfony/maker-bundle/issues/841), suggest to downgrade to symfony/maker-bundle:1.43 .

I try again with v1.43, I receive a similar message

created: src/Entity/User.php
created: src/Repository/UserRepository.php

                                                                                                                        
 [ERROR] Only annotation or attribute mapping is supported by make:entity, but the <info>App\Entity\User</info> class uses
         a different format. If you would like this command to generate the properties & getter/setter methods, add your
         mapping configuration, and then re-run this command with the <info>--regenerate</info> flag.

Back to make:user, assuming that at least the ORM is configured correctly, I receive (among other things)

Success!

The way until this success message was very laborious, it should be more easy and straightforward.

Summarized

  • A missing dependency should not be complained with a Flex alias, but with the correct package name
  • make:user and make:entity should handle unconfigured ORM, maybe create a valid default config
  • make:entity should not throw that “Only attribute”/”Only annotation” error

Other people also still complain about the annotation error message, even after closing the issue https://github.com/symfony/maker-bundle/issues/841#issuecomment-1228537605 .

fabpico avatar Jan 31 '23 13:01 fabpico

Remove type: annotation from doctrine.yaml

vipinbose avatar Feb 02 '23 06:02 vipinbose

@vipinbose I don't have such configuration in doctrine.yaml.

fabpico avatar Feb 06 '23 08:02 fabpico

In case anyone finds this useful, I ran into the same issue. By adding the file config/packages/maker.yaml with the following content:


when@dev:
    maker:
        root_namespace: Acme\Your\Namespace

Solved the issue for me.

juliolopeztorres avatar Apr 10 '23 10:04 juliolopeztorres