DEV Community

Alperen kr
Alperen kr

Posted on

entity entity manager repository service nedir?

Selamlar ben Alperen,
Bu yazıda sizlere entity entity manager repository ve service'den bahsedeceğim.

Entity veritabanımız ile kod arasında ilişki kurmamızı sağlayan kalıcı nesneler olarak tanımlanabilir.
Örneğin veritabanımızda user tablosunda id, name ve age olduğunu varsayalım. Bu tabloya kodda erişmek için bir entity yazalım.

/**
 * @Entity(repositoryClass="App\Repositories\UserRepository")
 * @Table(name="users")
 */
class User
{
    /**
     * @var int
     * @Column(name="id", type="integer", nullable=false)
     * @Id
     * @GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var string|null
     *
     * @Column(name="name", type="string", length=100, nullable=true)
     */
    private $name;

    /**
     * @var int|null
     *
     * @Column(name="age", type="integer", nullable=true)
     */
    private $age;
Enter fullscreen mode Exit fullscreen mode

bu kısımda tablomuzdaki columnları özellikleri ile tanlımladık. Şimdi ise getters ve setters'larını yazıp entity'mizi hazır hale getireceğiz.

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

    public function setId(int $id): void
    {
        $this->id = $id;
    }

    public function getAge(): ?int
    {
        return $this->age;
    }

    public function setAge(?int $age): void
    {
        $this->age = $age;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(?string $name): void
    {
        $this->name = $name;
    }
Enter fullscreen mode Exit fullscreen mode

EntityManager, sağladığı metodlar aracılığı ile entityler üzerinde işlemler gerçekleştirilir.

Oluşturduğumuz User entity'si için bir insert işlemi yapmak istediğimizde

   public  function  insert()
{
        $user = new User();
        $user->setName('alperen');
        $user->setAge('17');
     $this->getEntityManager()->persist($user);
}

Enter fullscreen mode Exit fullscreen mode

EntityManager'ın bize sağlamış olduğu persist metodu sayesinde tablomuza yeni bir kayıt ekledik.

Repository temel olarak veritabanı sorgulama işlemlerinin bir merkezden yapılmasını sağlayarak iş katmanına taşınmasını önler ve bu şekilde sorgu ve kod tekrarına engel olmuş olur. Yani asıl amaç veri işlem ve sorgulamaların tekrarlardan kaçınılarak merkezi bir yapıya çekilmesidir.

Repositorylerin en iyi özelliği ise find, findby, findOneBy ve findAll gibi query methodlarına sahip olması.
Örneğin user tablosundan yaşı 17 olanları listelemek istediğimiz zaman;

$entityManager->getRepository(User::class)->findby([
'age' => 17
]);
Enter fullscreen mode Exit fullscreen mode

Service, genel bir görevi gerçekleştirmesi için oluşturduğumuz koddur.

Mesela insert ve update işlemlerinde girilen yaş 18 den küçükse yani çocuk ise sisteme kayıt olmamalı.
bu işlem için hem insert hemde update fonksiyonunda aynı kodu yazmak gerekir.

bunun yerine bir UserService oluşturup içerisine isChild fonksiyonunu yazalım.

public function isChild($age): bool
{
  if($age > 18) {
    return true;
} else {
   return false;
 }
}
Enter fullscreen mode Exit fullscreen mode

Daha sonra yazdığımız bu kodu kullanalım.

public  function  insert()
{
  /** @var UserService $userService */
   $userService = $this->container->get(UserService::class);

        if($userService->isChild($age))
        {
          $user = new User();
          $user->setName('alperen');
          $user->setAge('17');
          $this->getEntityManager()->persist($user);
         }
}
Enter fullscreen mode Exit fullscreen mode

Aynı işlemi update içinde yaptığımız zaman benzer kodları tekrar tekrar kullanmamış ve daha düzenli bir koda sahip olacağız.

Top comments (0)