fork download
  1. <?php
  2.  
  3. >> Код в контроллере нельзя повторно использовать
  4. > поясни
  5.  
  6. Смотри, нормальный класс создается и используется как принято в ООП:
  7.  
  8. $someService = new SomeService($db, $smth, $smthElse);
  9. $someService->doSomething($arg1);
  10.  
  11. Заметь что этот код не привязан ни к какому фреймворку или библиотеке, он универсален. Он не требует наличия какой-то платформы вроде веб-сервера так как не обращается к GET/POST/COOKIE и подобным глобальным переменным.
  12.  
  13. Все зависимости явно указаны и внедряются через конструктор. Ты можешь например создать 2 экземпляра сервиса с разными объектами $db.
  14.  
  15. Некоторые фреймворки позволяют получать сервисы не через new, а через какие-нибудь DI контейнеры:
  16.  
  17. $someService = $container->get('some_service');
  18. $someService->doSomething($arg1);
  19.  
  20. Но это никак не запрещает нам выкинуть контейнер и создать объект через new.
  21.  
  22. В общем, это однозначно неплохой код [spoiler]сам себя не похвалишь...[/spoiler]
  23.  
  24. А теперь посмотрим код, основанный на вызовах методов контроллера извне.
  25.  
  26. Просто так создать контроллер ты не можешь так как там надо делать определенные вызовы, что-то передавать, и т.д. Например ты должен передать Request c информацией о HTTP-запросе, а где ты его возьмешь если код запускается из командной строки? В некоторых фреймворках код контроллера выполняется внутри диспатч-цикла — его надо будет повторить.
  27.  
  28. $ctrl = new Some_Controller($app);
  29. $request = new Request(....);
  30. $ctrl->setRequest($request);
  31. $ctrl->init();
  32.  
  33. $ctrl->doDomething();
  34.  
  35. Даже если у тебя получается решить эти проблемы, получается сложный, сильно связанный (с большим числом зависимостей) код, который никакого сравнения не выдерживает с кодом выше.
  36.  
  37. Зачем класть логику в контроллеры (или псевдоконтроллеры в которые передается объект-контроллер), если можно сделать нормально?
  38.  
  39. > где та тонкая грань между переписать и отрефакторить?
  40.  
  41. Что больше, выгода от рефакторинга или затраты на него. Переписать все приложение явно не даст огромной выгоды, а затрат будет много.
  42.  
  43. > как возможно вызвать из такого пустого класса модель? он же никак не связан с фреймворком. а для связи я и использую this
  44.  
  45. Внедрение зависимости через конструктор:
  46.  
  47. $s = new Strepsils($model);
  48.  
  49. Внедрение через метод:
  50.  
  51. $s= new Strepsils();
  52. $s->setModel($model);
  53.  
  54. Внедрение через контейнер:
  55.  
  56. $s = $container->get('strepsils'); // контейнер сам позаботится о зависимостях
  57.  
  58.  
Runtime error #stdin #stdout #stderr 0.01s 20592KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
PHP Parse error:  syntax error, unexpected '>>' (T_SR) in /home/9I2Cvh/prog.php on line 3