Vaidas
Vaidas

Reputation: 1028

Best practise for placing custom Entity methods in Symfony

I'm creating Symfony project. And now I'm trying to find best practice for adding custom methods.. What is yours?


Visual explanation:

users table

id | name | surname
---+------+--------
1  | John | Smith
2  | Matt | Malone

Entity\User.php

namespace TestBundle\Entity\User;

use Doctrine\ORM\Mapping as ORM;

/**
 * User
 * @ORM\Table(name="users")
 * @ORM\Entity
 */
class User
{
    /**
     * @ORM\Column(name="id", type="string", length=36)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="UUID")
     */
    private $id;

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

    /**
     * @ORM\Column(name="surname", type="string", length=255, nullable=true)
     */
    private $surname;

    /**
     * OneToMany
     */
    private $userCompanies;

    {{ Setters and Getters }}
}

Where I should store custom method, like:

function getFullName()
{
     return sprintf("%s %s", $this->getName(), $this->getSurname());
}

Or more complex:

function getCurrentUserCompany()
{
    foreach ($this->getUserCompanies() as $company) {
        if ($company->isActive()) {
            return $company;
        }
    }

    return null;
}

Please note, that all data returned via JSON

So far I tried extending class, but annotations not working as expected. Placing custom methods in same file looks trashy, since there will be more than one of them.

But.. but if there is repositoryClass - maby there is place for custom methods as well?

Thanks!

Upvotes: 2

Views: 2235

Answers (2)

Damian Polac
Damian Polac

Reputation: 934

Methods like that belong to entity class and there is no reason to split code. If many entity classes share some methods, you can always create shared base abstract class or trait for them.

If you really want separated files for sake of your aesthetic, then use traits, but remember that it's not proper and conventional use of them.

Upvotes: 1

Stev
Stev

Reputation: 1112

If it's about methods that are used mainly for display purposes then they are very similar to the getters, in my opinion they best fit is in the Entity itself, so inside your User.php class.

The repository is for defining methods for getting the entity from your storage level (DB, cache...), but the view level (your twig) should take the data from the entity itself.

If you need something more complicated or you need to reuse it, like a date filter, then it's better to create a Twig extension.

Upvotes: 3

Related Questions