За последние 24 часа нас посетил 17871 программист и 1571 робот. Сейчас ищут 1275 программистов ...

Service provider. Правильно ли использую?

Тема в разделе "Laravel", создана пользователем виталий032, 1 фев 2018.

  1. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Всем привет.

    Подскажите, пожалуйста, правильно ли я делаю, что создаю объекты для контроллера в Service Provider-е вот так:
    PHP:
    1. public function register()
    2.     {
    3.         $this->app->bind('App\Http\Controllers\NewsController', function ($app) {
    4.             $newsController = new NewsController();
    5.  
    6.             $newsController->post = new Post();
    7.             $newsController->file = new File();
    8.             $newsController->leftMenuController = new LeftMenuController();
    9.             $newsController->dateTimeController = new DateTimeController();
    10.             $newsController->commentController = new CommentController();
    11.             $newsController->checkIfLikedController = new CheckIfLikedController();
    12.             $newsController->checkIfDislikedController = new CheckIfDislikedController();
    13.             return $newsController;
    14.         });
    15.     }
    вместо того, чтобы в конструкторе контроллера в аргументах внедрять их?

    Может можно как-то улучшить?
     
  2. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @виталий032, а чем не нравится в конструкторе в аргументах? Так-то работать, наверное, будет, но вы напрямую устанавливаете поля, т.е. подменять через инъекцию зависимости не можете. И почему у вас контроллер зависит от других контроллеров? По ходу, то у вас сервисы, но вы обозвали их контроллерами. Путаница в понятиях полная
     
  3. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Аргументы конструктора протянутся на ширину двух экранов.

    Сервисы !== контроллеры, да? Там как раз таки объекты контроллеров.
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.793
    Симпатии:
    1.330
    Адрес:
    Лень
    смысл переменной app ?
     
  5. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Она в данном случае не нужна
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.793
    Симпатии:
    1.330
    Адрес:
    Лень
    бред полный, чушь неимоверная, зачем создавать то что не будет использоваться, архитектура дерьмо ( с апп должен как минимум идти объект NewsController ), нет тут return капец фатальный
     
  7. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Контроллеры - то, что отвечает за непосредственный ввод пользователя. Если контроллер дёргает что-то, кроме модели, для своих задач, это обычно называют сервисным слоем. У вас смешаны понятия все в кучу. Рано за Laravel взялись.
    Её в данном случае передаёт Laravel, но она может и не использоваться.
     
  8. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Спасибо, теперь более менее ясна разница. Я сделал некоторые изменения. Сделал зависимость одного контроллера от нескольких интерфейсов, по требованию которых в провайдере создаются объекты сервисов их реализующие.
    PHP:
    1.         $this->app->bind(IPost::class, function () {
    2. +            return new PostService(new Post,new File,new Auth);
    3. +        });
    4. +
    5. +        $this->app->bind(IDateTime::class, function () {
    6. +            $request = $this->app->make(Request::class);
    7. +            return new DateTimeService($request);
    8. +        });
    9. +
    10. +        $this->app->bind(IComment::class, function () {
    11. +            return new CommentService(new Comment);
    12. +        });
    13. +
    14. +        $this->app->bind(ICheckIfLiked::class, function () {
    15. +            return new CheckIfLikedService(new Like,new Auth);
    16. +        });
    17. +
    18. +        $this->app->bind(ICheckIfDisliked::class, function () {
    19. +            return new CheckIfDislikedService(new Dislike,new Auth);
    20. +        });
    21. +
    22. +        $this->app->bind(ILeftMenu::class, function () {
    23. +            return new LeftMenuService(new ProfileLink,new Auth);
    24. +        });
    25. +
    26. +        $this->app->bind(INewPostInfo::class, function () {
    27. +            $request = $this->app->make(Request::class);
    28. +            return new NewPostInfoService($request,new File,new Auth);
    29.          });
    PHP:
    1.     public function index(IPost $IPost,IDateTime $IDateTime,IComment $IComment,
    2. +                          ICheckIfLiked $ICheckIfLiked,ICheckIfDisliked $ICheckIfDisliked,
    3. +                          ILeftMenu $ILeftMenu,INewPostInfo $INewPostInfo)
    4.      {}
     
    #8 виталий032, 1 фев 2018
    Последнее редактирование: 2 фев 2018
  9. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Те объекты, которые я поместил в свойства, использовались.

    А какой должна быть архитектура?
     
  10. CoolKid

    CoolKid Активный пользователь

    С нами с:
    24 сен 2014
    Сообщения:
    33
    Симпатии:
    5
    PHP:
    1.     public function index(IPost $IPost,IDateTime $IDateTime,IComment $IComment,
    2.                           ICheckIfLiked $ICheckIfLiked,ICheckIfDisliked $ICheckIfDisliked,
    3.                           ILeftMenu $ILeftMenu,INewPostInfo $INewPostInfo)
    Яркий пример того, когда хочется чтобы все было красиво, оопешно, на интерфейсах, начинающихся с I, а получается лютый капец нечитаемый.

    Виталий, вам нужно пройти курс по Ларавелу. Прочитать книгу, посмотреть скринкасты.
    Хотя достаточно просто внимательно и последовательно читать документациию.
     
    romach нравится это.