Zdravím, chcem sa spýtať na jeden teoretický problém. Začal som prepisovať svoj blog na Doktrínu, aby som sa to naučil. Kým som používal MagicAccessors svet bol krásny. Ale keďže vo videu https://www.youtube.com/watch?… sa hovorí, že BaseEntita sa nemá používať a MagicAccessor je len na prototypovanie, tak som sa ho snažil odstrániť. No ale skončil som s obrovskou triedou, ktorá vyzerá hrozne. Na každú property musím mať getter a setter. Niečo robím blbo, alebo ako sa toho zbavím? Nemohla by existovať nejaká trajta, ktorá by umožnila, ku niektorým premenným pristupovať zvonka? spravilo by sa pole s povolenými premennými a __get() by prechádzala toto pole, aby zistila či je premenná prístupná. Niečo je blbo, keď som skončil s metódou getId(). Živá ukážka (setery tam ani nie sú):

namespace App\Model\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Nette\Utils\ArrayHash;
use Tracy\Debugger;


/**
 * @ORM\Entity
 * @ORM\Table(name="users",    options={"collate"="utf8_slovak_ci"})
 */
class User
{

    //use \Kdyby\Doctrine\Entities\MagicAccessors;
    use \Kdyby\Doctrine\Entities\Attributes\Identifier;


    /** @ORM\Column(type="string", length=30, unique=true) */
    protected $user_name;

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

    /** @ORM\Column(type="string", length=255, nullable=true) */
    protected $password;

    /** @ORM\Column(type="smallint"), options={"unsigned"=true} */
    protected $active;

    /** @ORM\Column(type="datetime") */
    protected $created;

    /** @ORM\Column(type="string", length=40, nullable=true) */
    protected $confirmation_code;

    /** @ORM\Column(type="text", nullable=true) */
    protected $social_network_params;

    /**
     * @ORM\OneToMany(targetEntity="Article", mappedBy="user", cascade={"persist"})
     */
    protected $articles;

    /**
     * @ORM\ManyToMany(targetEntity="Role", inversedBy="users")
     * @ORM\JoinTable(name="users_roles")
     */
    private $roles;


    public function __construct( ArrayHash $params )
    {
        $this->articles = new ArrayCollection();
        $this->roles = new ArrayCollection();
        $this->created = new \DateTime();

        if ( $params )
        {
            $this->create( $params );
        }
    }


    /**
     * @param $params
     * @param bool|FALSE $admin
     */
    public function create( $params, $admin = FALSE )
    {
        $this->user_name = $params['user_name'];
        $this->password = $params['password'];
        $this->email = $params['email'];
        $this->active = 0;
        $this->confirmation_code = isset( $params['confirmation_code'] ) ? $params['confirmation_code'] : NULL;
        $this->social_network_params = isset( $params['social_network_params'] ) ? $params['social_network_params'] : NULL;

        foreach ( $params['roles'] as $role )
        {
            $this->addRole( $role );
        }

    }


    public function addRole( Role $role )
    {
        $this->roles->add( $role );
    }


    /**
     * @return array
     */
    public function getArray()
    {
        return [
            'user_name'             => $this->user_name,
            'email'                 => $this->email,
            'active'                => $this->active,
            'created'               => $this->created,
            'social_network_params' => $this->social_network_params,
        ];
    }


    public function getId()
    {
        return $this->id;
    }

    public function getRoles()
    {
        return $this->roles;
    }

    public function getActive()
    {
        return $this->active;
    }

    public function getPassword()
    {
        return $this->password;
    }

    public function getSocialNetworkParams()
    {
        return $this->social_network_params;
    }

    public function getConfirmationCode()
    {
        return $this->confirmation_code;
    }
}

Zdravím,

toto by mě také velice zajímalo – sledoval jsem právě onu přednášku na YT a překvapila mě i poznámka, že použití setterů/getterů není ideální. Přemýšlel jsem nad jinými možnostmi, ale v praxi převážně je potřeba se dostat ke všem property, a většinu stějně tak nastavovat.

Použití, které uvedl Vladimír výše také není ideální, co se týče metody “create”, jelikož je nutné, aby bylo z venší znát implementační detaily oněch $params.

Z tohoto důvodu by mě zajímalo, jaké jsou jiné alternativy a jakým způsobem to Filip myslel, ideálně příklad nějaké obsáhlejší entity?

Děkuji


You must first log in to participate in this discussion