Symfony4 Serviceクラスを使用してみる ～CURD編～ 【2】

## READを作成してみる

### 事前準備

まずは以下の記事を参考に、Controller、Entity、Model、Formなどを作成しておく。
https://qiita.com/RyotaIhara/items/faab8fa2a8c3f725e736

User.phpにメソッドの追加を行っておく

```php:src/Entity/User.php
<?php

namespace App\Entity;

use App\Repository\UserRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;

/**
 * @ORM\Entity(repositoryClass=UserRepository::class)
 * @ORM\Table(name="`user`")
 */
class User implements UserInterface, \Serializable
{
    (省略)

    public function __construct()
    {
        $this->isActivated = true;
    }

    public function getSalt()
    {
        return null;
    }

    public function getRoles()
    {
        if ($this->username == 'admin') {
            return array('ROLE_ADMIN');
        } else {
            return array('ROLE_USER');
        }
    }

    public function eraseCredentials()
    {
    }

    public function serialize()
    {
        return serialize(array(
            $this->id,
            $this->user_name,
            $this->password,
            $this->isActivated,
        ));
    }

    public function unserialize($serialized)
    {
        list(
            $this->id,
            $this->user_name,
            $this->password,
            $this->isActivated,
        ) = unserialize($serialized, array('allowed_classes'
          => false));
    }
}
```

### Serviceクラスを作成して、取得のメソッド（getUsers）を記述する

以下のファイルを手動で作成
src/Service/UserService.php

```php:src/Service/UserService.php
<?php

namespace App\Service;

use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;

class UserService
{
    private $manager;

    public function __construct(EntityManagerInterface $manager)
    {
        $this->manager = $manager;
    }

    /**
     * ユーザーの一覧を取得するメソッド
     */
    public function getUsers()
    {
        $repository = $this->manager->getRepository(User::class);
        $data = $repository->findBy(
            ['isActive' => true]
        );
    
        return $data;
    }
}
```

##### 気をつける点

* AbstractControllerを継承しているわけではないので、以下を定義して、EntityManagerを使用できるようにする
※useで引き込み、プライベート変数・コンストラクタを定義。

```php
use Doctrine\ORM\EntityManagerInterface;

class UserService
{
    private $manager;

    public function __construct(EntityManagerInterface $manager)
    {
        $this->manager = $manager;
    }
```

* 「is_sctive」が「false」のものは取得しないので、findByで条件指定しておく。

### Controllerクラスでメソッドを呼び出す

```php:src/Controoler/UserController.php
<?php

namespace App\Controller;

use App\Entity\User;
use App\Service\UserService;
use App\Form\UserType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;

class UserController extends AbstractController
{
    /**
     * @Route("/user", name="users")
     */
    public function index(UserService $user_service): Response
    {
        $users = $user_service->getUsers();
    
        return $this->render('user/index.html.twig', [
            'title' => 'ユーザー一覧',
            'data' => $users,
        ]);
    }
}
```

##### 気をつける点

* useで「App\Service\UserService」を引き込む。
* indexメソッドの引数に「UserService 」を定義して、Serviceクラスを使用できるようにする。

テンプレートを作成する

```php:templates/user/index.html.twig
{% extends 'base.html.twig' %}

{% block title %}Hello UserController!{% endblock %}

{% block body %}
<style>
    .example-wrapper { margin: 1em auto; max-width: 800px; width: 95%; font: 18px/1.5 sans-serif; }
    .example-wrapper code { background: #F5F5F5; padding: 2px 6px; }
</style>

<div class="example-wrapper">
    <h2>{{ title }}</h2>
    <table class="table">
        <tr>
            <th>ユーザー名</th>
            <th>メールアドレス</th>
            <th>年齢</th>
            <th>役割</th>
        </tr>
        {% for user in data %}
        <tr>
            <td>{{ user.username }}</td>
            <td>{{ user.email }}</td>
            <td>{{ user.age }}</td>
            <td>{{ user.role }}</td>
        </tr>
        {% endfor %}
    </table>
</div>
{% endblock %}
```


### 以下目次

|タイトル|URL|
|----|----|
|タイトルページ|https://qiita.com/RyotaIhara/items/6159bbc38a729293fde0|
|READを作成してみる|https://qiita.com/RyotaIhara/items/ec5a5dff9bf00de87af7|
|CREATEを作成してみる|https://qiita.com/RyotaIhara/items/54942b2122d05ed561b1|
|UPDATEを作成してみる|https://qiita.com/RyotaIhara/items/f1fd3c17d6fa5ef78d34|
|DELETEを作成してみる|https://qiita.com/RyotaIhara/items/f1fd3c17d6fa5ef78d34|