Zend Framework 3 - Учение не найдено - PullRequest
       19

Zend Framework 3 - Учение не найдено

0 голосов
/ 21 сентября 2018

Цель состоит в том, чтобы создать модуль, в который можно вставить все сущности, а затем использовать их в других модулях.Вот почему я создал модуль Entity, в который я ввел сущности.К сожалению, когда я пытаюсь использовать один из этих объектов в базовом контроллере, я получаю сообщение об ошибке: класс не найден

Это мой композитор

"autoload": {
        "psr-4": {
            "Application\\": "module/Application/src/",
            "Entity\\": "module/Entity/src/"
        }
    },

Я уже выполняю эту команду

composer dump-autoload      

Мой класс сущности находится под

module/Entity/src/Model/    

Это мой класс

<?php

namespace Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * SysUserRole
 *
 * @ORM\Table(name="sys_user_role")
 * @ORM\Entity
 */
class SysUserRole
{
    /**
     * @var int
     *
     * @ORM\Column(name="ID_SYS_USER_ROLE", type="integer", nullable=false, options={"unsigned"=true})
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $idSysUserRole;

    /**
     * @var string
     *
     * @ORM\Column(name="NAME", type="string", length=100, nullable=false)
     */
    private $name;

    /**
     * @var string
     *
     * @ORM\Column(name="DESCRIPTION", type="string", length=255, nullable=false)
     */
    private $description;

    /**
     * @return int
     */
    public function getIdSysUserRole()
    {
        return $this->idSysUserRole;
    }

    /**
     * @param int $idSysUserRole
     */
    public function setIdSysUserRole($idSysUserRole)
    {
        $this->idSysUserRole = $idSysUserRole;
    }

    /**
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * @param string $name
     */
    public function setName($name)
    {
        $this->name = $name;
    }

    /**
     * @return string
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * @param string $description
     */
    public function setDescription($description)
    {
        $this->description = $description;
    }


}

Это мой config \ autoload \ doctrine.global.php

 'doctrine' => [
        'connection' => [
            'orm_default' => [
                'driverClass' => PDOMySqlDriver::class,
                'params' => [
                    'host'     => 'localhost',
                    'user'     => '***',
                    'password' => '****',
                    'dbname'   => 'mydb',
                    'charset'  => 'utf8',
                    'driverOptions' => array(
                        1002 => 'SET NAMES utf8'
                    )
                ]
            ],
        ],
        'authentication' => [
            'orm_default' => [
                'object_manager' => 'Doctrine\ORM\EntityManager',
                'identity_class' => 'Application\Entity\User',
                'identity_property' => 'email',
                'credential_property' => 'password',
            ],
        ],
        'driver' => [
            'entity_driver' => [
                'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
                'cache' => 'array',
                'paths' => [__DIR__ . '/../../module/Entity/src/Model/']
            ],
            'orm_default' => [
                'drivers' => [
                    '\Entity' => 'entity_driver'
                ]
            ]
        ],
    ],

В действии контроллера я пробую это

$entity = new SysUserRole();    

Ошибка:

Class 'Entity\SysUserRole' not found    

Редактировать:

Ошибка изменена

Я двигаюсьэтот код внутри module.config.php

'doctrine' => [
        'driver' => [
            __NAMESPACE__ . '_driver' => array(
                'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
                'cache' => 'array',
                'paths' => array(__DIR__ . '/../src/Model')
            ),
            'orm_default' => [
                'drivers' => [
                    //was \Entity
                    'Entity\Model' =>  __NAMESPACE__ . '_driver'
                ]
            ]
        ],
    ]

новая ошибка

    The class 'Entity\Model\SysUserRole' was not found in the chain configured namespaces \Entity\

1 Ответ

0 голосов
/ 21 сентября 2018

Структура папок и зарегистрированное пространство имен psr-4.Я ожидаю, что пространство имен сущности будет Entity\Model с указанным именем класса.

Кстати, использование модуля для определенной цели, вероятно, будет лучшим подходом.Наличие сущностей на модуль для целей модуля (например, объекты пользователя и профильные сущности в модуле пользователя) имеет смысл.

namespace SomeSpace

use Doctrine\ORM\Mapping\Driver\AnnotationDriver;

return [
    'doctrine' => [
        'driver' => [
            __NAMESPACE__ . '_driver' => [
                'class' => AnnotationDriver::class,
                'cache' => 'array',
                'paths' => [
                    __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'src'
                    . DIRECTORY_SEPARATOR . 'Entity',
                ]
            ],
            'orm_default'             => [
                'drivers' => [
                    __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver'
                ],
            ],
        ],
    ],
];

Для каждого модуля потребуется указанная выше конфигурация из-за использования глобальных констант __NAMESPACE__ и __DIR__.


ПРИМЕЧАНИЕ: Убедитесь, что имена пространств имен совпадают с именами папок, например:

module\Address\Entity\Address (последний - имя класса для Address.php)

Структура папки здесь:

module\Address\Entity\**.php


Пример: Класс сущности и связанный composer.json

ОтПримеры ссылок:

composer.json

"autoload": {
    "psr-4": {
        "Keet\\Form\\Examples\\": "src/"
    },

Address.php

<?php

namespace Keet\Form\Examples\Entity;

use Doctrine\ORM\Mapping as ORM;
/**
 * @ORM\Table(name="addresses")
 * @ORM\Entity
 */
class Address extends AbstractEntity
{
...
}
...