Всем привет. Подскажите, пожалуйста, правильно ли я делаю, что создаю объекты для контроллера в Service Provider-е вот так: PHP: public function register() { $this->app->bind('App\Http\Controllers\NewsController', function ($app) { $newsController = new NewsController(); $newsController->post = new Post(); $newsController->file = new File(); $newsController->leftMenuController = new LeftMenuController(); $newsController->dateTimeController = new DateTimeController(); $newsController->commentController = new CommentController(); $newsController->checkIfLikedController = new CheckIfLikedController(); $newsController->checkIfDislikedController = new CheckIfDislikedController(); return $newsController; }); } вместо того, чтобы в конструкторе контроллера в аргументах внедрять их? Может можно как-то улучшить?
@виталий032, а чем не нравится в конструкторе в аргументах? Так-то работать, наверное, будет, но вы напрямую устанавливаете поля, т.е. подменять через инъекцию зависимости не можете. И почему у вас контроллер зависит от других контроллеров? По ходу, то у вас сервисы, но вы обозвали их контроллерами. Путаница в понятиях полная
Аргументы конструктора протянутся на ширину двух экранов. Сервисы !== контроллеры, да? Там как раз таки объекты контроллеров.
бред полный, чушь неимоверная, зачем создавать то что не будет использоваться, архитектура дерьмо ( с апп должен как минимум идти объект NewsController ), нет тут return капец фатальный
Контроллеры - то, что отвечает за непосредственный ввод пользователя. Если контроллер дёргает что-то, кроме модели, для своих задач, это обычно называют сервисным слоем. У вас смешаны понятия все в кучу. Рано за Laravel взялись. Её в данном случае передаёт Laravel, но она может и не использоваться.
Спасибо, теперь более менее ясна разница. Я сделал некоторые изменения. Сделал зависимость одного контроллера от нескольких интерфейсов, по требованию которых в провайдере создаются объекты сервисов их реализующие. PHP: $this->app->bind(IPost::class, function () { + return new PostService(new Post,new File,new Auth); + }); + + $this->app->bind(IDateTime::class, function () { + $request = $this->app->make(Request::class); + return new DateTimeService($request); + }); + + $this->app->bind(IComment::class, function () { + return new CommentService(new Comment); + }); + + $this->app->bind(ICheckIfLiked::class, function () { + return new CheckIfLikedService(new Like,new Auth); + }); + + $this->app->bind(ICheckIfDisliked::class, function () { + return new CheckIfDislikedService(new Dislike,new Auth); + }); + + $this->app->bind(ILeftMenu::class, function () { + return new LeftMenuService(new ProfileLink,new Auth); + }); + + $this->app->bind(INewPostInfo::class, function () { + $request = $this->app->make(Request::class); + return new NewPostInfoService($request,new File,new Auth); }); PHP: public function index(IPost $IPost,IDateTime $IDateTime,IComment $IComment, + ICheckIfLiked $ICheckIfLiked,ICheckIfDisliked $ICheckIfDisliked, + ILeftMenu $ILeftMenu,INewPostInfo $INewPostInfo) {}
PHP: public function index(IPost $IPost,IDateTime $IDateTime,IComment $IComment, ICheckIfLiked $ICheckIfLiked,ICheckIfDisliked $ICheckIfDisliked, ILeftMenu $ILeftMenu,INewPostInfo $INewPostInfo) Яркий пример того, когда хочется чтобы все было красиво, оопешно, на интерфейсах, начинающихся с I, а получается лютый капец нечитаемый. Виталий, вам нужно пройти курс по Ларавелу. Прочитать книгу, посмотреть скринкасты. Хотя достаточно просто внимательно и последовательно читать документациию.