170 похожих чатов

======================================= Namespace App\Http\Controllers; class First extends Controller { protected $one;

protected $two;

protected $three;


public function __construct()
{
$this->one = "get user profile from database"
}

}
=======================================
namespace App\Http\Controllers;


class Second extends First
{



public function handle()
{
$abc = $this->one;
}
}
=======================================
namespace App\Http\Controllers;


class Third extends First
{



public function handle()
{
$cde = $this->one;
}
}

=======================================


Есть 3 класса выше описанных.

порядок выполнения кода:

$newClassSecond = new Second(); /*при создании экземпляра этого класса, выполняется метод __construct() класса First, и в свойство $one - загружается профиль пользователя из базы данных*/


$newClassThird = new Third();
/*при создании экземпляра этого класса, опять выполняется метод __construct() класса First, и в свойство $one - повторно загружается профиль пользователя из базы данных*/

Вопрос - как при создании экземпляра класса Third - избежать повторного выполнения метода __construct() класса First, избежать повторной загрузки данных из БД.
И в тоже время из класса Third - использовать уже загруженные из БД данные в свойство one, при создании класса Second ?

51 ответов

110 просмотров

не делать через наследование, а делать через композицию желательно избегать наследования классов, это очень трудно потом поддерживать а за обращение к базе данных в конструкторе, нужно гнать санной тряпкой из программистов

Alexey-Shaposhnikov Автор вопроса
Egor Gruzdev
не делать через наследование, а делать через компо...

мне пофиг кого откуда гнать. я на такие вещи не реагирую. А вот про композицую, сейчас прочитаю))

Alexey-Shaposhnikov Автор вопроса
Egor Gruzdev
не делать через наследование, а делать через компо...

Бесполезный совет. А как же арегация? Наследование на композицию не будет меняться. Надо конкретно решение в данной ситуации. Без изменения кода всего проекта.

приведенный тобой пример кода, тем более если это контролер не будет работать в текущей реализации, так как в момент создания класса контролера, нет еще данных об авторизации пользователя и загрузить профиль ты не сможешь, т.к. данных о текущем пользователе еще нет.

Alexey-Shaposhnikov Автор вопроса
Egor Gruzdev
приведенный тобой пример кода, тем более если это ...

Егор, бросьте там про другое, нету никакой авторизации. Не хочу вдаваться в детали. Поэтому упростил пример. Пока другим немного занят, позже разберусь. Код и архитектура- могут быть не идеальны. Это приемлемо. Сейчас весь код проекта ради стремления к совершенству никто менять не будет.

Alexey Shaposhnikov
Егор, бросьте там про другое, нету никакой авториз...

ок, но как минимум уйти от выборки из базы в конструкторе стоит, например выборку перенести в отдельный класс (Service, Repository назвать можно как угодно) и сделать только тогда когда она действительно понадобиться

Если для Вас критично держать выборку в конструкторе то вы можете обойти этот кейс не самым конечно адекватным образом. Создайте в конструкторе first опциональный параметр для нужных вам свойств и присвойте null. Передавайте данные из third при вызове parent::__construct. Это костыль костыль. Но насколько я помню просто так скипнуть родительский конструктор нельзя(поправьте если что)

Alexey-Shaposhnikov Автор вопроса
Mary
Если для Вас критично держать выборку в конструкто...

Просто весь поток выполнения кода, начинается с класса first , в нем прописаны свойства, которые потом используют наследники этого класса . И в том числе свойство one в котором должна быть выборка. Эта выборка потом много раз в большом количестве наследников используется. Поэтому так и сделано. Самым простым решением было бы скипнуть конструктор родительского класса. Пока не нашел как это делать. То что Егор предложил - слишком радикально в текущей ситуации.

Alexey Shaposhnikov
Просто весь поток выполнения кода, начинается с кл...

Условие с проверкой на налл для этого нового параметра конструктора

Alexey Shaposhnikov
Просто весь поток выполнения кода, начинается с кл...

Я полностью понимаю о чем вы, приходилось работать на одном супер легаси проекте, не всегда можно что то исправить, главное хуже не сделать

Alexey-Shaposhnikov Автор вопроса
Mary
Условие с проверкой на налл для этого нового парам...

В самом конструкторе? Родительского класса ? Похоже это решение 👏.

Alexey-Shaposhnikov Автор вопроса
Alexey Shaposhnikov
В самом конструкторе? Родительского класса ? Похож...

Нет, я про другое подумал. В конструкторе родительского класса - пишем : если one = null , тогда грузим профиль из базы данных, иначе - ничего не делаем. Наследники потом хоть сколько раз запускай родительский конструктор. Он не будет больше избыточных обращений к бд делать.

