Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Подскажите, или просто ткните в место в документации, как использовать повторно код контроллера?
Объясню свою проблему. У меня есть два контроллера. Первый получает из модели некую информацию и отдает эти данные в представление. Второй делает в точности тоже самое, только берет информацию из другой модели и отдает в другое представление. Единственное решение, которое мне сейчас приходит на ум - это создать класс, наследник BaseController, прописать в нем описанную выше логику, и сделать два контроллера, наследника от этого класса.
Но, должен заметить, что не нравится мне решение через наследование. Может есть что-то типа CAction из Yii фреймворка? Как это правильно сделать в Laravel?
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)
Не в сети
Спасибо.
Действительно, документация у Laravel на первый взгляд кажется хорошей, но потом выплывает масса недокументированных нюансов.
Ну вот в 5.0 наконец-то распрощаются с наследием Laravel3 и все будет более-менее унифицировано, в неймспейсе. Может и документацию подтянут с "смотрите как все просто можно сделать, магия!" до реальных юзкейсов разработчиков.
Не в сети
Не в сети
}%> А чем вариант с наследованием не нравится? Вполне себе обычный случай, как раз для него.
Наверное сказывается влияние Мєтта Зандстры и его "PHP. Объекты и шаблоны". Там он очень много говорит о слабой связанности и не очень хорошо, в этом смысле, говорит о наследовании, т.к. увеличивается связанность. Понятно, что для конкретного проекта этим моментом можно и пренебречь, но хотелось бы делать в соответствии с парадигмой. Тем более, что в Laravel активно используются дизайн паттернс.
Ну и тестирование ни кто не отменял, а при наследовании возникнут трудности с тестированием.
Command Bus в данном случае элегантно решит проблему. Но да, нужно заморочиться с первоначальной реализацией (если же нужно делать под себя. Если же нет - то Commander в изначальной реализации Jeffrey будет весьма достаточно), однако при развитии проекта множество вещей станут проще в реализации и поддержке, а использование имеющегося кода и тестирование станет легким и непринуждённым занятием...
Не в сети
Страницы 1