FOSUser bundle can't create user in command line - symfony

I am new to symfony (symfony2) so i was asked to install sonata admin plus FOSUser bundle to be integrated. Everything went fine, the sonata admin is working fine and the configuration for the fosuser is supposed to be fine as in tuts.
When I go to my terminal and write this command :
php app/console fos:user:create admin admin#local.com admin
I get this error
[Doctrine\ORM\ORMInvalidArgumentException]
The given entity of type 'Sonata\UserBundle\Entity\BaseUser' (admin) has no
identity/no id values set. It cannot be added to the identity map.
I have no idea what to do with this error.

thank you all for helping :)
after mr #fred answer and the help of one of my friends the error is gone and the bundle is working , so do the next if you have the same problem i have :
go to src/Application/Sonata/UserBundle/Entity/User.php
add
public function __construct() {
parent::__construct();
}
then go to your main config.yml and added this :
fos_user:
db_driver: orm
firewall_name: main
user_class: Application\Sonata\UserBundle\Entity\User

I think the problem is that the FOSUserBundle expects an entity with a Doctrine ID mapping. Try this:
Create an own user class in one of your bundles:
<?php
namespace YOUR\NAMESPACE\YourUserBundle\Entity;
use Sonata\UserBundle\Entity\BaseUser;
use Doctrine\ORM\Mapping as ORM;
/**
* #ORM\Entity
* #ORM\Table(name="my_users")
*/
class User extends BaseUser
{
/**
* #ORM\Id
* #ORM\Column(type="integer")
* #ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
public function __construct()
{
parent::__construct();
}
}
?>
Now point the user class to your new entity:
fos_user:
user_class: YOUR\NAMESPACE\YourUserBundle\Entity\User

Related

User password not encrypted when using FOSUserBundle + EasyAdminBundle with Symfony 3.4

I use Symfony 3.4 with FOSUserBundle and EasyAdminBundle.
I've been stuck for a while on the following problem: when I create a new user via EasyAdmin, the password entered is not hashed, it remains clear in the database and in the edit form of the created user (in EasyAdmin), while there is no problem when I create a user via the form generated by FOSUserBundle (register).
My User entity :
<?php
// src/Repas/UserBundle/Entity/User.php
namespace Repas\UserBundle\Entity;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
/**
* #ORM\Entity
* #ORM\Table(name="fos_user")
*/
class User extends BaseUser
{
/**
* #ORM\Id
* #ORM\Column(type="integer")
* #ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
}
My AdminController.php file :
<?php
namespace Repas\MenusBundle\Controller;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AdminController as BaseAdminController;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
class AdminController extends BaseAdminController
{
public function createNewUserEntity()
{
return $this->get('fos_user.user_manager')->createUser();
}
public function persistUserEntity($user)
{
$this->get('fos_user.user_manager')->updateUser($user, false);
parent::persistEntity($user);
}
public function updateUserEntity($user)
{
$this->get('fos_user.user_manager')->updateUser($user, false);
parent::updateEntity($user);
}
}
In my config.yml file :
easy_admin:
entities:
User:
class: Repas\UserBundle\Entity\User
export_path: '%kernel.root_dir/../var/export/user'
password_encoding: { algorithm: 'bcrypt', cost: 12 }
In my security.yml file :
encoders:
Repas\UserBundle\Entity\User: bcrypt
In my routing.yml file :
fos_user:
resource: "#FOSUserBundle/Resources/config/routing/all.xml"
easy_admin_bundle:
resource: "#RepasMenusBundle/Controller/AdminController.php"
type: annotation
prefix: /admin
I've been through many forums, as well as the official docs, I think I followed everything properly but I certainly missed something.
Thank you for your help.
The EasyAdminBundle doesn't define an option to encrypt the password, it only provides options to save the entities (a crud) which you can extend by defining custom actions based on routes or actions inside an overrided AdminController in order to integrate with FOSUserBundle.
Example
easy_admin:
entities:
User:
list:
actions:
- { name: 'create_user', type: 'route' } //or nothing on type to use the action option
At this point you already have either a defined controller accessible by route or an overriden controller which handles the specified User actions. You only need to use the FOSUser methods to encrypt the password properly, as read in this doc.
Hope it helps!
Ok, I guess my mistake is that in the form generated by Easyadmin to create a new user, Easyadmin generates a field named "password" instead of "plainPassword" which is the one FOSUser uses to encrypt the entered password. So I think I just have to create a new "plainPassword" field in my "Easyadmin new user" form and enter the user password in that field to encrypt it. Then the encrypted password will be stored in "password" field of the database.
I will tell you if that is the solution.

FOSUserBundle undefined method getName();

I'm trying to install FOSUserBundle for the first time. After following the steps, I tried executing php app/console doctrine:schema:update --force. This gives me the following error. I can't understand why it's looking for getName(), it's not shown in the bundle in examples online.
PHP Fatal error: Call to undefined method music\userBundle\userBundle::getName() in /home/me/public_html/music/app/bootstrap.php.cache on line 2505
my bundle:
<?php
// src/userBundle/Entity/User.php
namespace userBundle\Entity;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
/**
* #ORM\Entity
* #ORM\Table(name="fos_user")
*/
class User extends BaseUser
{
/**
* #ORM\Id
* #ORM\Column(type="integer")
* #ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
public function __construct()
{
parent::__construct();
// your own logic
}
}
It seems the root directory of your application is interpreted as namespace.
The error output say music\userBundle::getName(), but call getName() on your entity name should be userBundle\User::getName() .
I think you have to re-build your application using the following class architecture :
YourNamespace\UserBundle
So, you entity should become
YourNamespace\UserBundle\Entity\User
and
YourNamespaceUserBundle::User
If you can, post your config.yml and security.yml files
First of all you need to make sure that you include your bundle in AppKernel.php, also should review your namespaces, during best practices your namespace should contain vendor name, bundle name, directory to class, so u should consider to set your namespace to something like this:
namespace music\userBundle\Entity;
Because for now it looks like you do something wrong:
music\userBundle\userBundle::getName()
and
namespace userBundle\Entity;
And after installing new bundles (or after any important changes) dont forget to clear you by cli command or manually. Try this, and if it doesnt helps then we will go deeper to your project structure.
Sorry seems like named the userBundle wrong, as following a video tutorial I did it manually, and forgot the extends part.
namespace music\userBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class userBundle extends Bundle
{
}

Extending the User entity

I'm trying to extend the User Entity of the sonata user bundle, but it always fails (at least when I want to use ist with the sonata admin bundle). If I use the Application/Sonata/UserBundle/Entity/User Entity it works and I can edit it in the dashboard.
My Entity looks like this:
<?php
namespace MyNamespace\MyBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\EntityManager;
use Sonata\UserBundle\Entity\BaseUser as BaseUser;
/**
* #ORM\Entity
* #ORM\Table(name="fos_user")
*/
class User extends BaseUser
{
/**
* #var integer
*
* #ORM\Column(name="id", type="integer")
* #ORM\Id
* #ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
}
In my config.yml I defined the following options:
fos_user:
db_driver: orm
firewall_name: main
user_class: MyNamespace\MyBundle\Entity\User
group:
group_class: Application\Sonata\UserBundle\Entity\Group
group_manager: sonata.user.orm.group_manager
service:
user_manager: sonata.user.orm.user_manager
And:
sonata_user:
security_acl: true
manager_type: orm
class:
user: MyNamespace\MyBundle\Entity\User
The login is working correctly, but then I get the error message
"An exception has been thrown during the rendering of a template ("Unable to generate a URL for the named route "admin_sonata_user_user_create" as such route does not exist.") in SonataAdminBundle:Block:block_admin_list.html.twig at line 39."
My routing.yml looks like this:
admin:
resource: '#SonataAdminBundle/Resources/config/routing/sonata_admin.xml'
prefix: /
_sonata_admin:
host: www.mydomain.com
resource: .
type: sonata_admin
prefix: /
schemes: [https]
Even if I follow this tutorial (Extending Sonata User Bundle and adding new fields) step by step I get the same error.
Application/Sonata/UserBundle/Entity/User is extended Sonata/UserBundle/Entity/User so why not just to make changes there instead of another class?
It's already extended bundle so you can make all the changes there. I put my additional fields there.
My file Application/Sonata/UserBundle/Entity/User.php is like:
namespace Application\Sonata\UserBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Sonata\UserBundle\Entity\BaseUser as BaseUser;
/**
* User
* #ORM\Entity
* #ORM\Table(name="fos_user_user")
*/
class User extends BaseUser
{
/**
* #var integer
* #ORM\Column(type="integer")
* #ORM\Id
* #ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* #var string
*/
private $company;
If your really want to use another class you need to take care about routing.
Check \vendor\sonata-project\user-bundle\Resources\config\admin_orm.xml - it's the place where original class is added as a service.
You can see there %sonata.user.admin.user.entity% parameter - you could change this in config if you want to change to another class. I think it's better than changing fos_user.user_class.
You can also move the whole file to your Application/Sonata/UserBudle but then you need to load it inside DependencyInjection/ApplicationSonataUserExtension.php
Btw, this is really tricky in Sonata which user bundles as Paweł wrote and takes a lot of debugging to make it work

Symfony2 FOSUserBundle User entity field override

I have a problem with overriding an entity.
I need the field emailCanonical to be not be unique.
Here is what I've done:
In my UserBundle\Resources\config\doctrine\User.orm.xml I've added the following attribute-overrides configuration, according to the Doctrine2 documentation
<attribute-overrides>
<attribute-override name="emailCanonical">
<field column="email_canonical" unique="false" name="emailCanonical" />
</attribute-override>
</attribute-overrides>
Then I ran the following console commands
$ php app/console doctrine:migrations:diff
$ php app/console doctrine:migrations:migrate
Everything worked fine. emailCanonical was made non unique.
But now, when I need to generate an entity in other bundles of project, I have a strange error:
$ php app/console doctrine:generate:entities SkyModelsBundle:Category
Generating entity "Sky\Bundle\ModelsBundle\Entity\Category"
[Doctrine\ORM\Mapping\MappingException]
Invalid field override named 'emailCanonical' for class 'Sky\Bundle\UserBundle\Entity\User'.
doctrine:generate:entities [--path="..."] [--no-backup] name
However, if I remove the override settings from xml mapping, everything works fine.
You override using PHP annotations like so (This is supported starting from doctrine version 2.3 and above, please note that in the documentation it mentions that you cannot override types , however I was able to do so using the latest version of doctrine , at the time of writing it is 2.4.4):
<?php
namespace Namespace\UserBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use FOS\UserBundle\Model\User as BaseUser;
/**
* User
* #ORM\Entity
* #ORM\AttributeOverrides({
* #ORM\AttributeOverride(name="id",
* column=#ORM\Column(
* name = "guest_id",
* type = "integer",
* length = 140
* )
* )
* })
*/
class myUser extends BaseUser
{
/**
* #ORM\Id()
* #ORM\Column(type="integer")
* #ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
}
This is specified in the documentation at: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html#overrides
I believe the name attribute of the field tag is not required, since it is already specified for the attribute-override tag
Try this
<attribute-overrides>
<attribute-override name="emailCanonical">
<field column="email_canonical" unique="false" />
</attribute-override>
</attribute-overrides>
Quote from official documentation, so may be its the only way.
If you need to change the mapping (for instance to adapt the field
names to a legacy database), the only solution is to write the whole
mapping again without inheriting the mapping from the mapped
superclass.
It seems that FOSUserBundle entities aren't imported correctly into your project.
Make sure FOSUserBundle is present in "mappings" section ("doctrine" branch) of your config.yml
doctrine:
orm:
entity_managers:
default:
connection: default
mappings:
AcmeDemoBundle: ~
FOSUserBundle: ~
Got the same bug just now, and I solved it. Doctrine throws this Mappingexception in ClassMetadataInfo when it cannot find the related property (attribute or relation) in its mapping.
So, in order to override "emailCanonical" attribute, you need to use "attribute-overrides" and "attribute-override" (as you did), and redefine php class property in your entity :
<?php
...
class YourUser extends BaseUser
{
...
/**
* Email canonical
*
* #var string
*
* #ORM\Column(name="email_canonical", type="string", length=255, unique=false)
*/
protected $emailCanonical;
#EDIT : using this solution causes me another bug.
It solved the one about "Invalid field override named…", but I got another one with "Duplicate definition of column…" when trying to validate schema with php app/console doctrine:schema:validate command.
Any idea ?
Your class that extends BaseUser should be like this:
<?php
namespace Namespace\UserBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use FOS\UserBundle\Model\User as BaseUser;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* User
* #ORM\Entity
* #ORM\Table(name="user")
* #UniqueEntity(fields="email", message="your costum error message")
*
*/
class myUser extends BaseUser
{
/**
* #ORM\Id()
* #ORM\Column(type="integer")
* #ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
}
?>
I know this is an old post, but i found a solution, at least it worked for me, maybe it would be helpful for someone else.
Well, i had the same issue and i'm using a custom manager for the fos_user, in the declaration file config.yml under doctrine entity_manager custom manager i declared the mapping to FOS_userBundle, BUT what was missing is to tell FOS_user that we use a diffrent manager and that's by adding :
fos_user:
---- db_driver: orm
---- model_manager_name: MyCustom_Manager

Class ..Entity\User is not a valid entity or mapped super class

I'm getting this error when I try to clear the cache (for example):
[Doctrine\ORM\Mapping \MappingException] Class
Aib\PlatformBundle\Entity\User is not a valid entity or mapped super
class.
This is User.php:
<?php
// src/Aib/PlatformBundle/Entity/User.php
namespace Aib\PlatformBundle\Entity;
use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
/**
* #ORM\Entity
* #ORM\Table(name="fos_user")
*/
class User extends BaseUser
{
/**
* #ORM\Id
* #ORM\Column(type="integer")
* #ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
public function __construct()
{
parent::__construct();
// your own logic
}
}
And this is the place where User.php is stored:
javier#javier:~/programacion/aib/src/Aib/PlatformBundle/Entity$ ls
User.php UserRepository.php
This is the AppKernel.php:
public function registerBundles()
{
$bundles = array(
...
new Aib\PlatformBundle\AibPlatformBundle(),
...
);
sf 2.0.4
In my case I was missing * #ORM\Entity in my class definition.
/**
* #ORM\Entity
* #ORM\Table(name="listtype")
*/
class ListType
{
...
}
I had the exact same experience with my implementation of the FOS UserBundle and found I was able to resolve the issue by removing the MyBundle\Resources\config\doctrine folder.
I dont fully understand the cause (newbie) but think the issue is a result of having database content built in bother directions, ie from doctrine entities and by reverse engineering some tables.
I had the same problem and it turned out to be the app/config/config.yml
It needed the defintion of the default bundle as below NameBundle, then it worked fine
orm:
auto_generate_proxy_classes: %kernel.debug%
default_entity_manager: default
entity_managers:
default:
mappings:
NameBundle: ~
In my case the problem was solved by changing my servers cache from eAccelerator to APC.
Apparently eAccelerator strips all the comments from files which breaks your annotations.
I had the same error, but this was because I wasn't including the Sonata Application:
try this:
add a line to your AppKernel.php
$bundles = array(
...
new Application\Sonata\UserBundle\ApplicationSonataUserBundle(),
...
If you inherited from mapped class, you can add #ORM\SuperMappedClass in entity's annotation.
You can read most information in this article.

Resources