Alexey-Shaposhnikov Автор вопроса
Mary
Как вариант) тем не менее, composition over inheri...

Всем участвующим в решении - спасибо. Пошел конструктор переписывать. Сэкономлю несколько миллионов запросов к БД ))). За 3 строки кода. Это то что я искал.

Alexey Shaposhnikov
Всем участвующим в решении - спасибо. Пошел констр...

Не столкнитесь только с ситуацией что где то будет тоже инититься переменная one до вызова родительского конструктора

Alexey-Shaposhnikov Автор вопроса
Mary
Не столкнитесь только с ситуацией что где то будет...

Это уже есть, надо оптимизировать код. Времени на все не хватает.

Alexey Shaposhnikov
Нет, я про другое подумал. В конструкторе родитель...

зачем наследники несколько раз конструктор выполняют?

Alexey-Shaposhnikov Автор вопроса
oleg
зачем наследники несколько раз конструктор выполня...

Конструктор родителя выполняется автоматически при создании нового экземпляра наследника. Это в примере наследника 2 а в реальности их - больше

Egor Gruzdev
не делать через наследование, а делать через компо...

забыл. что в чятике ларавели, у них такое прям в мануале советуют

Могу предложить менее радикально, это сделать на подобии модели, через магические методы. Т.е. получиться, что свойства будут формироваться по мере обращения. А обращения из __get() делать к методу get{имя поля} предварительно проверив что метод существует. И со временем переходить на прямой вызов этих методов, без поредничества магии.

Mary
Как я и описала, это костыль)

Доброго времени подскажите пожалуйста. у меня есть scout и столкнулся с таким моментом что в структуре базы данных есть 2 кея по которым определяется сущность но скаут индексирует ток по ключу 1 как можно сделать что бы он определял 2 'link_type' => ['type' => 'integer'], 'cached_id' => ['type' => 'integer'], 'name' => ['type' => 'text'], 'keywords' => ['type' => 'text'], нужно что бы по уникальнсть записи он понимал link_type и cached_id

salvanelo _IO
Доброго времени подскажите пожалуйста. у меня есть...

как вариант вижу сделать public function getScoutKey(): mixed { return $this->link_type. "_".$this->cached_id ; } /** * Get the key name used to index the model. */ public function getScoutKeyName(): mixed { return 'uuid'; }

salvanelo _IO
как вариант вижу сделать public function getSc...

но я не знаю насколько это будет работать

salvanelo _IO
как вариант вижу сделать public function getSc...

и добавить в миграцию скаута поле uuid

Alexey-Shaposhnikov Автор вопроса
Egor Gruzdev
Могу предложить менее радикально, это сделать на п...

Ребят, всем спасибо за участие 👍. Завтра уже протестирую все варианты и подберу рабочее решение. Сегодня другое доделал.

salvanelo _IO
Доброго времени подскажите пожалуйста. у меня есть...

ты забыл указать какой драйвер scout-а ты используешь

Egor Gruzdev
почему вдруг стало два ключа?

База от очень старого проекта и там первичных ключей на таблице нету. для того что бы кэш в базе данных хранить из разных сущностей получая глобальный поиск в црм

salvanelo _IO
База от очень старого проекта и там первичных клю...

а например добавить виртуальную колонку, которая будет равно конкатенации двух колонок и уже эту виртуальную колонку использовать как id записи

Egor Gruzdev
а например добавить виртуальную колонку, которая б...

атрибут получается бахнуть ? ибо я же скаут кей конкатинирую в примере ?

salvanelo _IO
атрибут получается бахнуть ? ибо я же скаут кей ...

нет не атрибут модели, а на уровне базы данных добавить виртуальную колонку https://dev.mysql.com/doc/refman/8.0/en/create-table-generated-columns.html

Egor Gruzdev
нет не атрибут модели, а на уровне базы данных доб...

Не варик таблица уже на 40 милионов записей

salvanelo _IO
Не варик таблица уже на 40 милионов записей

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

Egor Gruzdev
как я понял это таблица, когда еще не было scout, ...

Это настолько пережиток прошлого что это ещё на пхп 3 пилилось

Egor Gruzdev
как я понял это таблица, когда еще не было scout, ...

нет мы строим карапт леер не задевая старый функционал

salvanelo _IO
Это настолько пережиток прошлого что это ещё на пх...

т.е. за 23 года даже не подумали переписать на что-то более подходящее или найти инструменты индексации документов, вот это поворот

Egor Gruzdev
т.е. за 23 года даже не подумали переписать на что...

Нет там есть старый сфинкс он работает. но перенос на новые рельсы требует вот таких вот

salvanelo _IO
Не варик таблица уже на 40 милионов записей

а по скольким таблицам собираются данные если это не секрет

