@prophp7

Страница 1030 из 1387
Andrew
17.04.2018
13:26:45
да эта новость непременно затрагивающая нас всех

Alexander
17.04.2018
13:34:51
Всем привет! Правильно я понимаю, что без сеттера или рефлексии такую штуку не провернуть? class Foo { public function __construct(Foo $foo) {} } $foo = new Foo($foo);

Maksim
17.04.2018
13:35:21
без наркотиков тоже не получится)

Anton Saprykin
17.04.2018
13:36:11
Че это

Google
Bohdan
17.04.2018
13:36:53
зачем это

Alexander
17.04.2018
13:38:43
Академический интерес

Sergey
17.04.2018
13:41:05
и зачем оно в конструкторе? Есть же $this

Anton Saprykin
17.04.2018
13:44:45
Я бы тоже это покурил, но не хочу бабушку расстраивать((

Anton Saprykin
17.04.2018
13:45:39
Она умерла((

Bohdan
17.04.2018
13:45:48
когда это было проблемой?

Anton Saprykin
17.04.2018
13:46:40
Чур если это "крот", то я пасс. У меня на районе двое от такого овощнулись.

Alexander
17.04.2018
13:46:46
Не понимаю, зачем вам лишний контекст, но проблема вот с этой блиблиотекой: https://github.com/wmde/Diff/blob/master/src/Differ/MapDiffer.php#L46

Alexander
17.04.2018
13:48:20
Он же интерфейс в зависимости тянет
ну да, задача передать тот же инстанс MapDiffer во второй параметр

Google
Sergey
17.04.2018
13:49:28
ну да, задача передать тот же инстанс MapDiffer во второй параметр
давай с другой сторны попробуем. Какую проблему ты хочешь решить?

Alexander
17.04.2018
13:50:34
Давайте сначала решим, можно ли это сделать без сеттера или рефлексии? :)

Vadim
17.04.2018
13:50:45
class Foo { public function __construct(Foo $foo = null) {} } $foo = new Foo(); $foo2 = new Foo($foo); exit;

Alexander
17.04.2018
13:51:27
Не, не оно... $foo2 !== $foo

Sergey
17.04.2018
13:52:36
Мда

Andrew
17.04.2018
13:52:39
Не, не оно... $foo2 !== $foo
А почему это условие обязательно?)

Alexander
17.04.2018
13:55:34
А почему это условие обязательно?)
ну вот такая библиотека. если не указывать второй параметр то по умолчанию создается инстанс другого класса

Для массива неограниченной вложенности придется делать что-то вроде $differ = new \Diff\Differ\MapDiffer( true, new \Diff\Differ\MapDiffer( true, new \Diff\Differ\MapDiffer(/** ... */) ) ); что как-то странно выглядит

Andrew
17.04.2018
14:00:02
оно разве не должно переиспользоваться?

Herman
17.04.2018
14:00:29
Памяти не хватит создать рекурсивно такой объект, делай extend и переписывай логику получения диффера, как вариант

Хотя я похоже не понял в чем там проблема, скорее всего можно намного проще решить

Alexander
17.04.2018
14:02:34
оно разве не должно переиспользоваться?
по хорошему должно, но как видишь либо пробрасывается то, что передается в конструктор, либо создается новый инстанс, хотя надо бы $this->listDiffer = $this;

Herman
17.04.2018
14:05:27
напиши тест того как оно должно работать

Herman
17.04.2018
14:18:38
Alexander
17.04.2018
14:20:38
Написал... Но вопрос то был не в том, как решить проблему, а в том можно ли передать инстанс класса в его же конструктор :) И че-т никто не сказал "нет", а только "что курил?" :)

Andrew
17.04.2018
14:24:22
вообще, имхо лучше выкинуть либу и посмотреть на что-то другое

Google
Alexander
17.04.2018
14:25:17
Alexander
17.04.2018
14:26:21
Herman
17.04.2018
14:28:27
да, но я не создатель либы
Зато ты можешь заимплементить интерфейс, или заэкстендить на крайний случай.

