Pull to refresh
27
1.2
Бучнев Павел @butschster

Senior PHP Developer

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

Что касается твоего кода, то первый вопрос, зачем копировать к себе в «велосипед» куски чужого кода, если за это время можно было взять готовый фреймворк/микрофреймворк и на нем уже создать полноценный продукт? И тратить время на более важные вещи, а именно на свой рост.
Правильно ли я понимаю, что папка classes в CMS это скопированные классы из yii? Почему не затащил свой проект на базу Yii?

Я бегло изучил код, его кол-во и т.д. и как по мне, проще было взять чистый фреймворк и перенести кодовую базу в него, нежели пытаться файлики из yii внедорять в свой проект, на это есть одна простая причина — твой код необновляем. Вот представь, завтра выходит обновление ядра Yii, твои действия?

В общем я увидел исключительно небольшой рефакторинг кода и все, кодовая база небольших размеров. Глядя на твою CMS я не совсем понимаю в чем посыл твой? В том что ты написал код 2010 года и закинул туда пару файликов из Yii? Ну код ревью такой код не прошел бы.

P.s. В свое время я также занимался велосипедостроением (CMS разрабатывал). Начинал я это делать на фреймворке Kohana (Github) и он мне казался время мега крутым, но через год, он устарел и перестал развиваться и я принял решение переехать на новый фреймворк Laravel, который мне казался очень перспективным, тем самым.Куча модулей, сложный UI, я не представлял как перенести код с одного фреймворка на другой. Но я сделал это практически в одиночку (Github и Base Github), пришлось переделывать всё. Короче CMS умерла потому что я плохой маркетолог, хотя старался сделать ее на современных технологиях, оказывал поддержку, но не хватило сил сделать это в одиночку и привлечь для ее развития разработчиков, просто никому это не интересно. В России слишком маленька ЦА. Но главное, что я получил от использования фреймворков и интеграции с ними — это опыт работы с ними, изучение применяемых практик, ООП, паттерны проектирования и т.д.
Привет, Олег! Прочитал твою статью, очень впечатлила, т.к. ты сделал то, что никак не решусь сделать я по разным причинам, хотя есть понимание того, чему хочу учить, кого хочу и т.д.

Я решил не продолжать делать курсы в одиночку.

Предлагаю созвониться и обсудить это. Вполне возможно, что найдем точки соприкосновения.
Всегда приятно видеть ссылки на свои разработки в новостных дайджестах! Кстати, я сейчас занимаюсь разработкой нового пакета для Lumen, который позволит с минимальными временными затратами создавать микросервисы с использованием шины RabbitMQ и JMS\Serializer. Нужны помощники в доработке и тестировании пакета. Ссылка на репо github.com/butschster/LumenMicroservice
Да, именно так я в основном и делаю, гугл я не использую, привел как пример. Но в тех местах, которые, скажем так я посещал с помощью этих браузеров умеют детектировать через время такие браузеры и блокировать аккаунты, которыми браузеры прикрывались. Но вообще это отдельная история
Там сам гугл говорит об этом, а это значит, что он знает как детектировать значит смогут и другие.
На самом деле проблема намного глубже и не решается лишь подменой заголовков и user agent. Это легко проверить, достаточно попробовать пройти гугл авторизацию в headless режиме.
Не так давно я изучал этот вопрос и наткнулся на статью intoli.com/blog/not-possible-to-block-chrome-headless где показаны некоторые особенности браузера. Но я уверен, что даже этого будет недостаточно для прохождения гугл авторизации.
Сейчас этот код сложно будет тестировать.

Что бросилось в глаза:
  • класс InstaLite отвечает за работу с сессиями. По хорошему это должен быть отдельный класс, который содержал бы в себе только те методы, который отвечают за работу с ними.
  • класс Request отвечает и за Response. По хорошему выполнение запроса должно было бы возвращать объект Response, который в свою очередь имел бы необходимые методы для получение информации об ответе от сервера
  • методы all и id класса InstaLite можно вызвать до вызова метода searchUser, что приведет к неверному поведению. По хорошему класс InstaLite не должен содержать этих методов, а вызов метода searchUser должен возвращать новый объект, например FoundUsers, который должен содержать эти методы.


