За последние 24 часа нас посетили 17573 программиста и 1724 робота. Сейчас ищут 878 программистов ...

Принцип единственной обязанности в контроллере

Тема в разделе "Прочие вопросы по PHP", создана пользователем mkramer, 6 ноя 2014.

  1. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Уже много раз встречал код, как мне кажется доведённый до абсурда: контроллер, который выполняет только одну акцию. Особенно в приложениях на Zend Framework и других, которые позволяют удобно использовать модули. Как по мне, так PostAddConroller, PostDeleteController, PostEditController - это слишком. Но недавно я даже увидел фреймворк (от UMI), который и не позволяет вам обрабатывать более одного действия в контроллере, поскольку он вызывает только один метод контроллера (__invoke()) в маршрутизаторе. В моих контроллерах я обычно сосредотачиваю все действия, относящиеся к описываемому им понятию (к примеру, для Post у меня будет просто action_add, action_delete, action_edit и т.п.), изредка выделяя что-то в отдельный класс, если оно реально создаёт отдельные понятия. Мне интересно узнать мнение, чем выгоден первый из описанных мной подходов. Насколько я читал, принцип единственной обязанности - это не то, к чему стоит стремиться просто ради него самого...
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а не всё ли равно?
     
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    лично я за стабильность )))
    даже если какое-то правило шокирует поначалу, но работает в данном контексте и помогает найти аналоги в других местах, то почему бы и нет.
     
  4. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    я недавно начал делать так
    [​IMG]

    Добавлено спустя 1 минуту 40 секунд:
    • Код (Text):
      1. <?php
      2.  
      3. namespace controller;
      4.  
      5. class Controller {
      6.  
      7.     private $applicationHelper;
      8.     private $request;
      9.  
      10.     private function __construct() {
      11.        
      12.     }
      13.  
      14.     static function run() {
      15.         $instance = new Controller();
      16.         $instance->init();
      17.         $instance->handleRequest();
      18.     }
      19.  
      20.     function init() {
      21.         $applicationHelper = ApplicationHelper::instance();
      22.         $applicationHelper->init();
      23.        
      24.     }
      25.  
      26.     function handleRequest() {
      27.         $request = new \controller\Request();
      28.         $cmd_r = new \command\CommandResolver();
      29.         $cmd = $cmd_r->getCommand($request);
      30.         $cmd->execute($request);
      31.         $this->identification($request);
      32.         $this->request = $request;
      33.         }
      34.  
      35.    
      36.  
      37. }

    Добавлено спустя 2 минуты 24 секунды:
    по Мэтт Зандстра
     
  5. rognorog

    rognorog Новичок

    С нами с:
    7 июл 2014
    Сообщения:
    330
    Симпатии:
    0
    БОЛЬШЕ КЛАССОВ " УТОПИТЕСЬ В КАКАХАХ называется ". =)
    Я бы вообще послал бы к черту ООП в пыхе =)
     
  6. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    rognorog, да не, ты просто не врубаешься, чувак:)
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я сделал PinPIEи просто иклюдю файлик. Я счастлив.
     
  8. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Идут по улице два мужика с лопатами, один выкапывает ямки вдоль дороги, другой идет следом и закапывает. Прохожий спрашивает:
    - Мужики, вы что дурью маетесь?
    - А между нами еще один должен идти, который деревья сажает. Только он сегодня заболел.
    Собственно, к вопросу ТС: имхо, в этом нет никакого смысла.
     
  9. rognorog

    rognorog Новичок

    С нами с:
    7 июл 2014
    Сообщения:
    330
    Симпатии:
    0
    Да побольше тебя врубаюсь ;)
     
  10. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Согласен с таким подходом. В одном контроллере надо сосредоточить все действия над сущностью, ну по крайней мере в пределах контекста. К примеру UserController отвечающий за front (т.е. просмотр/редактирование... для пользователя) и UserController за back (админка). Но разделять их по отдельным действиям, я даже хз как-то, по моему это уже глюки от ООП у людей пошли )

    Добавлено спустя 1 минуту 25 секунд:
    А потом люди матерятся сталкиваясь с твоим кодом и приложенном к нему бубном )
     
  11. rognorog

    rognorog Новичок

    С нами с:
    7 июл 2014
    Сообщения:
    330
    Симпатии:
    0
    Сразу видно, что ты вообще не врубэйшен.
    Да ты хоть раз видел мой код? Говоришь тыкая пальцем в небо, ну окай.
    Ты прям профессор. Экстрасенс телепат. ПРЯМ!
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    А я всё же хотел бы увидеть список плюсов и минусов от ТС.
     
  13. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    В чем конкретно?
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Давайте все вместе позовём ТС. Пусть выскажется по пунктам.
     
  15. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    он хотел узнать мнение других)))
     
  16. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ага, mahmuzar прав. Мне было интересно, кто что думает. Своё отношение я высказал - мне нравится иметь один контроллер для одного понятия, а не целую кучу. Иначе это получается, как машина, которая имеет один двигатель для езды вперёд, а другой - назад. К тому же, когда проект разрастается, ИМХО, трудно соблюдать принцип. Мне один раз пришлось сопровождать приложение на Zend Framework, где удаление постов почему-то было в контроллере PostRead... Вообще, я потихоньку ввожу в свои приложения SOLID, поскольку ещё не проникся идеей. И пытаюсь смотреть, как это делают другие. Для меня всегда главное, чтоб мне было удобно программировать. Вот, в одном проекте разделил на разные классы функцию выборки данных для отчётов и функцию формирования собственно отчёта, причём в двух разных видах - HTML и файл Excel, получился достаточно красивый код (можно было лучше, но пока мне сойдёт). Опять же, тем не менее, обычно мне удобно похожие функции иметь в одном контроллере, поскольку мне так удобно дорабатывать потом код, если заказчик попросит что-то новое. Ну и к тому же в функциях контроллера я стараюсь не писать больше 5-10 строк кода, если требуется больше - пытаюсь вынести этот код в модель, или в сервисные классы.
     
  17. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ты сказал, что тебе нравится, но не сказал почему. Сейчас вот позиция стала понятнее.

    это самое главное. иначе и рефакторить будет нечего.

    Примеров бы. А то я даже не знаю, о чем речь =)
     
  18. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    http://umi-framework.ru/documentation/get_started/controllers.html - вот то, что мне не нравится. И этот фреймворк по-другому не позволяет. Я сейчас его посматриваю, поскольку приходится с UMI работать, а 3 версия, которую они обещают скоро выпустить в полном варианте, на нём написана.
     
  19. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    осталось договориться о терминах. Что такое контроллер? Я вот в википедии не могу найти что-то...