Контроллер ресурсов Symfony4 - PullRequest
0 голосов
/ 20 декабря 2018

Я занимаюсь разработкой API под symfony4 и хотел бы создать родительский контроллер, который мог бы использовать для вызова функций, которые будут повторяться в другом контроллере.Вот мои контроллеры, которые я хотел бы расширить с родительского контроллера:

Мой DeliveryController:

<?php

namespace App\Controller;

use App\Entity\DeliveryMan;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Routing\Annotation\Route;

/**
 * Class AuthController
 * @package App\Controller
 * @Route("/api")
 */
class DeliveryController extends AbstractController
{
    /**
     * @Route(
     *     name="api_delivery_man_post",
     *     path="/delivery_man",
     *     methods={"POST"},
     *     defaults={
     *         "_api_resource_class"=DeliveryMan::class,
     *         "_api_collection_operation_name"="post"
     *     }
     * )
     */
    public function postAction(DeliveryMan $data, UserPasswordEncoderInterface $encoder): DeliveryMan
    {
        return $this->encodePassword($data, $encoder);
    }

    protected function encodePassword(DeliveryMan $data, UserPasswordEncoderInterface $encoder): DeliveryMan
    {
        $encoded = $encoder->encodePassword($data, $data->getPassword());
        $data->setPassword($encoded);

        return $data;
    }
}

Мой AuthController:

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use App\Entity\User;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;

/**
 * Class AuthController
 * @package App\Controller
 * @Route("/api")
 */
class AuthController extends AbstractController
{
    /**
     * @Route(
     *     name="api_users_post",
     *     path="/users",
     *     methods={"POST"},
     *     defaults={
     *         "_api_resource_class"=User::class,
     *         "_api_collection_operation_name"="post"
     *     }
     * )
     */
    public function postAction(User $data, UserPasswordEncoderInterface $encoder): User
    {
        return $this->encodePassword($data, $encoder);
    }

    protected function encodePassword(User $data, UserPasswordEncoderInterface $encoder): User
    {
        $encoded = $encoder->encodePassword($data, $data->getPassword());
        $data->setPassword($encoded);

        return $data;
    }
}

Как видно, яВызовите 2 одинаковых действия в 2 разных контроллерах, единственное отличие состоит в том, что будут сущности и путь дороги.

Так что я думал о создании родительского контроллера ResourceController, который будет расширен от AbstractController и что дочернийконтроллеры были бы расширены из ResourceController, но я не вижу, как после того, как создать мои методы в моем родительском контроллере и получить их в дочерних контроллерах.

Если кто-то уже сделал это, я беру :) Спасибоза вашу помощь.

РЕДАКТИРОВАТЬ Результат ResourceController:

<?php

namespace App\Controller;

use App\Entity\DeliveryMan;
use App\Entity\User;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;

class ResourcesController extends AbstractController
{
    private $encoder;

    public function __construct(UserPasswordEncoderInterface $encoder)
    {
        $this->encoder = $encoder;
    }

    public function encodePassword(User $data): User
    {
        $encoded = $this->encoder->encodePassword($data, $data->getPassword());
        $data->setPassword($encoded);

        return $data;
    }

    public function encodePasswordDelivery(DeliveryMan $data): DeliveryMan
    {
        $encoded = $this->encoder->encodePassword($data, $data->getPassword());
        $data->setPassword($encoded);

        return $data;
    }
}

1 Ответ

0 голосов
/ 20 декабря 2018

Просто создайте ResourceController, который расширяет Symfony AbstractController.

Напишите здесь 2 общих метода, затем в любом контроллере, который расширяет ResourceController, вы можете вызывать их так, как обычно вызываете метод класса: используя $ this

class ResourceController extends AbstractController
{   
    private $encoder;

    public function __construct(UserPasswordEncoderInterface $encoder)
    {
        $this->encoder = $encoder;    
    }

    public function encodePassword(Object $data): Object
    {
        $encoded = $this->encoder->encodePassword($data, $data->getPassword());
        $data->setPassword($encoded);

        return $data;
    }
}

class AuthController extends ResourceController
{
    public function someAction(User $data)
    {
        return $this->encodePassword($data);
    }
}

Я также предлагаю вам написать интерфейс с методом getPassword, который будут реализованы User и DeliveryMan.Вы не только убедитесь, что метод реализован, но и сможете набирать подсказки, скажем AuthenticatedEntityInterface, вместо Object

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