Хотелось бы вас попросить описать процесс добавления мной, как пользователя вашим пакетом нового API. Например, я решил получить список лайков. Что я должен сделать, чтобы выполнить данный запрос без изменения исходного кода библиотеки.

P.S.
Советую как можно скорее перейти к написанию тестов и тогда вы сами начнете дробить свой код на более мелкие части и выделять в отдельные классы. А также почитать про внедрение зависимостей.
Иногда глаз цепляется за код, который совершенно лишний и выдает глубину знаний фреймворка, например вот этот код:
protected function fields(): array
{
     return array_filter(
         array_map('trim', $this->request->all())
     );
}


Если мы посмотрим вот сюда github.com/laravel/laravel/blob/master/app/Http/Kernel.php#L20, то увидим, что Laravel уже изначально применяет функцию trim ко всем стринговым значениям для Request.

В остальном это самый примитивный вариант реализации фильтров.
Я сам люблю красивый и структурированный код, но иногда нужно все-таки исходить из задачи и применения. В данном случае я вижу, что это вспомогательная функция и, возможно, она не стоит того, чтобы выглядеть супер читабельной не в угоду производительности, главное чтобы тестами была покрыта.
Если исходить из поста про собеседование, то, как по мне, там важнее всего понимать и упомянуть про сложность алгоритма и показать интервьюеру своё мышление.
Нечто подобное было в курсе codecourse.com/courses/filtering-in-laravel
Ох, если бы только на Windows. У меня такая же проблема на Ubuntu 18… с двумя мониторами. HDMI + DisplayPort, самое обидное то, что при выходе из спящего режима DisplayPort монитор не всегда просыпается и приходится руками выключать и включать на кнопку.
Пара вопросов:

— Почему у вас какие то параметры именуются $comment, а какие то $DoctrineRepository? Почему разный стиль?
— Почему бы не использовать, хотя бы при создании репозиториев принцип инверсии зависимостей? Куда приятнее работать с интерфейсами, а не с реализацией, благо в Laravel это достаточно легко реализуется.

Вот кстати у меня вопрос, я как человек мало понимающий в DDD и в вашем коде,
class Comment implements CommentTypeFactoryInterface {
    private function addComments()
    private function editComments()
    private function deleteComment()
    private function retrieveComments()
}

Кто и откуда запускает эти методы?

В методе editComments() вызывает метод $this - > page - > addComments($comment);, но ведь DDD подразумевает, что мы общаемся на языке бизнеса, а получается, что редактирование комментария у нас приравнивается к добавлению?

Хотелось бы более детального разбора кода.

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


Что касается масла, то я даже не представляю куда смотреть, чтобы понять, будет авто жрать его или нет. Как, по твоему, диагностировать коробку передач перед покупкой или двигатель? Да, можно конечно провести компьютерную диагностику на предмет ошибок в различных блоках, и автор канала это показывает в тех авто, которые он считает удовлетворительными после внешнего осмотра.


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


И я не говорю, что описанные тобой проблемы не важы, важно все, но не все можно проверить самостоятельно.

Ну я не рассматриваю этот канал с точки зрения найма этого человека, он полезен с точки зрения понимания последствий неверно принятых решений.


Удар в сторону двери это еще половина беды, но кто после этого проверяет наличие подушек безопасности или изменение геометрии машины.


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

Ну собственно вот ответ на ваш вопрос https://www.youtube.com/watch?v=r0AwMRPrVJs А вообще советую посмотреть этот канал перед тем, как решиться на покупку б\у авто.



Обычно крон-задачи простые, например очистка сессий и нужно выполнить один только запрос

