entity entity manager repository service nedir?
Published: 2022-06-26 21:39:35

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;
```
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;
    }
```
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);
}
  
```
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
]);
```

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;
 }
}
```
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);
         }
}
```
Aynı işlemi update içinde yaptığımız zaman benzer kodları tekrar tekrar kullanmamış ve daha düzenli bir koda sahip olacağız.