Sergey
17.04.2018
14:35:14
Согласен, но ведь можно делать так: $function = function() use (&$function) {}
Есть одно хорошее правило. Если кажется, что получается изврат, то явно что-то не так делается и стоит пересмотреть подход к решению задачи.

понятие "изврат" у всех свое

Bohdan
17.04.2018
14:37:05
понятие "изврат" у всех свое
вот этим ты перечеркнул свое прошлое сообщение

Sergey
17.04.2018
14:37:38
Не согласен )

Кто то смотрит на symfony и считает это извратом и для него проще что-то реализовать используя процедурный подход.

у всех свой опыт, взгляды на "идеальный" код и свое понятие изврата)

Bohdan
17.04.2018
14:43:03
ну я к тому, что изврат - дело восприятия) потому вариант с "кажется" работать не будет

Vadim
17.04.2018
14:49:38
Если кажется, что изврат, то извратить кажущееся.

Dmitry
17.04.2018
14:50:00
Nurik
17.04.2018
15:02:08
да, но я не создатель либы
Форкни, напиши свою реализацию. В чем проблема ? Там я так понимаю рекурсия нужна, для deep recursive match ?

Alexander
17.04.2018
15:03:53
Nurik
17.04.2018
15:10:27
Пока дождусь ответа на issue, если что PR сделаю. Да, для него
Судя по документации, там дифф ассоциативного массива. function arrayRecursiveDiff($aArray1, $aArray2) { $aReturn = array(); foreach ($aArray1 as $mKey => $mValue) { if (array_key_exists($mKey, $aArray2)) { if (is_array($mValue)) { $aRecursiveDiff = arrayRecursiveDiff($mValue, $aArray2[$mKey]); if (count($aRecursiveDiff)) { $aReturn[$mKey] = $aRecursiveDiff; } } else { if ($mValue != $aArray2[$mKey]) { $aReturn[$mKey] = $mValue; } } } else { $aReturn[$mKey] = $mValue; } } return $aReturn; }

Alexander
17.04.2018
15:18:10
Да. Но эта функция не подходит, мне надо знать что добавилось, что изменилось, что на что поменялось.

Google
Nurik
17.04.2018
15:19:59
Да. Но эта функция не подходит, мне надо знать что добавилось, что изменилось, что на что поменялось.
У тебя есть какая-то древовидиная структура, которая апдейтит ноды, делает какие-то другие штуки ? Типа такого ?

Herman
17.04.2018
15:20:03
это все что нужно делать

Panda
17.04.2018
15:20:47
В доке газла версии 6 нет вообще ничего

Почему в конечном счете когда я возвращаю массивы, где по идеи должен быть контент возвращается все равно пустой массив? GuzzleHttp $pool = new Pool($client, $requests($links), [ 'concurrency' => 5, 'fulfilled' => function ($response) use (&$fulfilled){ array_push($fulfilled, $response->getBody()); }, 'rejected' => function ($response) use (&$rejected){ array_push($rejected, $response->getStatus()); } ]); $promise = $pool->promise(); $promise->wait(); return array($fulfilled, $rejected);

Nurik
17.04.2018
15:21:34
да
Тогда ты используешь не то что нужно. Используй структуры данных, которые для этого предназначены.

Alexander
17.04.2018
15:21:48
это все что нужно делать
я там в issue пример привел, он не будет работать как нужно

Herman
17.04.2018
15:22:37
я там в issue пример привел, он не будет работать как нужно
пробовал запускать так как я написал?

Alexander
17.04.2018
15:22:41
У тебя есть какая-то древовидиная структура, которая апдейтит ноды, делает какие-то другие штуки ? Типа такого ?
Есть энтити, которая редатируется. Надо понять что поменялось и записать в лог

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

Admin
ERROR: S client not available