Ну понятно что у Вас то они обычно простые, сложные не впишутся концепцию проекта SKY, т.к. они требуют много строк кода, а здесь то «clear cloud»

А вот рассмотрим реальные cron задачи:
— Синхронизация списка пользователей сайта и AD корпоративной сети
— Синхронизация календарей сотрудников из MS Exchange с корпоративным порталом.
— Ежедневная рассылка уведомлений по электронной почте
— Обновление поискового индекса на сайте
— Генерация отчетов

Каждая из этих задач требует выполнить не один SQL запрос, вдобавок нужно сформировать и т.д. и т.п. Боюсь ваш крон файл не выдержит такое, так же как и код.

Кстати, вы же знаете, что крон задачи можно добавлять напрямую в crontab, это сэкономит лишние!!! килобайты!!! Вдумайтесь, зачем ваш файл cron.php, если можно, например, crontab -e и там добавить нужные задачи.
* * * * * /var/www/sky-project/cron.php session:clear
0 0 0 0 * /var/www/sky-project/cron.php delete:project

Функция at костыль!

дополнительно вам нужно открыть страницу (что вы дали выше) чтобы изучить документацию

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

Так вот правда в том, что инструменты, также как и ваш, рождаются тогда, когда его автор считает, что он необходим. И чем больше людей используют инструмент, чем он полезнее. Давайте обратимся к статистике: https://packagist.org/explore/popular и посмотрим какие сейчас инструменты нужны всем.

Неужели я что-то неправильно понимаю?

Вам бы идти в демагоги, а не в программисты.

Ну и напоследок: я бы советовал взять, к примеру, SugarCRM. Почему его? А потому что он монструозный и код открыт и там вы в полной мере окунетесь в мир глобальных переменных, php4, легаси кода и т.д. Изучая его вы сможете в полной мере ощутить себя в шкуре тех разработчиков, которым вы пытаете впарить свою систему. После того, как вы во все это окунетесь, задумайтесь над тем, насколько можно сократить код по идеологии SKY Project

P.s. Вы же, надеюсь, понимаете, что как только ваш КПИ (код повторного использ.) по возможностям отчасти сравняется с Laravel, то ему потребуется документация? Или вы думаете, что весь код из Laravel можно сократить до 3-х функций? И отсюда у вас возникает вопрос: раз даже я, разработчик, который решил изменить мир к лучшему не смог изучить код Laravel, то код от лукавого и не нужен, не то что мой, понятный мне без документации, а значит всем остальным и в этом его преимущество.

P.p.s У меня в проекте 276 файлов с классами покрытыми phpDoc + 60 view файлов (и это еще не большой проект, без учета сторонних библиотек), как думаете, насколько это можно сократить?
Странная логика, наваяем QB, чтобы код был красив…

Милейший, вы в моем примере увидели красоту кода? Ну да, код красив, но им также удобно пользоваться! Он избавляет от дублирования кода, он экономит время разработчика.

Для того, чтобы работать, например с PostgreSQL, нужно просто взять тот-же файл «main/sky.php», который является портом для этой БД.

Вы видимо шутите? Т.е. если у вас будет поддержка 10 БД, то ваш проект будет содержать 10 клонов, разница в которых только в SQL запросах? Кто будет за этим следить?

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

Простейший пример: Один заказчик хочет, чтобы в БД пароли хранились с определенным алгоритмом шифрования, который ваша CMS не поддерживает, второй хочет видеть авторизацию по email, третий хочет полноценной api и SPA с использованием JWT, я так понимаю что в вашей SKY ни один из этих кейсов не реализуем?

Я не верю в происходящее. Это тест Тьюринга? Если да, то этот бот смог убедить кучу народа в том, что он настоящий человек.

Здесь либо программиста переклинило от того, что у него была куча кода со времен php4 и он не смог пережить его тотальное устаревание. Также я подозреваю, что человек за всю жизнь сделал всего один проект и его название SKY. Если вспомнить свой путь создания нескольких проектов для широкой публики, я могу с уверенностю сказать, что код проекта SKY будет занимать меньше места, чем список хотелок, которых не будет хватать окружающим.

