За последние 24 часа нас посетили 17624 программиста и 1604 робота. Сейчас ищут 1002 программиста ...

yii2 восстановления пароля в админки

Тема в разделе "PHP для новичков", создана пользователем mixnet, 10 дек 2019.

  1. mixnet

    mixnet Новичок

    С нами с:
    11 авг 2018
    Сообщения:
    146
    Симпатии:
    7
    подскажите реализую восстановления пароля в админке, и немного словил ступор, на фронтенде у нас есть восстановления пароля и сброс пароля, я так понимаю, что можно у наследоваться от контроллера восстановления пароля или нужно как то свой велосипед писать?
     
  2. ElisDN

    ElisDN Активный пользователь

    С нами с:
    13 фев 2018
    Сообщения:
    605
    Симпатии:
    130
    Скопировать контроллер с фронта в админку.
     
  3. mixnet

    mixnet Новичок

    С нами с:
    11 авг 2018
    Сообщения:
    146
    Симпатии:
    7
    скопировать методы восстановления и все?)
     
  4. ElisDN

    ElisDN Активный пользователь

    С нами с:
    13 фев 2018
    Сообщения:
    605
    Симпатии:
    130
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.103
    Симпатии:
    1.243
    Адрес:
    там-сям
    Вынести поведение в трейт и применить трейт к обоим контроллерам.
     
    [vs] нравится это.
  6. ElisDN

    ElisDN Активный пользователь

    С нами с:
    13 фев 2018
    Сообщения:
    605
    Симпатии:
    130
    В Yii для этого есть Action-классы.

    А трейты – для ленивых, не умеющих в декомпозицию и пишущих логику в контроллере.
     
  7. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    ок
     
  8. ElisDN

    ElisDN Активный пользователь

    С нами с:
    13 фев 2018
    Сообщения:
    605
    Симпатии:
    130
    Да, вместо копирования логики скопировать экшен, дёргающий эту логику, декомпозированную в модель.

    В нормальном контроллере как в расходном материале для UI логики не будет. Тогда и никакие трейты не понадобятся.
     
    #8 ElisDN, 10 дек 2019
    Последнее редактирование: 10 дек 2019
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.557
    Симпатии:
    631
    Короче @mixnet, либо копипаста-говнокод, либо глубокий рефакторинг контроллера на фронтенде. Не ленись, повторное использование кода через трейты для трусов.
     
  10. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.103
    Симпатии:
    1.243
    Адрес:
    там-сям
    Немного оффтопик: считаю что удобно иметь один список пользователей, некоторые из которых админы и имеют доп возможности. Роли у них разные, а таблица Пользователи одна. При такой организации восстановление пароля реализуется в одном месте. Без копипасты. Если вы не со старым кодом работаете, а творите с нуля, я бы порекомендовал делать так.
     
  11. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Добавлю: "админка" - это не более чем роуты ограниченные или расширенные ролью / правами пользователя. Тогда вообще не придется ничего дублировать, просто смотри что пользователь может менять и какие данные ему можно возвращать.
    --- Добавлено ---
    ок. Я прозрел и теперь буду декомпозировать в модель.
     
  12. acho

    acho Активный пользователь

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
    и плевать, что они были придуманы именно для такого использования...
     
    [vs] и mixnet нравится это.
  13. ElisDN

    ElisDN Активный пользователь

    С нами с:
    13 фев 2018
    Сообщения:
    605
    Симпатии:
    130
    Да-да. Придуманы для тех, кто не умеет в одиночное наследование в PHP. В Java и C# они никому не нужны.
     
  14. mixnet

    mixnet Новичок

    С нами с:
    11 авг 2018
    Сообщения:
    146
    Симпатии:
    7
    сможешь пример скинуть? как это реализовывается
     
  15. acho

    acho Активный пользователь

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
    А ты писал то на Java и C#?
    Java:
    Код (Text):
    1. package com.journaldev.inheritance;
    2. public class ClassC extends ClassA, ClassB{
    3.     public void с(){
    4.     }
    5. }
    а в C# вполне себе множественное наследование интерфейсов.
    Теоретики, они везде...
     
    romach нравится это.
  16. ElisDN

    ElisDN Активный пользователь

    С нами с:
    13 фев 2018
    Сообщения:
    605
    Симпатии:
    130
    Ну вы, видимо, не писали. Compile Error.

    Наследование интерфейсов, Карл?

    Множественного наследования реализации в Java и C# из коробки нет. Интерфейсы не наследуют, а реализуют. В отличие от классов и трейтов настоящие интерфейсы по определению реализацию не содержат.

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

    Пипец, каких опытных "практиков" завезли. Даже интерфейс от класса и трейта не отличают.
     
    #16 ElisDN, 11 дек 2019
    Последнее редактирование: 11 дек 2019
  17. ElisDN

    ElisDN Активный пользователь

    С нами с:
    13 фев 2018
    Сообщения:
    605
    Симпатии:
    130
    В yii2-app-advanced это уже реализовано. Логика восстановления там уже вынесена в формы-сервисы PasswordResetRequestForm и ResetPasswordForm. Так что полупустые экшены можно спокойно копировать и копипасты логики не будет.
     
    mixnet нравится это.
  18. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    какой же он забавный )
     
  19. ElisDN

    ElisDN Активный пользователь

    С нами с:
    13 фев 2018
    Сообщения:
    605
    Симпатии:
    130
    Ну извините, что мы с @[vs] своими умениями оскорбляем чувства практиков на форуме.

    Нам надо быть этичнее. Впредь вместо "говнокодер" или "рукожоп" брать более толерантное "практик".
     
  20. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    А @[vs] то тут при чем? У меня к нему вопросов нет, это довольно сильный программист, который знает о чем говорит и даже применяет на практике. Как и @artoodetoo и @acho

    А лить воду приправленную набором не всегда верно между собой связанных терминов - таки не умение ни разу.
     
  21. ElisDN

    ElisDN Активный пользователь

    С нами с:
    13 фев 2018
    Сообщения:
    605
    Симпатии:
    130
    При том, что с одной стороны довольно сильные практики с теорией @ElisDN и @[vs] говорят, что трейты - для лентяев и трусов, не умеющих в декомпозицию.

    А с другой стороны практики @artoodetoo и @acho без теории советуют трейты и несут чушь про наследование интерфейсов. И вы это спокойно лайкаете.

    Значит просто не осиливаете понять, что эти слова значат и что там всё верно связано. Слишкам сложна и звучит как непонятная абракадабра. Смиритесь.
     
    #21 ElisDN, 12 дек 2019
    Последнее редактирование: 12 дек 2019
  22. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Просто я прекрасно понимаю о чем сказал @[vs], полностью согласен с тем что написал @artoodetoo (и он дал наиболее правильный совет с точки зрения архитектуры, не абстрактной теоретической, а о том как нужно делать на практике что бы это работало, расширялось и поддерживалось), ну а @acho вообще писал не про это.

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

    ElisDN Активный пользователь

    С нами с:
    13 фев 2018
    Сообщения:
    605
    Симпатии:
    130
    В общем, всегда старайтесь декомпозировать систему, инкапсулируя бизнес-логику в доменную модель и уменьшая связанность. Сверху для коммуникации с UI накиньте прикладной сервисный слой юзкейсов. Тогда с единым выделенным источником правды сможете безболезненно копипастить тонкие контроллеры, не нарушая DRY. И, как побочный профит, получите возможность тестирования сущности модели юнит-тестами вместо интеграционных.
     
  24. ElisDN

    ElisDN Активный пользователь

    С нами с:
    13 фев 2018
    Сообщения:
    605
    Симпатии:
    130
    Первый написал, что трейты для трусов, а второй написал вынести в трейт. Так вы за умных или за красивых?

    Он и сам не понял, к чему это написал. На слова об отсутствии множественного наследования и трейтов в Java и C# он зачем-то влепил нерабочий код и приплёл интерфейсы, никакого отношения к наследованию и трейтам не имеющие.

    Штука именно в том, что я всё это и использую на практике. Знаю минусы, плюсы и границы. Из этого опыта всё и говорю. А вам и другим практикам почему-то кажется, что я это просто теоретик и всё это на ходу придумываю. Например, к вашему:
    говорю, что это вам и ему так кажется, что вариант с трейтом наиболее правильный, расширяемый и поддерживаемый. Просто для вас он самый простой в вашей практической архитектуре.

    А с точки зрения реальной программной архитектуры он, отнюдь, не расширяемый и туго поддерживаемый:

    Трейт с экшеном сильно связывает систему, никак отдельно не тестируется, никак не настраивается, не кастомизируется и не умеет подгружать зависимости без синглтонов. Как только во фронте или в админке в этот экшен нужно будет добавить отличающуюся строку (например, переименовать view или заменить confirmUrl в почте или redirectUrl после успеха), параметр или if, так мгновенно образуется геморрой. Сразу приходится делать циклические зависимости, добавляя в контроллер поле protected $resetRedirectUrl и шаблонные методы, которые этот трейт будет дёргать. IDE и анализаторы кода начинают ругаться на вызов и чтение отсутствующего в трейте поля $this->resetRedirectUrl и прочих методов. По сигнатуре трейта перестаёт быть понятно, как он работает. IDE подсвечивает методы и поля контроллера как неиспользуемые. Программисту по сигнатуре контроллера тоже непонятно, кто с этими полями работает. При использовании DIC приходится прокидывать в конструктор контроллера и все зависимости трейта.

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

    Так что для меня более оптимальный вариант - отделить бизнес-логику процесса от UI-кода контроллера и инкапсулировать в PasswordResetForm или PasswordResetService и вызывать этот сервис из обоих экшенов.
     
    #24 ElisDN, 12 дек 2019
    Последнее редактирование: 12 дек 2019
  25. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    То что мне кажется, я описал выше, а именно, что в архитектуре API приложения не должно быть деления на "админку" и "пользовательскую". Должно быть деление прав доступа к данным на основе ролей и разрешений, тогда и не придется дублировать функционал (@artoodetoo тоже про это говорил) Как это будет делаться трейтами или декомпозицией в модели - мне вообще похер, потому что первое - один из инструментов, а второе - вообще не имеет отношение к реальности и в любом случае это всего лишь код, который как известно вторичен для любого кто умеет его писать. Такие дела.

    о боже. Вы вот это всё серьезно?