Alexander
17.04.2018
15:25:34
И у этой энтити есть json поле ?
нет, я ее нормализую в array

Nurik
17.04.2018
15:27:02
нет, я ее нормализую в array
Что значит нормализуешь ? Откуда данные берешь ? Данные в каком виде хранишь при сериализации ?

Herman
17.04.2018
15:27:22
в твоем варианте только первый параметр отличается от дефолтного
да, последний параметр не нужен вообще, согласен

Alexander
17.04.2018
15:27:32
$differ = new \Diff\Differ\MapDiffer(true, null, new \Diff\Comparer\StrictComparer());
задача чтобы все коллекции на любом уровне вложенности воспринимались как ассоциативные, за это второй параметр отвечает

Alexander
17.04.2018
15:29:22
Что значит нормализуешь ? Откуда данные берешь ? Данные в каком виде хранишь при сериализации ?
https://api.symfony.com/4.0/Symfony/Component/Serializer/Normalizer/NormalizerInterface.html - под нормализацией вот это подразумеваю

нет
это ответ на то что это не задача? или что за это не отвечает второй параметр? :)

Google
Alexander
17.04.2018
15:31:23
аа, теперь все ясно
если не исползовать MapDiffer, то он воспранимает изменения как добавление + удаление, а не изменение

Herman
17.04.2018
15:32:05
но коллекция это не map

Nurik
17.04.2018
15:48:08
А зачем это делать ? Можно же использовать EventListener для entity. Все равно в логе же не будешь хранить дерево. Просто маркируй каждый запрос c помощью X-Request-ID, если нужно сгруппировать все изменения, которые были сделаны в течении одного запроса.

Alexander
17.04.2018
15:51:54
А зачем это делать ? Можно же использовать EventListener для entity. Все равно в логе же не будешь хранить дерево. Просто маркируй каждый запрос c помощью X-Request-ID, если нужно сгруппировать все изменения, которые были сделаны в течении одного запроса.
там несколько сложнее. надо анализировать эти изменения и если они не подходят под условия, то не сохранять сущность, а создавать новую с такими же данными. через доктриновские листенеры это будет очень непрозначно, если вообще возможно

Nurik
17.04.2018
16:03:57
Типа дерево + аудит. Т.е. если ветки не совпадают то создай новую ветку ?

Я почему спрашиваю, у меня была задача , хранить древовидные контракты, когда еще не было монги и так далее. Я делал эту штуку на materialized path и сравнение делал, путем запроса всей ветки и сравнение получалось плоским. При этом аудит реализуется тоже легко. По префиксу родителя ноды либо по типу ноды. Но хз. возможно у тебя другой кейс.

Saško
17.04.2018
16:41:48
Ребзя, а может посоветует кто как элегантрее решить задачу учета и ограничения количества каких-то действий юзера. Задача така: есть куча юзеров, есть разные действия (фичи), которые эти юзерам доступны (например загружать файлы, отсылать сообщения, создавать связи). Есть разные тарифы, в зависимости от которых юзерам даётся разное количество этих фичей. Как бы это красиво реализовать с учётом, что юзеров и событий очень много. Т.е. счетчики должны тикать постоянно. Ну и понятное дело, что мы не можем например при отправке сообщения пересчитывать сколько он уже отправил, чтобы понять может ли он это сделать. Были бы не большие объемы, я бы не задумываясь сделал табличку типа feature_id, user_id, feature_value (где первые два поля — PK) и объект с методами типа incValue($count = 1), getValue() и isLimitReached() ну и по incValue делать в мускул чота типа insert into features_counters (...) on duplicate key update feature_value = feature_value + $count а isLimitReached() - сравнивало бы лимит с текущем getValue() Так вот дело в том, что событий в системе много. и тогда update в mysql будут лететь часто и густо Боюсь проблем с производительностью. Как бы сделать красиво и чтобы работало точно и быстро (с минимальным шансом допустить сделать 1001 сущность при лимите в 1000, например) На борту уже есть редис, первая идея конечно хранить вообще всё там, а в mysql переодически сгружать. Но может есть более лучшие способы, вот это всё?

