Всем привет, кто читает мою статью.
Продолжаем выполнение тестового задания. Выполним пункт 2.
— Расширить модель User, чтобы она имела поля, соответствующие форме index.html.
Создаем миграцию, в которой вносим изменения в таблицу «users» необходимые для расширения модели User:
- php artisan make:migration ChangeUserTable --table=users
В созданной миграции в методе up() опишем создаваемые поля:
class ChangeUserTable extends Migration
{
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('nickname')->unique();
$table->string('surname')->nullable();
$table->string('avatar')->nullable();
$table->string('phone')->nullable();
$table->string('sex', 10)->default('male');
$table->boolean('show_phone')->default(false);
});
}
...
}
Для работы с изображением будем использовать пакет Intervention Image.
Intervention Image представляет собой библиотеку обработки изображений.
Для установки в консоль выполним команду:
- composer require intervention/image
После чего открываем файл config/app.php и в providers добавляем:
'providers' => [
...
Intervention\Image\ImageServiceProvider::class,
],
'aliases' => [
...
'Image' => Intervention\Image\Facades\Image::class,
],
Все теперь класс изображения будет автоматически загружен из Laravel.
— Доработать приложение, чтобы данные с этой формы создавали объект User в базе данных на сервере. После сохранения данных на сервере происходит редирект на точно такую-же страницу, где данные уже введены и их нельзя изменить.
Определим routes, которые понадобятся для выполнения 2 этапа тестового задания:
Route::group(['middleware' => ['web']], function () {
...
Route::group(['middleware' => ['auth']], function () {
...
//----User profile----
Route::get('/profile', ['uses'=>'UserController@profile', 'as'=>'users.profile']);
Route::get('/profile/edit', ['uses'=>'UserController@edit', 'as'=>'users.edit']);
Route::post('/profile/edit', ['uses'=>'UserController@update', 'as'=>'users.update']);
Route::get('/profile/password', ['uses'=>'UserController@editPassword', 'as'=>'users.edit_password']);
Route::post('/profile/password', ['uses'=>'UserController@updatePassword', 'as'=>'users.update_password']);
//--------------------
});
});
Далее создадим контроллер для работы с профилем пользователя:
- php artisan make:controller UserController
Контроллер должен выполнять только свои прямые обязанности, поэтому вынесем всю бизнес логику в отдельные сервис классы. Опишем методы:
1) route('users.profile') — будет отображаться вся информация о пользователе, где данные уже введены и их нельзя изменить. Информация о пользователе
UserController.php
class UserController extends SiteController
{
...
public function profile()
{
$this->title = __('site.title_profile');
$title = $this->title;
$auth_user = Auth::user();
$this->content = view('auth.profile', compact('title', 'auth_user'))->render();
return $this->renderOutput();
}
...
}
2) route('users.edit') — будет отображаться форма для редактирования данных о текущем пользователе. Форма редактирования информации о пользователе
UserController.php
class UserController extends SiteController
{
...
public function edit()
{
$this->title = __('site.title_edit_profile');
$title = $this->title;
$auth_user = Auth::user();
$this->content = view('auth.edit_user', compact('title', 'auth_user'))->render();
return $this->renderOutput();
}
...
}
3) route('users.update') — обработка введенных данных о пользователи.
UserController.php
class UserController extends SiteController
{
...
public function update(UserRequest $request)
{
if ($this->userService->updateUser($request, Auth::user())) {
return redirect()->route('users.profile')->with('status', __('site.inf_update'));
}
return back()->withInput()->with('status', __('site.warning'));
}
...
}
class UserService
{
public function updateUser($request, $user)
{
$clearAvatar = $this->getReqClearAvatar($request);
$avatarNew = $this->getReqAvatar($request);
$showPhone = $this->getReqShowPhone($request);
$data = $request->except(['_token','clear_avatar','show_phone']);
$data['show_phone'] = $showPhone;
if ($clearAvatar) {
$this->clearAvatarSrv($user);
$data['avatar'] = null;
} else {
if ($avatarNew) {
$data['avatar'] = $this->addAvatarSrv($avatarNew);
}
}
$user->fill($data);
if ($user->update()) {
return true;
}
return false;
}
...
}
Комментарии (6)
array_key_exists(«filename»,$data) && $data['filename']
а не проще поставить проверку !empty($data['filename']) вместо вышеуказанного?
Спасибо. Учту. Использовал array_key_exists т.к. проверял существует ли элемент в массиве $data. С empty тоже работает. Но например если использовать empty, когда на форме есть checkbox, то выдает ошибку.
deleted
isset ?
Переделал
Зачем использовать множественные get / post маршруты для profile если можно использовать 1 запись resource?
Route::resource('profile', 'UserController')