Создать динамическую функцию с аргументами, используя Symfony4 - PullRequest
0 голосов
/ 27 августа 2018

Я новичок в Symfony 4, и я сделал CRUD. Я хочу улучшить свой код, создав функцию, которая уменьшит его.

Пример:

Если у вас есть 2 модуля, таких как управление событиями и объявлениями (конечно, здесь вы можете добавить, получить все, удалить и обновить). Вместо длинного кода, подобного этому.

 $fetch_item = $this->getDoctrine()
                    ->getRepository(Event::class)
                    ->findAll();

Я хочу сократить это как $ fetch = $ this-> fetch (Event :: class); Я создал новый файл в моей служебной директории.

Сервис \ Crud.php

<?php 

namespace App\Service;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

/**
 * 
 */
class Crud extends AbstractController
{

    public function __construct(){
        parent::__construct(); 
    }

    public function fetch($table)
    {
        $fetch_item = $this->getDoctrine()
                        ->getRepository($table)
                        ->findAll();

        return $fetch_item;
    }
}


?>

Контроллер

//
...
use App\Service\Crud;

    ...
    class EventController extends AbstractController
     public function index()
        {
            // $fetch_item = $this->getDoctrine()
         //                 ->getRepository(Item::class)
         //                 ->findAll();
            $fetch = $this->fetch(Item::class);
            return $this->render('base.html.twig',array(
                'items'         => $fetch_item

            ));
        }

Выше приведен мой код, но он выдает ошибку «Попытка вызвать неопределенный метод с именем« fetch »класса« App \ Controller \ ItemController »»

Вопрос: Как я могу создать функцию, которая уменьшит мой код?

1 Ответ

0 голосов
/ 27 августа 2018

Нет никаких причин для того, чтобы функция выборки была частью контроллера (напротив, есть много причин не быть). Вам нужен простой сервис:

<?php

namespace App\Service;

use Doctrine\ORM\EntityManagerInterface;

class CrudService {

    protected $em;

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

    public function fetch($entityClass) {

        return $this->em->getRepository($entityClass)->findAll();

    }
}

Тогда в вашем контроллере вам просто нужно ввести его через автопроводку и использовать его:

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use App\Service\CrudService;
use App\Entity\Item;
...

class EventController extends AbstractController {
    public function index(CrudService $crudService) {
        $items = $crudService->fetch(Item::class);

        return $this->render('base.html.twig',array(
            'items' => $items
        ));
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...