Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 12.09.2014 22:36:38

laraveler

Повторное использование кода

Подскажите, или просто ткните в место в документации, как использовать повторно код контроллера?

Объясню свою проблему. У меня есть два контроллера. Первый получает из модели некую информацию и отдает эти данные в представление. Второй делает в точности тоже самое, только берет информацию из другой модели и отдает в другое представление. Единственное решение, которое мне сейчас приходит на ум - это создать класс, наследник BaseController, прописать в нем описанную выше логику, и сделать два контроллера, наследника от этого класса.

Но, должен заметить, что не нравится мне решение через наследование. Может есть что-то типа CAction из Yii фреймворка? Как это правильно сделать в Laravel?

#2 13.09.2014 10:58:21

Re: Повторное использование кода

Laravel4+ way - это фреймворк-агностик путь, назад к корням, голому php - приложение пишется на классах, которые доступны из контроллера будучи переданными в него в аргументах конструктора (Dependency Injection) и при помощи фасадов. К сожалению, в документации это не отражено должным образом, за этим нужно идти к книгам "From Apprentice To Artisan" или "Implementing Laravel".  Или к циклам про SOLID-принципы или Command-Oriented Architecture у Джеффри на https://laracasts.com/how-do-i . Последнее - весьма интересное решение по разгрузке контроллеров от кода, но очень замороченное, не для всех проектов подойдет.

Конкретно в описанном случае можно написать класс, который будет принимать на вход экземпляр модели, получать оттуда данные и возвращать переменную(ые), которую контроллер потом передает в view. Хранить этот класс в неймспейсе, который определить в composer.json (http://laravel.ru/forum/viewtopic.php?id=473), подавать аргументом в конструкторе. Но если не заморачиваться с тестируемостью и доступе к этому функционалу из командной строки, можно разместить сей функционал прямо в BaseController.

Изменено slider23 (13.09.2014 11:03:34)

Не в сети

#3 13.09.2014 14:26:23

laraveler

Re: Повторное использование кода

Спасибо.

Действительно, документация у Laravel на первый взгляд кажется хорошей, но потом выплывает масса недокументированных нюансов.

#4 14.09.2014 08:14:02

Re: Повторное использование кода

Ну вот в 5.0 наконец-то распрощаются с наследием Laravel3 и все будет более-менее унифицировано, в неймспейсе. Может и документацию подтянут с "смотрите как все просто можно сделать, магия!" до реальных юзкейсов разработчиков.

Не в сети

#5 14.09.2014 08:52:46

Re: Повторное использование кода

  1. Единственное решение, которое мне сейчас приходит на ум — это создать класс, наследник BaseController, прописать в нем описанную выше логику, и сделать два контроллера, наследника от этого класса.

А чем вариант с наследованием не нравится? Вполне себе обычный случай, как раз для него.

Не в сети

#6 14.09.2014 13:46:20

laraveler

Re: Повторное использование кода

Proger_XP пишет:

}%> А чем вариант с наследованием не нравится? Вполне себе обычный случай, как раз для него.

Наверное сказывается влияние Мєтта Зандстры и его "PHP. Объекты и шаблоны". Там он очень много говорит о слабой связанности и не очень хорошо, в этом смысле, говорит о наследовании, т.к. увеличивается связанность. Понятно, что для конкретного проекта этим моментом можно и пренебречь, но хотелось бы делать в соответствии с парадигмой. Тем более, что в Laravel активно используются дизайн паттернс.

#7 14.09.2014 13:50:55

laraveler

Re: Повторное использование кода

Ну и тестирование ни кто не отменял, а при наследовании возникнут трудности с тестированием.

#8 15.09.2014 09:30:02

Re: Повторное использование кода

Command Bus в данном случае элегантно решит проблему. Но да, нужно заморочиться с первоначальной реализацией (если же нужно делать под себя. Если же нет - то Commander в изначальной реализации Jeffrey будет весьма достаточно), однако при развитии проекта множество вещей станут проще в реализации и поддержке, а использование имеющегося кода и тестирование станет легким и непринуждённым занятием...

Не в сети

Подвал раздела