salvanelo _IO
Не варик таблица уже на 40 милионов записей

и еще вопрос, при поиске данных есть что-то вроде проверки на доступ к данным по которым происходит поиск?

salvanelo _IO
да есть

но это на уровне выше происходит после поиска в мантикоре

Egor Gruzdev
ты забыл указать какой драйвер scout-а ты использу...

Я совсем зеленый, только начал учить лару, читаю топик, вижу что-то новое, гуглю. И вот зацепился за scout. Я так понял это глобальная надстройка для полнотекстового поиска в базе? А можете по простому объяснить где ее применяют и в чем отличие от встроенного full-index?

Oleg
Я совсем зеленый, только начал учить лару, читаю т...

Ну ответьте блин ему, мне тоже интересно

Ну поделись чтоли) ну а вообще интересно мнение людей и опыт больше, чем просто факты (конечно и то и другое важно)

Filipponik
Ну поделись чтоли) ну а вообще интересно мнение лю...

Scout в Laravel действительно представляет собой мощное средство для полнотекстового поиска в базе данных. Это пакет, который позволяет вам интегрировать поиск на основе поисковых движков, таких как Elasticsearch и Algolia, в ваше приложение Laravel. Scout упрощает создание и обслуживание индексов для вашей базы данных, делая полнотекстовый поиск более эффективным и масштабируемым. Вот несколько ключевых моментов: Интеграция поисковых движков: Scout позволяет интегрировать поисковые движки, такие как Elasticsearch и Algolia, с вашим приложением Laravel. Эти поисковые движки специализируются на полнотекстовом поиске и обеспечивают высокую производительность и точность результатов. Индексирование данных: Scout автоматически создает и обновляет индексы для ваших моделей Laravel. Это упрощает процесс подготовки данных к полнотекстовому поиску. Удобство использования: Вы можете выполнять поиск в своих моделях с помощью простого и понятного синтаксиса Laravel, что делает его удобным для разработчиков. Расширенные возможности: Scout позволяет выполнять различные операции с результатами поиска, такие как сортировка, фильтрация и дополнительная обработка результатов. Сквозной поиск: Этот вид поиска позволяет искать данные в разных таблицах и моделях вашей базы данных, что может быть полезно, когда вам нужно объединить данные из нескольких источников. Отличие от встроенного полнотекстового поиска зависит от того, какой конкретный поиск вы реализуете. Laravel имеет встроенную поддержку полнотекстового поиска с использованием SQL-запросов и индексации через MySQL и другие базы данных. Однако эта реализация может быть менее масштабируемой и менее мощной по сравнению с поисковыми движками, которые поддерживаются Scout, такими как Elasticsearch и Algolia. Скажем, если вам нужен высокопроизводительный полнотекстовый поиск с возможностью ранжирования результатов, фильтрации и другими продвинутыми функциями, то Scout с поисковыми движками может быть лучшим выбором. Встроенный полнотекстовый поиск в Laravel подходит для более простых задач, но может быть ограниченным в функциональности по сравнению с Scout и поисковыми движками.

Alexey-Shaposhnikov Автор вопроса
Egor Gruzdev
Могу предложить менее радикально, это сделать на п...

Привет, мне нравится твое критичное мышление. Задачу ту в итоге решил через применение singleton. То что искал, зарегистрировал класс в сервис провайдере, загрузил в свойства синглтона - профиль пользователя. Все остальные классы далее используют это свойство. Без повторных обращений к БД.

Похожие вопросы

Обсуждают сегодня

Ребят в СИ можно реализовать ООП?
Николай
32
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
Всем доброго вечера. Разрабатываю 32 раз. приложение в Delphi. Столкнулся с тем, что стандартный  TFilestream  не работает с большим файлом > 2 ГБайт (после вызова функции see...
Vadim Gl
16
добрый день. Подскажите, есть сайт на 1.4.7 и я хочу обновиться, особо ничего не меняя. мне выбирать версию 1.4.35 или третью ветку? и можно ли обновлять "как есть", или нужно...
Digital Cat
12
народ, плиз хелп, всю голову сломал себе уже... разве может быть так, что GetProcAddress( GetModuleHandle( "kernel32.dll" ), "SetThreadDescription" ) вернёт ненулевое значение...
Iluha Companets
12
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
а плаксы из-под питона умеют только в комфортных условиях что-то выдавить из себя?)
Lencore
9
Кстати, что за тип булеана, который в памяти как 00 для фолса и 01 для тру отображается? Однобайтовый
Serjone
8
Коллеги, я тут для личных нужд пошел ставить MQTT сервер, пощупал mosquitto, но ужаснулся отсутствию такой банальности, как HTTP API для посмотреть список топиков. А тут что,...
Maksim Lapshin
14
Карта сайта