Скажите, вы можете дать вразумительное объяснение, почему чтобы сделать простой запрос к БД, код в вашем framework выглядит так:

$db->$mysql->select( … )

Нет, не можете? а зачем тогда так пишите? Многие, могут поспорить сейчас и попытаться дать объяснение, но после очередных вопросов, они не смогут дать вразумительный ответ или дадут, но после следующих – не смогут.


Я так понимаю, что разработчик не знает про то, что не все используют mysql, sqlite, pgsql, и Query Builder позволяет на выходе получить запрос под конкретную БД с учетом ее особенностей.

Если происходит сабмит формы с 100 полями, то QB позаботится об экранировании данных.

Ах этот лаконичный SQL запрос… когда в нем начинают появляться условия :) Или мы не хотим соблюдать последовательность при проверке условий…

Приведу пример из SugarCRM, когда они пошли по похожему пути https://github.com/butschster/sugarcrm_dev/blob/master/data/SugarBean.php#L2883 Казалось бы, что может быть проще, чем выполнить SQL запрос и зачем только нужен этот Query Builder?!

// Пример высосан из пальца и код упрощен по максимуму
$query = DB::table('users');

if ($groupByTotalLogins) {
     // Здесь мы можем не соблюсти последовательность, но на выходе получим валидный SQL
     $query->join('logins_history')->....;
     $query->groupBy(...);
     $query->select(...)
}

if ($joinProfile) $query->join(...);

if (!$withDeleted) $query->where('deleted', 0);
if ($onlyId) $query->select('id');

if (//condition) {
    $query->orWhere('field', '>', 10);
}

// Остальные 100 условий


Ну и чистый лаконичный SQL
$table = 'users';
$select = $onlyId ? 'id' : '*';
$where = '';
$groupBy = '';
$orderBy = '';

if ($joinProfile) {
    $table .= ' join profile ...';
}

if ($groupByTotalLogins) {
     $table .= ' join logins_history ...';
     $select .= ' count(logins_history.*) as total_logins';
     $groupBy .= '....'
}

if (!$withDeleted) {
    $where .= 'deleted = 0';
}

if (//condition) {
    $where .= !empty($where) ? ' OR' : ' ';

    $where .= ' filed > 10 '
}

if(empty($where)) {
    $where .= !empty($where) ? ' AND' : ' ';
    $where = '1=1';
}
...
// Вспомним что у where еще могут быть группировки условий...
$query = "select {$select} from {$table} where {$where}";

if(!empty($groupBy)) {
    $query .= "group by {$groupBy}";
}

if(!empty($orderBy )) {
    $query .= "order by {$orderBy}";
}



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

Хотелось бы пару строк от автора о том, как расширять ядро не затрагивая при этом сам код?

Подведем итог: с 2012 года автор смог осилить написание около 100 кб устаревшего к настоящему времени кода. Пакет «FORUM.SKY» появится тогда, когда автор сможет уместить идеальный всеохватывающий код в 800 строк. Остальные пакеты появятся тогда же.
Добавлю еще немножко: Ребята, вы конечно молодцы, что решили создавать opensource проект, но ваш проект плох во всем. Он плох с точки зрения безопасности, он плох с точки зрения кода, ну можно было бы перед тем, как публиковать проект, хотя бы форматирование кода сделать, весь js запаковать в один файл и убрать исходники сторонних библиотек. Я так и не понял что дает ваша CMS кгмммм… редактированием одной страницы через CKEDITOR?

У вас инструкция по установке занимает гораздо больше места, чем описание возможностей.
1
23 ...

Information

Rating
1,265-th
Location
Батуми, Аджария, Грузия
Date of birth
Registered
Activity

Specialization

Backend Developer, Software Architect
Lead
PHP
Docker
PostgreSQL
Git
English
Software development