Symfony Database Tutorial code error - symfony

I've got Symfony 2 successfully installed and set up and have been following the documentation through.
I'm currently up to http://symfony.com/doc/2.0/book/doctrine.html
Everything is fine until I get to this line:
php app/console doctrine:generate:entities Acme/StoreBundle/Entity/Product
at which point I get the following error:
[RuntimeException]
The autoloader expected class "Acme\StoreBundle\Entity\Product" to be defined
in file "C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\Symf
ony\app/../src\Acme\StoreBundle\Entity\Product.php". The file was found but the
class was not in it, the class name or namespace probably has a typo.
This has happened to me on both Linux and Windows machines.
The contents of Product.php is as per the tutorial:
// src/Acme/StoreBundle/Entity/Product.php
namespace Acme\StoreBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* #ORM\Entity
* #ORM\Table(name="product")
*/
class Product
{
/**
* #ORM\Id
* #ORM\Column(type="integer")
* #ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* #ORM\Column(type="string", length=100)
*/
protected $name;
/**
* #ORM\Column(type="decimal", scale=2)
*/
protected $price;
/**
* #ORM\Column(type="text")
*/
protected $description;
}

That message comes from DebugUniversalClassLoader.php:
public function loadClass($class)
{
if ($file = $this->findFile($class)) {
require $file;
if (!class_exists($class, false) && !interface_exists($class, false)) {
throw new \RuntimeException(sprintf('The autoloader expected class "%s" to be defined in file "%s". The file was found but the class was not in it, the class name or namespace probably has a typo.', $class, $file));
}
}
}
So, the file must be there, and readable, otherwise the findFile and the require wouldn't have worked. All this check is doing is require()ing the file and then using the standard PHP class_exists() to see if the class is now there.
The only thing I can think of that could cause this message given those file contents: you've missed off the <?php at the start of the file. Now, I know this is going out on a bit of a limb, but I honestly can't think of anything else that wouldn't cause some other kind of error.

I had the same error "The file was found but the class was not in it, the class name or namespace probably has a typo.". It's only because
<?php
is missing at the beginning of the file !! Argh, copy-paste from a tutorial...
Bye !

Related

How can get a valid class in Symfony 4?

In my User.php I have the following Route:
/**
* #ORM\Table(name="app_users")
* #ORM\Entity(repositoryClass="App\Repository\UserRepository")
*/
But I get an error in my log file:
Authentication request failed. {"exception":"[object] (Symfony\\Component\\Security\\Core\\Exception\\AuthenticationServiceException(code: 0): The \"App\\Entity\\User\" entity has a repositoryClass set to \"App\\Repository\\UserRepository\", but this is not a valid class. Check your class naming. If this is meant to be a service id, make sure this service exists and is tagged with \"doctrine.repository_service\". at /Users/work/project/vendor/symfony/security/Core/Authentication/Provider/DaoAuthenticationProvider.php:85, RuntimeException(code: 0): The \"App\\Entity\\User\" entity has a repositoryClass set to \"App\\Repository\\UserRepository\", but this is not a valid class. Check your class naming. If this is meant to be a service id, make sure this service exists and is tagged with \"doctrine.repository_service\". at /Users/work/project/vendor/doctrine/doctrine-bundle/Repository/ContainerRepositoryFactory.php:71)"} []
If App\Repository\UserRepository.php doesn't exist.
Either create a valid repository class there, or remove that annotation from the entity if you don't need one.
If the file does exist then perhaps the filename or class definition the the file has a typo, e.g. wrong capital somewhere.
I moved my code from :
/**
* #ORM\Entity(repositoryClass=ParcCarburantRepository::class)
*/
To :
/**
* #ORM\Entity(repositoryClass="App\Repository\ParcCarburantRepository")
*/
It works perfectly , sorry I don't know why .. but It works.
Change :
/**
* #ORM\Table(name="CommandeLigne")
* #ORM\Entity(repositoryClass="App\Repository\CommandeLigneRepository")
*/
To :
/**
* #ORM\Entity
* #ORM\Table(name="CommandeLigne")
* (repositoryClass="App\Repository\CommandeLigneRepository")
*/

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
{
}

Symfony 2.1 error: import #ORM\Table in repository

I am upgrading an application from Symfony 2.0 to Symfony 2.1, I followed this upgrade file and all works fine except that after a cache:clear I get an error when using some repositories. Here is the error:
[Semantical Error] The annotation "#ORM\Table" in class
edasiclinic\AlertesBundle\Repository\AlertesRepository was never imported. Did you maybe
forget to add a "use" statement for this annotation?
This is one example, I get this error with other repositories. I don't understand why I have to import #ORM\Table inside a repository file if I don't use annotation there.
Also if I wait for ~10 seconds and then refresh the browser, it works...
EDIT
This is the Entity:
<?php
namespace edasiclinic\DatabaseBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* edasiclinic\DatabaseBundle\Entity\Alertes
*
* #ORM\Table(name="alertes")
* #ORM\Entity(repositoryClass="edasiclinic\AlertesBundle\Repository\AlertesRepository")
* #ORM\HasLifecycleCallbacks()
*/
class Alertes
{
/**
* #var integer $id
*
* #ORM\Id
* #ORM\Column(name="idAlerta", type="integer")
* #ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
...
}
And this the repository class:
<?php
namespace edasiclinic\AlertesBundle\Repository;
use Doctrine\ORM\EntityRepository;
use edasiclinic\DasiBundle\Funcions\AES;
class AlertesRepository extends EntityRepository
{
public function countUnread($user, $idioma, $fus)
{
// ...
}
}
Thanks
I had this very same problem today. the solution, after some googling, is apparently to include a comment block before the Repository class definition.
in your case:
/**
* AlertesRepository
*/
class AlertesRepository extends EntityRepository
{
...
}
without that comment block, you will receive the nonsensical error about "#ORM\Table". yet another Symfony/Doctrine oddity >_>
It was a PHP bug in versions prior to 5.3.8. From the symfony system requirements:
$this->addRecommendation(
version_compare($installedPhpVersion, '5.3.8', '>='),
'When using annotations you should have at least PHP 5.3.8 due to PHP bug #55156',
'Install PHP 5.3.8 or newer if your project uses annotations.'
);
See PHP bug #55156 for more details and possible workaround if you're unable to upgrade to a PHP version >= 5.3.8.
Looks like you forgot to add the use statement.
<?php
namespace Acme\MyBundle\Entity;
// Remember to include this use statement
use Doctrine\ORM\Mapping as ORM;
/**
* My Entity
*
* #ORM\Table()
* #ORM\Entity(repositoryClass="Acme\MyBundle\Entity\MyEntityRepository")
*/
class MyEntity
{
}
For me it only hapens with certain versions of PHP and the solution was to put the Repository class in a folder above the folder of entity class

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