Здравствуйте. Я недавно начал писать на php, пытаюсь стучаться в двери, но пока везде закрыто. Правда и нужна мне удаленка. Может кто даст дельные советы посмотрев код если будет желание\время? https://github.com/SergeySlukin/php
https://github.com/SergeySlukin/php/blob/master/yuma-yii/frontend/controllers/UserController.php#L11 что тут происходит? --- Добавлено --- PHP: return $this->render('operation', ['message' => '1']); Можно было бы этим http://www.yiiframework.com/doc-2.0/guide-runtime-sessions-cookies.html#flash-data воспользоваться
В первом if происходит ajax валидация данных формы. Второй if смотрим если есть user_id и нет post запроса, то находить пользователя по user_id и выводим данные в форме. Иначе если есть user_id и есть post запрос, то, находим пользователя ( думаю можно\нужно сделать поиск пользователя 1 раз) и меняем данные по пути смотрим нужно ли менять пароль. Мне не хотелось создавать отдельный action для обработки данных с формы поэтому реализовал все в одном. До этого опыта с yii не имел, буду рад за наставления. Это великолепно! Завтра сделаю!
Не надо столько действий в контроллер запихивать. Посмотри, как красиво сделано в 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: 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, всю работу - в неё, валидацию, загрузку данных пользователя и т.п. Очень красиво получается
Спасибо. Приму к сведению. Навык конечно ещё поднимать и поднимать. --- Добавлено --- У меня в моделе User есть метод beforeSave в котором по сути это и делается. Ошибок действительно много, первое знакомство с Yii.
Выложи ещё что-нибудь интересное там, а то регистрация и редактирование профиля - скучно --- Добавлено --- Фотоальбомчик, что-ли )
Ты неправильно сделал beforeSave, хоть я его и не заметил с первого раза. Он у тебя всегда пароль перезаписывать будет, т.е. для хеша сделает ещё один хеш, и пользователь перестанет входить. Надо проверять тогда, изменён ли пароль (подсказка: параметр $insert, поле $dirtyAttributes http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#dirty-attributes)
Елки палки, действительно. Спасибо! Поправлю. С beforeSave пробывал использовать поведение: EVENT_BEFORE_INSERT и EVENT_AFTER_UPDATE . Но не получилось =(
Изменил beforeSave PHP: public function beforeSave($insert) { $dirtyAttributes = parent::getDirtyAttributes(); if (parent::beforeSave($insert)) { if (isset($dirtyAttributes['password'])) { $this->password = Yii::$app->getSecurity()->generatePasswordHash($this->password); } return true; } else { return false; } } Шикарно, тогда получается в контроллере можно не проверять на наличие заполнение поля newPassword а вынести в модель как и советовали.
Поправил немного проект. Добавил модель UserUpdateForm как и советовали. Добавил метод dataChecking, проверяет есть ли измененные данные, если нет то не обращаемся лишний раз в базу. Небольшой рефакторинг.
Зачем UserUpdateForm ActiveRecord? Не нужно этого. И у тебя всё равно вся работа в контроллере. Вот из моего проекта пример обновления профиля (из контроллера) PHP: public function actionEdit() { $profileForm = new ProfileCommonForm(["user" => $this->user]); if ($profileForm->load(\Yii::$app->request->post())) { $profileForm->logoFile = UploadedFile::getInstance($profileForm, "logoFile"); $profileForm->documentsFiles = UploadedFile::getInstances($profileForm, "documentsFiles"); if ($profileForm->save()) { $this->refresh(); } } return $this->render("edit", [ "profileForm" => $profileForm, "serviceManager" => $this->serviceManager, "user" => $this->user, ]); } И то многовато для контроллера, в принципе, можно было ещё вынести логики из него... А вся работа по обновлению базы данных вынесена в ProfileCommonForm --- Добавлено --- Потом, зачем писать свой валидатор уникальности, если у yii2 он уже есть? Доку не читаем?
у тебя впереди вся жизнь полная открытий главное прочухать фишки пхп - динамическая типизация и ассоциативные массивы. Очень удобные. Остальное тут почти так же как и везде, а вот эти штуки они другие. пхп очень гибкий. MVC это сферический конь в вакууме. Его все понимают по-разному. https://www.google.com/search?q=mvc&tbm=isch обрати внимание на то что иногда модель доступна только через контролллер, а иногда напрямую из вьюхи, иногда связи однонаправленные, иногда нет. Ты сильно не грузись "советами" других. Толстый контроллер, тонкий контроллер - это всё под задачу, как тебе удобнее.
у меня мало опыта работы с MVC. мне кажется что это разнообразие подходов вытеает из того простого факта, что в MVC слишком мало букв. Как я понимаю: Контроллер должен дёрнуть некую логику, в которую передать модель, а результат работы этой логики пихнуть во вьюху. Вот если добавить букву L то жизнь налаживается. Но это получается тонкий контроллер, алогика отдельно.
Полностью согласен. У меня сложилось мнение, что контроллер должен заниматься логикой, модель общается только с базой и ей должно быть пофиг на логику.
Не, это плохо, когда в контроллере логика. Вообще, по хорошему, нужно полностью SOLID применять, хотя я не делаю. Только базой должна заниматься модель ActiveRecord, в yii2 популярны модели форм ещё, это получается что-то типа сервисного слоя. Контроллер должен передать данные моделям/сервисному слою, они должны обработать данные и вернуть контроллеру то, что нужно передать во вьюху. Вообще, если программа хорошо построена, то тела методов будут очень короткие
@Alesto это тоже предмет обсуждения. Некоторые считают, что модель должна даже сама себя сохранять в бд. А некоторые, что должна предоставлять только методы работы. Я думаю это просто от задачи танцует. По мне так в контроллере не должно быть логики ващпе. Модель не должна сама себя сохранять. Но я понимаю где и когда это удобно.
А вообще, главное место, где должна быть логика - это, блджад, в архитектуре приложения. Да, я не про бизнеслогику, а про логику в полном ее смысле. А там уже не важно, МФЦ там, или еще что, мб какая-то невероятно новая парадигма и тд. Главное, чтобы все было организовано логично. Чтобы, когда спустя год, ты в проект свой залезешь, сам себя матом не ругал. MVC, как и любой паттерн, не является законом, догмой, приказом. Это всего лишь совет, суть которого в том, что "если не знаешь, как правильно сделать то-то и то-то, то лучше сделай вот так, как тут написано, потому что это проверено, это работает". Но если знаешь как сделать иначе, если понимаешь, что делаешь, то делай как знаешь. Опять же, сказанное мною не значит, что "паттерны для лохов без фантазии, а я не такой, я другой, я не должен их юзать", нет, потому что это тоже бред. Я тебе больше скажу - многие паттерны настолько обкатанные и отполированные, что ты, изобретая что-то свое, не зная про них, в итоге, с почти 100% вероятностью, сделаешь реализацию уже существующего паттерна. Серьезно. Но потратишь больше времени, чем если бы просто почитал про них и выбрал подходящий.
паттерн это по сути привычка в определённых ситуациях поступать определённым образом. привычка экономит время на повторные решения. и она же мешает тебе вникать глубже, развиваться. --- Добавлено --- знать паттерны безусловно хорошо, это твой "активный словарь". бояться отступить от паттерна плохо, это показывает твою неуверенность в собственных силах.