ORM, Symfony без аннотаций

215
03 июля 2018, 18:10

Изучаю symfony 4, дико раздражает, что аннотации несут исполняющий код/надстройку. На сайте symfony не нашел инфы как работать с ORM без аннотаций, например вот код:

namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
 * @ORM\Entity(repositoryClass="App\Repository\ProductRepository")
 */
class Product
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;
    /**
     * @ORM\Column(type="string", length=255)
     */
    private $name;
    /**
     * @ORM\Column(type="integer")
     */
    private $price;
    public function getId()
    {
        return $this->id;
    }
    public function getName(): ?string
    {
        return $this->name;
    }
    public function setName(string $name): self
    {
        $this->name = $name;
        return $this;
    }
    public function getPrice(): ?int
    {
        return $this->price;
    }
    public function setPrice(int $price): self
    {
        $this->price = $price;
        return $this;
    }
}  

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

/**
 * @ORM\Id()
 * @ORM\GeneratedValue()
 * @ORM\Column(type="integer")
 */

с переменной $id. Сейчас в процессе обучения, все это создаю через консоль командами, там автогенерация всего этого, меня это просто ох**ть как бесит. Поделитесь кто разрабатывает на Symfony, какие есть варианты? кроме учить вместо него Lavarel?

Answer 1

Обычно держу конфиги в yaml Достаточно разместить в подпапке проекта Resources/config/doctrine/ файл <имя сущности>.orm.yml - он подхватится автоматически. (либо доконфигурить свой путь в настройках доктрины) Все конфиги на сайте Симфони даются в трех вариантах: аннотации, yaml, xml Напр. про маппинг

App\Entity\Product: type: entity # ... manyToOne: category: targetEntity: App\Entity\Category inversedBy: products joinColumn: nullable: false

Также можно описывать роутинг, валидацию и т.д. https://symfony.com/doc/4.1/bundles/configuration.html

Answer 2

Соглашусь, аннотации не супер удобно, но тут все на любителя. Я использую маппинги. Для примера:

config/packages/doctrine.yaml:

parameters:
    # Adds a fallback DATABASE_URL if the env var is not set.
    # This allows you to run cache:warmup even if your
    # environment variables are not available yet.
    # You should not need to change this value.
    env(DATABASE_URL): ''
doctrine:
    dbal:
        # configure these for your database server
        driver: 'pdo_mysql'
        server_version: '5.7'
        charset: utf8mb4
        default_table_options:
            charset: utf8mb4
            collate: utf8mb4_unicode_ci
        url: '%env(resolve:DATABASE_URL)%'
        types:
            carbondatetime: DoctrineExtensions\Types\CarbonDateTimeType
            date: DoctrineExtensions\Types\CarbonDateType
            time: DoctrineExtensions\Types\CarbonTimeType
    orm:
        auto_generate_proxy_classes: '%kernel.debug%'
        naming_strategy: doctrine.orm.naming_strategy.underscore
        auto_mapping: true
        mappings:
            App:
                is_bundle: false
                type: yml
                dir: '%kernel.project_dir%/src/Mappings'
                prefix: 'App\Entity'

Mappings/User.orm.yml:

App\Entity\User:
  type: entity
  id:
    userId:
      type: guid
  fields:
    username:
      type: string
      length: 191
      unique: true
    email:
      type: string
      length: 191
      unique: true
    password:
      type: text
    lastLogin:
      type: carbondatetime
      nullable: true
    createdAt:
      type: carbondatetime
      nullable: true
    updatedAt:
      type: carbondatetime
      nullable: true

Entity/User.php:

    <?php
    namespace App\Entity;
    use Carbon\Carbon;
    use Ramsey\Uuid\Uuid;
    /**
     * Class User
     * @package App\Entity
     */
    class User
    {
        /**
         * @var string
         */
        private $userId;
        /**
         * @var string
         */
        private $username;
        /**
         * @var string
         */
        private $email;
        /**
         * @var string
         */
        private $password;
        /**
         * @var Carbon
         */
        protected $createdAt;
        /**
         * @var Carbon
         */
        protected $updatedAt;
        /**
         * @var Carbon
         */
        private $lastLogin;
        /**
         * User constructor.
         */
        public function __construct()
        {
            $this->userId = Uuid::uuid4();
            $this->createdAt = Carbon::now();
            $this->updatedAt = Carbon::now();
        }
        /**
         * @return string
         */
        public function getUserId(): string
        {
            return $this->userId;
        }
        /**
         * @return Carbon
         */
        public function getCreatedAt(): Carbon
        {
            return $this->createdAt;
        }
        /**
         * @return Carbon
         */
        public function getUpdatedAt(): Carbon
        {
            return $this->updatedAt;
        }
        /**
         * @return string
         */
        public function getUsername(): string
        {
            return $this->username;
        }
        /**
         * @return string
         */
        public function getEmail(): string
        {
            return $this->email;
        }
        /**
         * @return string
         */
        public function getPassword(): string
        {
            return $this->password;
        }
        /**
         * @param string $username
         *
         * @return User
         */
        public function setUsername(string $username): User
        {
            $this->username = $username;
            return $this;
        }
        /**
         * @param string $email
         *
         * @return User
         */
        public function setEmail(string $email): User
        {
            $this->email = $email;
            return $this;
        }
        /**
         * @param string $password
         *
         * @return User
         */
        public function setPassword(string $password): User
        {
            $this->password = $password;
            return $this;
        }
        /**
         * @return Carbon
         */
        public function getLastLogin(): Carbon
        {
            return $this->lastLogin;
        }
        /**
         * @return User
         */
        public function setLastLogin(): User
        {
            $this->lastLogin = Carbon::now();
            return $this;
        }

    }
READ ALSO
Google Adsense отображение неверно + ускорение сайта

Google Adsense отображение неверно + ускорение сайта

Установил на сайт WordPress рекламу Adsense в заранее подготовленные блоки-виджеты(без плагинов) вствил скриптУстанавливал обычные рекламные блоки,...

175
QByteArray непонятная 3 в начале массива

QByteArray непонятная 3 в начале массива

Мне нужно передавать данные в HEX на удаленное устройствоЕсли я пишу:

193
Как создать нужный инстанс класса по имени без switch?

Как создать нужный инстанс класса по имени без switch?

Пользователь вводит имя фигуры и нужно создать класс этой фигурыТо есть какой класс создавать определяется в runtime

186
Звездочки вместо символов в консоли

Звездочки вместо символов в консоли

Проблема заключается в том , что я пишу функцию для ввода пароля и логина , и мне надо скрыть символы пароля , те

183