Symfony 4:生成具有学说的实体时的命名空间问题

时间:2018-02-01 21:28:47

标签: php symfony namespaces doctrine entity

我目前正在使用Symfony 4。 我用ORM和annotions编写了一个实体

#src/Entity/User.php
<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * 
 * User
 * 
 * @ORM\Table(name="user")
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 */
class User
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255, unique=true)
     */
    private $email;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $motdepasse;

    /**
     * @ORM\Column(type="string", length=255, unique=true)
     */
    private $username;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $nom;
...

我使用&#34; php bin / console doctrine生成实体:generate:entities App \ Entity \ User&#34;。不幸的是,它在php文件中生成一个实体&#34; src / App / Entity / User.php&#34;使用命名空间&#34; App \ Entity&#34;。但是命名空间应该是&#34; App \ App \ Entity&#34;因为psr-4规则。如果我添加第二个&#34; App&#34;,我会遇到与存储库和控制台生成相关联的问题。如果我让#34; App&#34;,Symfony认为命名空间是错误的。 这是我的服务配置: config/services.yml 这是我的学说配置: config/packages/doctrine.yml

我到处寻找了2天的答案(文档,教程,stackoverflow,......)。与Symfony 3相比,Symfony 4确实发生了变化。 谢谢您的帮助。 (任何链接都可以帮助我)

3 个答案:

答案 0 :(得分:1)

我找到了解决方案:

1)您必须通过

要求学说制造者
composer require doctrine maker

2)您想通过以下命令创建实体,但请确保实现第3步和第4步。然后回到这里。然后你可以进入第5步

php bin/console make:entity YourEntity

3)转到&#39;的 供应商/教义/学说束/映射/ DisconnecteMetadataFacroty.php &#39;在第150和第170行之间。然后在&#39; ///&#39;之间添加条件。斜线

#/vendor/doctrine/doctrine-bundle/mapping/disconnectedMetadataFactory.php

private function getBasePathForClass($name, $namespace, $path)
{
    $namespace = str_replace('\\', '/', $namespace);
    $search = str_replace('\\', '/', $path);
    $destination = str_replace('/'.$namespace, '', $search, $c);

    ///
    if ($namespace === 'App/Entity') {
        $destination = str_replace('/Entity', '', $search, $c);
    } else {
        $destination = str_replace('/'.$namespace, '', $search, $c);
    }
    ////


    if ($c != 1) {
        throw new \RuntimeException(sprintf('Can\'t find base path for "%s" (path: "%s", destination: "%s").', $name, $path, $destination));
    }

    return $destination;
}

4)转到&#39;的 供应商/教义/ ORM / LIB /学说/ ORM /工具/ EntityGenerator.php &#39;在第367和第375行之间。然后用以下两个替换注释行。

#/vendor/doctrine/orm/lib/Doctrine/ORM/Tools/EntityGenerator.php

/*$path = $outputDirectory . '/' . str_replace('\\', DIRECTORY_SEPARATOR, $metadata->name) . $this->extension;*/
    $metaNamePath = substr($metadata->name, 0, 4) === 'App\\' ? substr($metadata->name, 4) : $metadata->name;
    $path = $outputDirectory . '/' . str_replace('\\', DIRECTORY_SEPARATOR, $metaNamePath) . $this->extension;

5)在这里,您可以通过

生成getter和setter
php bin/console doctrine:generate:entities App:YourEntity

答案 1 :(得分:0)

Symfony 4 Src 是默认的 App 文件夹。

答案 2 :(得分:0)

Composer还遵守由COMPOSER_MEMORY_LIMIT环境变量定义的内存限制。 您可以将其设置为COMPOSER_MEMORY_LIMIT=-1,然后运行:

composer require doctrine maker

选中https://getcomposer.org/doc/articles/troubleshooting.md#memory-limit-errors