Laravel по-русски

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

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

#1 01.02.2018 11:18:07

SQL-запрос в конструкторе класса-контроллера

Всерьёз занявшись улучшением поддерживаемости кода, создал поля класса контроллера и добавл конструктор. Попробовал осуществить запрос к базе данных в конструкторе (вернее, вызвать соответствующий метод из конструктора), а не как обычно (то есть в методе, вызываемого из маршрутов web.php, в примере ниже — renderTopPage). Работает.

PHP
class TopPageController extends Controller {

    private 
$pageHtmlHeadData;

    public function 
__construct() {
        
$this -> pageHtmlHeadData =  $this -> getTopPageHtmlHeadData();
    }


    public function 
renderTopPage(){
        
// код этого метода не нужен в данном примере, но именно этот метод вызывается из web.php
    
}

    private function 
getTopPageHtmlHeadData(){
       
retrun // SQL запрос к БД ...
    
}
}

Вопрос такой: а будет ли выигрыш в скорости генерации страницы засчёт того, что SQL-запрос был выполнен до метода, где создаётся вид? Я бы смог ответить на этот вопрос, если бы знал, когда создаётся экзепляр контроллера (а он где-то создаётся, хотя у родительских классов конструкторов нет).

Изменено Gleb2708 (01.02.2018 11:20:51)

Не в сети

#2 01.02.2018 11:56:26

Re: SQL-запрос в конструкторе класса-контроллера

В вашем случае профит близится к нулю. Конструктор нужен для первоначальной инициализации класса. Например логика лежит по нескольким методам, которым нужны какие-то общие какие-то первоначальные данные.

Не в сети

#3 01.02.2018 12:06:00

Re: SQL-запрос в конструкторе класса-контроллера

Благодарю Вас за ответ!
А Вы можете сказать, в какой момент создаётся экземпляр контроллера?

Не в сети

#4 01.02.2018 12:18:56

Re: SQL-запрос в конструкторе класса-контроллера

Не буду врать, не особо интересовался. Мне достаточно знать в общих чертах лайф цикл.

Не в сети

#5 01.02.2018 14:56:41

Re: SQL-запрос в конструкторе класса-контроллера

А Вы можете сказать, в какой момент создаётся экземпляр контроллера?

Прямо перед вызовом нужного action контроллера.
framework/src/Illuminate/Routing/Route.php метод run() -> runController()

runController() дергает getController()
метод getController() создает экземпляр контроллера

Выигрыша нет никакого.
И вряд ли это можно назвать "улучшением поддерживаемости кода".

Изменено covobo (01.02.2018 15:04:58)

Не в сети

#6 02.02.2018 09:21:55

Re: SQL-запрос в конструкторе класса-контроллера

ПМСМ, поддерживаемость улучшается тогда, когда увеличится специализация классов и методов. Это НЕ приводит к ускорению. Вероятно даже, что бОльшая специализация приведёт к некоторому оверхеду. У всего есть своя цена.

В плане специализации, то что ты вынес добычу данных в отдельный метод это плюс. Это упрощает будущее обслуживание кода. Опять же по моему субъективному мнению, в конструктор имеет смысл помещать то, что будет общим для любого экшена. Если только для 2/3, то уже не стОит, т.к. оно будет сбивать с толку читателя.

Ещё лучше станет, если в контроллере не будет ничего сложнее элементарных $repo->getThing($arg) — неважнов конструкторе или в любом другом методе. Когда появляется цепочка построителя запроса или готовый сырой SQL, это лучше вынести в отдельный класс, неважно как его назовёшь: "модель" или "репозитарий". В специализированный не-контроллер. smile


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#7 02.02.2018 09:29:06

Re: SQL-запрос в конструкторе класса-контроллера

Благодарю Всех за равёрнутые ответы, очень ценная информация!

Не в сети

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