За последние 24 часа нас посетили 50042 программиста и 1727 роботов. Сейчас ищут 755 программистов ...

Нужна оценка уровня умений

Тема в разделе "PHP для новичков", создана пользователем Alesto, 22 янв 2017.

  1. Alesto

    Alesto Новичок

    С нами с:
    15 янв 2017
    Сообщения:
    72
    Симпатии:
    8
    Здравствуйте.
    Я недавно начал писать на php, пытаюсь стучаться в двери, но пока везде закрыто. Правда и нужна мне удаленка.
    Может кто даст дельные советы посмотрев код если будет желание\время?
    https://github.com/SergeySlukin/php
     
  2. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Alesto нравится это.
  3. Alesto

    Alesto Новичок

    С нами с:
    15 янв 2017
    Сообщения:
    72
    Симпатии:
    8
    В первом if происходит ajax валидация данных формы.
    Второй if смотрим если есть user_id и нет post запроса, то находить пользователя по user_id и выводим данные в форме.
    Иначе если есть user_id и есть post запрос, то, находим пользователя ( думаю можно\нужно сделать поиск пользователя 1 раз) и меняем данные по пути смотрим нужно ли менять пароль.

    Мне не хотелось создавать отдельный action для обработки данных с формы поэтому реализовал все в одном.
    До этого опыта с yii не имел, буду рад за наставления.

    Это великолепно! Завтра сделаю!
     
  4. Alesto

    Alesto Новичок

    С нами с:
    15 янв 2017
    Сообщения:
    72
    Симпатии:
    8
    Воспользовался flash-data + небольшой рефакторинг.
     
    denis01 нравится это.
  5. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Не надо столько действий в контроллер запихивать. Посмотри, как красиво сделано в advanced app:
    https://github.com/yiisoft/yii2-app.../frontend/controllers/SiteController.php#L149
    А вся грязная работа здесь:
    https://github.com/yiisoft/yii2-app-advanced/blob/master/frontend/models/SignupForm.php
    --- Добавлено ---
    И для валидации много средств есть встроенных у yii2, не надо никаких
    PHP:
    1.  if (isset($post['User']['newPassword']) && strlen($post['User']['newPassword']) !== 0)
    --- Добавлено ---
    https://github.com/SergeySlukin/php/blob/master/yuma-yii/frontend/models/User.php#L169 - вот эта штука не просто так реализована вместо прямого присвоения пароля, она ещё хеш делает
    --- Добавлено ---
    Вообще, сотвори модель UserUpdateForm, всю работу - в неё, валидацию, загрузку данных пользователя и т.п. Очень красиво получается
     
    Alesto нравится это.
  6. Alesto

    Alesto Новичок

    С нами с:
    15 янв 2017
    Сообщения:
    72
    Симпатии:
    8
    Спасибо. Приму к сведению. Навык конечно ещё поднимать и поднимать.
    --- Добавлено ---
    У меня в моделе User есть метод beforeSave в котором по сути это и делается.
    Ошибок действительно много, первое знакомство с Yii.
     
  7. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Выложи ещё что-нибудь интересное там, а то регистрация и редактирование профиля - скучно :)
    --- Добавлено ---
    Фотоальбомчик, что-ли :))
     
    Alesto нравится это.
  8. Alesto

    Alesto Новичок

    С нами с:
    15 янв 2017
    Сообщения:
    72
    Симпатии:
    8
    Согласен, банальный crud скучен. Фотоальбомчик хорошая идея. Думаю напишу. =)
     
  9. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Ты неправильно сделал beforeSave, хоть я его и не заметил с первого раза. Он у тебя всегда пароль перезаписывать будет, т.е. для хеша сделает ещё один хеш, и пользователь перестанет входить. Надо проверять тогда, изменён ли пароль (подсказка: параметр $insert, поле $dirtyAttributes http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#dirty-attributes)
     
    Alesto нравится это.
  10. Alesto

    Alesto Новичок

    С нами с:
    15 янв 2017
    Сообщения:
    72
    Симпатии:
    8
    Елки палки, действительно. Спасибо! Поправлю.
    С beforeSave пробывал использовать поведение: EVENT_BEFORE_INSERT и EVENT_AFTER_UPDATE . Но не получилось =(
     
    #10 Alesto, 23 янв 2017
    Последнее редактирование: 23 янв 2017
  11. Alesto

    Alesto Новичок

    С нами с:
    15 янв 2017
    Сообщения:
    72
    Симпатии:
    8
    Изменил beforeSave
    PHP:
    1. public function beforeSave($insert) {
    2.     $dirtyAttributes = parent::getDirtyAttributes();
    3.     if (parent::beforeSave($insert)) {
    4.         if (isset($dirtyAttributes['password'])) {
    5.           $this->password = Yii::$app->getSecurity()->generatePasswordHash($this->password);
    6.         }
    7.       return true;
    8.     } else {
    9.       return false;
    10.     }
    11.   }
    Шикарно, тогда получается в контроллере можно не проверять на наличие заполнение поля newPassword а вынести в модель как и советовали.
     
    #11 Alesto, 23 янв 2017
    Последнее редактирование: 23 янв 2017
  12. Alesto

    Alesto Новичок

    С нами с:
    15 янв 2017
    Сообщения:
    72
    Симпатии:
    8
    Поправил немного проект.
    Добавил модель UserUpdateForm как и советовали.
    Добавил метод dataChecking, проверяет есть ли измененные данные, если нет то не обращаемся лишний раз в базу.
    Небольшой рефакторинг.
     
  13. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
     
  14. Alesto

    Alesto Новичок

    С нами с:
    15 янв 2017
    Сообщения:
    72
    Симпатии:
    8
    Смешно, как это относится к теме?
     
  15. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Зачем UserUpdateForm ActiveRecord? Не нужно этого. И у тебя всё равно вся работа в контроллере. Вот из моего проекта пример обновления профиля (из контроллера)
    PHP:
    1. public function actionEdit()
    2. {
    3.     $profileForm = new ProfileCommonForm(["user" => $this->user]);
    4.     if ($profileForm->load(\Yii::$app->request->post())) {
    5.         $profileForm->logoFile       = UploadedFile::getInstance($profileForm, "logoFile");
    6.         $profileForm->documentsFiles = UploadedFile::getInstances($profileForm, "documentsFiles");
    7.         if ($profileForm->save()) {
    8.            
    9.             $this->refresh();
    10.         }
    11.     }
    12.     return $this->render("edit", [
    13.         "profileForm"    => $profileForm,
    14.         "serviceManager" => $this->serviceManager,
    15.         "user"           => $this->user,
    16.     ]);
    17. }
    И то многовато для контроллера, в принципе, можно было ещё вынести логики из него... А вся работа по обновлению базы данных вынесена в ProfileCommonForm
    --- Добавлено ---
    Потом, зачем писать свой валидатор уникальности, если у yii2 он уже есть? Доку не читаем?
     
  16. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    у тебя впереди вся жизнь полная открытий :D
    главное прочухать фишки пхп - динамическая типизация и ассоциативные массивы. Очень удобные. Остальное тут почти так же как и везде, а вот эти штуки они другие.
    пхп очень гибкий. MVC это сферический конь в вакууме. Его все понимают по-разному. https://www.google.com/search?q=mvc&tbm=isch обрати внимание на то что иногда модель доступна только через контролллер, а иногда напрямую из вьюхи, иногда связи однонаправленные, иногда нет. Ты сильно не грузись "советами" других. Толстый контроллер, тонкий контроллер - это всё под задачу, как тебе удобнее.
     
    denis01 и Alesto нравится это.
  17. Alesto

    Alesto Новичок

    С нами с:
    15 янв 2017
    Сообщения:
    72
    Симпатии:
    8
    Спасибо за такой теплый текст. =)
     
    #17 Alesto, 26 янв 2017
    Последнее редактирование: 26 янв 2017
  18. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    у меня мало опыта работы с MVC. мне кажется что это разнообразие подходов вытеает из того простого факта, что в MVC слишком мало букв.

    Как я понимаю:
    Контроллер должен дёрнуть некую логику, в которую передать модель, а результат работы этой логики пихнуть во вьюху.

    Вот если добавить букву L то жизнь налаживается. Но это получается тонкий контроллер, алогика отдельно.
     
  19. Alesto

    Alesto Новичок

    С нами с:
    15 янв 2017
    Сообщения:
    72
    Симпатии:
    8
    Полностью согласен. У меня сложилось мнение, что контроллер должен заниматься логикой, модель общается только с базой и ей должно быть пофиг на логику.
     
  20. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Не, это плохо, когда в контроллере логика. Вообще, по хорошему, нужно полностью SOLID применять, хотя я не делаю. Только базой должна заниматься модель ActiveRecord, в yii2 популярны модели форм ещё, это получается что-то типа сервисного слоя. Контроллер должен передать данные моделям/сервисному слою, они должны обработать данные и вернуть контроллеру то, что нужно передать во вьюху. Вообще, если программа хорошо построена, то тела методов будут очень короткие
     
    Alesto нравится это.
  21. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    @Alesto
    это тоже предмет обсуждения.
    Некоторые считают, что модель должна даже сама себя сохранять в бд. А некоторые, что должна предоставлять только методы работы. Я думаю это просто от задачи танцует.

    По мне так в контроллере не должно быть логики ващпе. Модель не должна сама себя сохранять. Но я понимаю где и когда это удобно.
     
    #21 igordata, 26 янв 2017
    Последнее редактирование: 26 янв 2017
    Alesto нравится это.
  22. Alesto

    Alesto Новичок

    С нами с:
    15 янв 2017
    Сообщения:
    72
    Симпатии:
    8
    Столько пищи для размышлений.
     
  23. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    про MVVM вот почитай в свете SPA
     
  24. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А вообще, главное место, где должна быть логика - это, блджад, в архитектуре приложения. Да, я не про бизнеслогику, а про логику в полном ее смысле. А там уже не важно, МФЦ там, или еще что, мб какая-то невероятно новая парадигма и тд. Главное, чтобы все было организовано логично. Чтобы, когда спустя год, ты в проект свой залезешь, сам себя матом не ругал. MVC, как и любой паттерн, не является законом, догмой, приказом. Это всего лишь совет, суть которого в том, что "если не знаешь, как правильно сделать то-то и то-то, то лучше сделай вот так, как тут написано, потому что это проверено, это работает". Но если знаешь как сделать иначе, если понимаешь, что делаешь, то делай как знаешь. Опять же, сказанное мною не значит, что "паттерны для лохов без фантазии, а я не такой, я другой, я не должен их юзать", нет, потому что это тоже бред. Я тебе больше скажу - многие паттерны настолько обкатанные и отполированные, что ты, изобретая что-то свое, не зная про них, в итоге, с почти 100% вероятностью, сделаешь реализацию уже существующего паттерна. Серьезно. Но потратишь больше времени, чем если бы просто почитал про них и выбрал подходящий.
     
    artoodetoo нравится это.
  25. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    паттерн это по сути привычка в определённых ситуациях поступать определённым образом. привычка экономит время на повторные решения. и она же мешает тебе вникать глубже, развиваться.
    --- Добавлено ---
    знать паттерны безусловно хорошо, это твой "активный словарь". бояться отступить от паттерна плохо, это показывает твою неуверенность в собственных силах.