Sergey
17.04.2018
17:32:55
ооо я только недавно смотрел видео на эту тему

influxDB

Ребзя, а может посоветует кто как элегантрее решить задачу учета и ограничения количества каких-то действий юзера. Задача така: есть куча юзеров, есть разные действия (фичи), которые эти юзерам доступны (например загружать файлы, отсылать сообщения, создавать связи). Есть разные тарифы, в зависимости от которых юзерам даётся разное количество этих фичей. Как бы это красиво реализовать с учётом, что юзеров и событий очень много. Т.е. счетчики должны тикать постоянно. Ну и понятное дело, что мы не можем например при отправке сообщения пересчитывать сколько он уже отправил, чтобы понять может ли он это сделать. Были бы не большие объемы, я бы не задумываясь сделал табличку типа feature_id, user_id, feature_value (где первые два поля — PK) и объект с методами типа incValue($count = 1), getValue() и isLimitReached() ну и по incValue делать в мускул чота типа insert into features_counters (...) on duplicate key update feature_value = feature_value + $count а isLimitReached() - сравнивало бы лимит с текущем getValue() Так вот дело в том, что событий в системе много. и тогда update в mysql будут лететь часто и густо Боюсь проблем с производительностью. Как бы сделать красиво и чтобы работало точно и быстро (с минимальным шансом допустить сделать 1001 сущность при лимите в 1000, например) На борту уже есть редис, первая идея конечно хранить вообще всё там, а в mysql переодически сгружать. Но может есть более лучшие способы, вот это всё?
или любая другая timeline БД, вам в любом случае метрики будет надо куда то складывать, так что, скорее всего это решение проблемы.

к тому же, можно использовать такую штуку как grafana для графиков, вроде бы даже в реальном времени есть вариант смотреть

Saško
17.04.2018
17:43:25
графики не нужны нужно просто не давать юзерам делать больше того, что они могут уже потому что исчерпали лимит ну и рисовать интерфейс от этого (кнопки прять, итд)

инфлюкс позырю

Sergey
17.04.2018
17:59:04
насколько я понимаю timeline БД расчитаны на запросы такой информации из большого потока

Valentin
18.04.2018
05:17:10
Вопрос по именованию методов, должно ли имя функции/метода говорить о её внутренней реализации? Например есть у меня клас AuthService и в нём метод getAccessTokenByRequest($request) - внутри из $request вытягиваются login/pass и передаются в другой метод - getAccessTokenByCredentials($login, $pass) Ну и соответственно вопрос - вот эти окончания ByRequest/ByCreds - они по сути указывают на реализацию, от них надо избавляться?

Но без них у меня будет просто метод getAccessToken($login, $pass) который не очень удобный, вот что будет когда мне надо выдать токен по refreshToken'у - если не следовать совету то я просто добавлю getTokenByRefreshToken($refreshToken) а если верить Р. Мартину и его чистому коду то так делать нельзя, но как тогда сделать лучше? Разве этот вариант не хорошо читаемый и понятный?

Bohdan
18.04.2018
05:26:34
ну у тебя получается перегрузка методов, по сути пхп в неё не умеет, так что иначе - только фасады какие приделывать

Valentin
18.04.2018
05:31:01
Может не донца понял смысл этого совета, но мне кажется он не очень полезный.. Вряд ли он имел ввиду названия типа SaveUserIntoDatabase

Хотя по сути что этот SaveUserIntoDatabase что мой getTokenByRefreshToken по сути говорят о внутренней реализации, разницы нет

Bohdan
18.04.2018
05:36:29
фасады мне тоже не нравятся

но я веду именно к тому, что в php нельзя делать типа так getToken(RefreshToken $refreshToken) {...} getToken(string $login, string $pass) {...}

Страница 1030 из 1387