Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement Request Mappers (Improvement) #177

Open
Arilas opened this issue Apr 2, 2014 · 1 comment
Open

Implement Request Mappers (Improvement) #177

Arilas opened this issue Apr 2, 2014 · 1 comment

Comments

@Arilas
Copy link

Arilas commented Apr 2, 2014

В каждом контроллере, мы сейчас инициализируем Формы, сами засовываем данные из Запроса, и также потом это все обрабатываем, добавляем Фильтры, которые по id объекта получают Модели, и т.д.

В итоге в контроллере находится огромное количество кода, который уменьшает как качество кода, так и читаемость.

В Symfony была реализована автоподстановка Значений из БД (как MySql, так и Mongo), в виде Entity, но при этом перехватить сообщение, о том, что что-то не найдено - не очень хорошо.

Я предлагаю реализовать классы - Mapper'ы, которые могут проверить полученные данные, отфильтровать их, а только потом предоставить эти данные в контроллер.

Пример такого Mapper'а:

namespace Arilas\User\Mapper;

use Some\Package\RequestMapper;
use Some\Package\Field;

class ProfileMapper extends RequestMapper {
    /**
     * @var Arilas\User\Entity\User
     */
    protected $user;

    /**
     * @var string
     */
    protected $name;

    public function init(array $values) {
        $user = new Field('user_id');
        $user->getFilterChain()
            ->attach(new Digits())
            ->attach(new Entity([
                'className' => 'Arilas\User\Entity\User',
            ]);

        $name = new Field('name');
        $name->setRequired(false);
        $name->getFilterChain()
            ->attach(new StringTrim());

        $this
            ->add($user, 'user')
            ->add($name)
        ;
    }

    public function getUser(){
        return $this->user;
    }

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

    public function onError(Request $request){
        if ($request->isXMLHttpRequest()) {
            $result = new JsonModel();
        } else {
            $result = new ViewModel();
        }

        $result->setVariable('success', false);
        $result->setVariable('errors', $this->getMessages());

        return $result;
    }
}

Суть очень похожа на Формы в ZF2, то-есть все те же InputFilter'ы, с Фильтрацией и Валидацией, но при этом этот код должен работать до(!) Контроллера, и предоставлять интерфейс к данным запроса.

Данный подход реализован в большинстве фреймворков на Java, так как это позволяет инкапсулировать данные запроса.

Также при портировании приложения на HACK, в режиме sctrict, типизация запроса смогла бы помочь.

@AntonShevchuk
Copy link
Member

Основная проблема реквест-маперов - сложность в понимании для большинства начинающих разработчиков. Данный функционал имеет смысл пилить только как альтернативный, но ни в коем случае как основной, иначе порог вхождения в фреймворк резко скакнёт вверх.
Хотя в целом идея мне симпатична.

@AntonShevchuk AntonShevchuk added this to the 8.0.0 milestone Apr 13, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants