• Как использовать Di container?

    @Wentixon
    Рекомендую почитать книгу про паттерн или вот этот сайт посмотреть, в частности паттерны стратегия. Тогда думаю все станет намного понятнее, так как сейчас у вас даже вопросы неверные, а вообще без опыта в такие дебри лучше не лезть

    Если вкратце то:
    Вопрос1 - нужно ли всё равно передавать параметр в конструктор вызываемого контроллера или можно просто вызывать без параметров?

    У нас есть контейнер, в нем при запуске приложения мы регистрируем классы (сервисы). При регистрации мы связываем абстракцию (интерфейс) и реализацию (конкретный класс), а также впринципе говорим нашему приложению КАК создать конкретный объект. Потом же мы делаем просто так и получаем готовый объект
    // Получаем объект интерфейса из любой точки приложения
    $container->get(MyInterface::class);


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

    $container->register(MyInterface::class, function () {
      return new MyConcreteClass('какие то параметры');
    });


    Вопрос2 - где вообще надо делать $container->get('что-нибудь'); ? В самом контроллере как-то неправильно, наверное - ибо тогда всё равно зависимость. Где это делать?

    Во-первых, контроллер это обычный класс, во-вторых принцип DI заключается в том, чтобы у вас классы не зависили от конкретных реализаций и явно ЗАВИСИЛИ от АБСТРАКЦИЙ. Это самое важно что нужно понять. Отвечая на вопрос - брать напрямую из контейнера сервисы надо ЗА сервисами, то есть в сервис провайдере и выше

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

    Вот короче пример написал который впринципе все объясняет, если непонятно спрашивай

    interface CartRepository
    {
        public function add(CartItem $item);
        public function getAll();
    }
    
    class SessionCartRepository implements CartRepository
    {
        ...
    }
    
    class DbCartRepository implements CartRepository
    {
        ...
    }
    
    class Cart
    {
        public function __construct(CartRepository $repository) 
        {
            ...
        }
    
        public function getTotal()
        {
            ...
        }
    }
    
    // Service provider
    $container->register(CartRepository::class, function ($container) {
        if ($user = $container->get('auth')->getUser()) {
            $repository = new DbCartRepository($container->get('db'), $user->id)
        } else {
            $repository = new SessionCartRepository();
        }
    
        return $repository;
    });
    
    $container->register(Cart::class, function ($container) {
        return new Cart($container->get(CartRepository::class));
    });
    Ответ написан
    1 комментарий
  • Как соблюсти принцип последней буквы SOLID?

    @Wentixon
    Во-первых, я советую тебе не заниматься херней, проходя всякие тупые курсы и делая свои велосипеды. Поверь, эти курсы тебя ничему хорошему не научат, я сам это все прошел - толку ровно ноль. У тебя все равно ничего хорошего не получится, так как лучшие разработчики годами оттачивают свои фреймворки, при чем заимствуя фишки друг у друга (речь идет о популярных фреймворках).

    Во-вторых, если все же у тебя шило в попе, хочется какую то херню погородить, то умные люди придумали некоторые стандарты. Условным стандартом в php являются компоненты с самого качественного фреймворка symfony, на которых кстати основан также laravel. Вот компонент роутера например. Популярные фреймворки состоят из таких мелких независимых компонентов.

    В-третьих, на будущее.. Прежде чем что то делать, посмотри как это сделано у других. Компонент роута я тебе дал, хочешь свой пилить (хотя это абсолютно бессмысленно), то пожалуйста, но лучше ты 100% не сделаешь, так что просто посмотри как сделано у них хотя бы.

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

    Кстати можешь посмотреть эти курсы, самое толковое из того что есть
    Ответ написан
    64 комментария
  • Для чего бывает нужно подменять реализацию интерфейса?

    @Wentixon
    Все очень просто! Приведу пример на laravel, но фреймворк разумеется не имеет к этому никакого отношения.

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

    А теперь представь, что ты делаешь сервис (класс) и ему нужно что то закэшировать. И сделаешь это вот так

    class RemoteApi {
        public function _construct(RedisCache $cache)
        ....
    }


    Я думаю сам видишь, в чем тут проблема. Этот класс будет работать только с редисом. А теперь представь, что таких классов очень много, которые использую кэш редиса. Потом при смене хранилища кэша придется все их менять и переделывать, так как интерфейсы у них, возможно, будут разные.
    Ответ написан
    Комментировать
  • Почему бесконечно растущие массивы это плохо?

    @Wentixon
    Тут все зависит от ситуации. На счёт производительности я так понял вы уже разобрались. БД не такие тупые, чтобы все 100 лямов записей перебирать в поиске нужной. Даже в этом случае, хранение в массиве вам никак бы не помогло, так как данные все равно пришлось бы вытягивать из другой коллекции. Только в этом случае выборка получилась бы гораздо сложнее и медленнее.

    Чтобы ответить на свой вопрос, подумайте, как бы вы вытянули из БД книги издательства, в которых более 100 страниц, если бы хранили в массиве? Это первый момент.

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

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

    В примере рассмотрена связь one to many, когда к примеру одно издательство имеет много книг, а книга только одно издательство. Но есть связь many to many. Например, рецепт имеет много ингридентов, а каждый ингридиент привязан ко многим рецептам. В этом случае в nosql как раз нужно использовать массив.

    Так что все зависит от ситуации. Иногда даже лучше не делать отдельную коллекцию, а записывать документ целиком в массиве, как в первом примере из ссылки.
    Ответ написан
    5 комментариев
  • Как понять что не нужно в bundle.js?

    @Wentixon
    Чтобы разобраться, что он туда понапихал тебе нужны исходники, так как бандл равносилен бинарнику, работать с ним невозможно, это конечный продукт. И вебпак тут не при чем, это отличный инструмент. Да, он незначительно увеличивает размер скрипта, но это несущественно. Так что ищи исходники и смотри, какие модули в них присутствуют
    Ответ написан
    5 комментариев
  • Как в Laravel 5.7 удобным образом разместить все файлы шаблонов в отдельной подпапке views?

    @Wentixon
    Во-первых, надо сказать, что на ларавель проектах это требуется довольно редко, это все же не cms, если же будет редизайн серьезный, то в любом случае скорее к старому вы уже не вернётесь. Если юзает git, то всегда можно откатиться к старому дизайну. Но опять же, меняется дизайн и скорее всего часть функционала тоже поменяется и этот функционал не будет совместим со старой темой.

    Во-вторых.. если все же нужно это сделать (единственный вариант когда это действительно нужно вижу примерно такой: днём одна тема, ночью другая. Как то так), просто в конфиге делаете соответствующий ключ, в базовом контроллере, от которого наследуются все остальные делаете метод view, где уже определяете полный путь до вьюхи с темой. Или же делаете трейт, в котором опять же такой метод создаёте. Вот собственно и все
    Ответ написан
    2 комментария
  • Какие статьи, книги прочитать по многофайловым проектам?

    @Wentixon
    Я бы посоветовал почитать про паттерны проектирования. Точнее не почитать, а действительно разобраться где и как нужно их применять. Лично меня это очень апнуло, при чем не только в ооп, но и вообще, так как с их знанием приходит понимание, что вообще из себя представляет архитектура. Начинаешь уже думать о зонах ответственности, данных которые должны принадлежать этим зонам, а также как это дело правильно связать между собой, чтобы не получилось куча зависимостей. Тогда про файлы/папки речи не будет идти, ты будешь мыслить другими категориями.

    Из книг по этой теме рекомендую эту "Head First. Паттерны проектирования". Вначале может быть очень сложно и ничего непонятно, в таком случае можно отложить ее на несколько дней и вернуться к чтению после практики.

    Но также добавлю, что пока не пройдешь какой то барьер, то такие книги будут не особо полезны, будешь читать, вроде все понимать, а на деле говнокодить. Можешь прочитать их все, но сразу ничего не получится, надо писать много кода, переписываться и снова писать. Только тогда будет хороший результат
    Ответ написан
  • Как настроить порядок сборки js файлов через mix?

    @Wentixon
    Вместо js функцию scripts юзай
    Ответ написан
    Комментировать
  • Кто может подсказать правильный путь к программированию?

    @Wentixon
    Мой совет - учи фундаменталку. Забей на языки и технологии. Сам учился в колледже и скажу, что преподаватели обычно все из прошлого века, они не знают современные подходы, инструменты и т.д.. Лично мне после всяких делфи и лабораторных пришлось потом еще переучиваться долгое время, а не первой работе страдать, так что советую вообще забивать на эти пары и не ходить на них, будет только лучше :) У нас даже не уделяли внимание правильному неймингу, не говоря уж о каких то лучших практиках. Так что бери от колледжа чисто фундаментальные знания, даже если тебе кажется что они нафиг не нужны и никогда не пригодятся (это далеко не так)

    Параллельно же выбери ровно одно направление, которое тебе ближе и ищи любые материалы по нему, будь то видео на ютубе, статьи, книги (это не так важно), а также не забывай о практике. Но здесь скажу, что не поработав на реальных проектах опять же пользы от этого будет не особо много. Сам я перед первой работой пробовал всячески подготовиться, изучал тонны материалов, но один хер пришел на работу и меня тыкали мордой в мой говнокод.
    Ответ написан
    7 комментариев
  • Sql and xss все ли я правильно понял?

    @Wentixon
    1. Правильно, но для удобства, а также избежания подобных ошибок используют ORM. Там даже сложновато подобные уязвимости сделать, надо постараться.
    2. Да, htmlspecialchars экранирует теги, strip_tags удаляет их. Опять же эти вещи делают шаблонизаторы, погуглите.
    3. 2 параметр указывает формат экранирование, что экранировать, что нет. Ты написал что то странное.. Про то, что делает каждый флаг описано в доке


    Если браузер блокирует, значит неправильно что то делаешь. Ты должен просто увидеть скрипт
    Ответ написан
    Комментировать
  • Актуальность Макконнелла?

    @Wentixon
    Есть концепции, которые не меняются. Навряд ли книгу по математике 1980 года можно считать устаревшей.. Также и Совершенный код ни чуть не устарел, его по прежнему не хватает ;)
    Ответ написан
    Комментировать
  • Собираюсь учить С++, но какими знаниями надо обладать?

    @Wentixon
    Достаточно, начинай писать

    Вот интересно зачем и кто задаёт такие вопросы.. как можно спросить вообще достаточно ли у меня знаний? Если ты знаешь как это сделать, то достаточно, если ты пробуешь и не получается, то недостаточно. Это же очевидно! Да и ты вообще свои знания не описал. Физика и алгоритмы тебе явно помогут сервер написать..

    А если умеешь разрабатывать алгоритмы, то разработай алгоритм написания сервера или обучения..
    Ответ написан
    2 комментария
  • Как правильнее всего реализовать проверку на отсутствие совпадений в SQL?

    @Wentixon
    Лучше количество получать и просто преобразовывать в boolean. В вашем решении минус в том, что выбирается слишком много ненужных данных
    Ответ написан
    5 комментариев
  • Как не загружать товары по новой, если они уже есть в базе?

    @Wentixon
    Сначала ты собираешь ссылки, которые будешь парсить. Так вот запиши эти ссылки в отдельную таблицу. В следующий раз при сборе ссылок собственно получай ссылки, которые уже есть и исключая их, оставляй новые
    Ответ написан
    4 комментария
  • Как автоматически сохранять URL алиас к посту?

    @Wentixon
    yii2 slug
    Ответ написан
    Комментировать
  • Есть ли возможность прочитать таблицу из PDF и перенести в HTML, и как?

    @Wentixon
    С помощью скрипта на сервере. Погуглите pdf to html + ваш язык
    Ответ написан
    2 комментария
  • Как начать работать во frontend?

    @Wentixon
    Зачем этот вопрос, если вы сами же пишите в коменте
    все всё делают своими лапками
    ??? Сам же и ответил на свой вопрос! А вообще таких вопросов тысячи, задаются они каждый день по 100 раз, почему ты просто не загуглишь?

    Ну а по делу скажу так, что курсы которые ты прошел полное гавно, там хорошему не научат, более того придется после них переучиваться. На фриланс без портфолио и опыта не иди. В офис можно устроиться джуном без проблем. Скорость обучения зависит только от тебя. Если хочешь быстрых денег иди в другое место, джуном устроиться просто, но выйти на хороший уровень достаточно сложно и долго. Ну а также еб*ь, еб*фшь и *ь, вместо того чтобы задавать такие вопросы
    Ответ написан
    21 комментарий
  • Как развиваться дальше и где черпать идеи/задачи?

    @Wentixon
    Твоя проблема на самом деле в том, что видя трудности впереди ты бежишь от них и сразу же берешься за новое дело. Ты начал делать проект, так где он? Ты доделал его или все же получилось не то, что ты хотел сделать? Теперь ты изучаешь плюсы, не понимая зачем они тебе нужны? Это ли не безумие? Может тебе стоит попробовать что то другое? Например, вагоны поразгружать или кассиром поработать, как вариант. Короче не хочется много писать, просто возьми что то одно и доводи это до ума. То есть одна технология, один проект, который ты будешь постоянно развивать. Неважно что это будет, просто бей ниже мочи в жижу! Иначе далеко ты не уедешь, чтобы ты не изучал, будут появляться сложности, но если не будешь их преодолевать никогда не выйдешь на новый уровень. Я тоже в свое время метался, изучая и веб и андроид и игры и все короче.. Но потом понял, что я полный нуль и все знаю поверхностно, так что главное тупо идти в одном направлении и становится профи в чем то одном!
    Ответ написан
    9 комментариев
  • Почему php не находит пакет из composer?

    @Wentixon
    Во первых установи композер в папку с сайтом, а то у тебя все разбросано непонятно как. В index.php подключи файл из папки vendor

    require __DIR__.'/vendor/autoload.php';

    и не забудь подключать классы через use
    Ответ написан
    1 комментарий