Может войдёшь?
Черновики Написать статью Профиль

Выполняем тестовое задание (Мини блог) — Часть 3

laravel 5 Тестовое задание

Всем привет, кто читает мою статью.
Продолжаем выполнение тестового задания. Выполним пункт 2.

— Расширить модель User, чтобы она имела поля, соответствующие форме index.html.
Создаем миграцию, в которой вносим изменения в таблицу «users» необходимые для расширения модели User:

  1. php artisan make:migration ChangeUserTable --table=users

В созданной миграции в методе up() опишем создаваемые поля:

PHP
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 представляет собой библиотеку обработки изображений.
Для установки в консоль выполним команду:

  1. composer require intervention/image

После чего открываем файл config/app.php и в providers добавляем:

PHP
'providers' => [
    ...
    
Intervention\Image\ImageServiceProvider::class,
],

В alias добавляем:

PHP
'aliases' => [
    ...
    
'Image' => Intervention\Image\Facades\Image::class,
],

Все теперь класс изображения будет автоматически загружен из Laravel.

— Доработать приложение, чтобы данные с этой формы создавали объект User в базе данных на сервере. После сохранения данных на сервере происходит редирект на точно такую-же страницу, где данные уже введены и их нельзя изменить.
Определим routes, которые понадобятся для выполнения 2 этапа тестового задания:

PHP
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']);
        
//--------------------
    
});
});

Далее создадим контроллер для работы с профилем пользователя:

  1. php artisan make:controller UserController

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

1) route('users.profile') — будет отображаться вся информация о пользователе, где данные уже введены и их нельзя изменить. Информация о пользователе
UserController.php

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

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

PHP
class UserController extends SiteController
{
    ...
    public function 
update(UserRequest $request)
    {
        if (
$this->userService->updateUser($requestAuth::user())) {
            return 
redirect()->route('users.profile')->with('status'__('site.inf_update'));
        }

        return 
back()->withInput()->with('status'__('site.warning'));
    }
    ...
}

UserService.php

PHP
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;
    }
    ...
}

Ссылка на Git.
Далее Часть 4

Как вы считаете, полезен ли этот материал? Да Нет

Комментарии (6)

Eskono

array_key_exists(«filename»,$data) && $data['filename']

а не проще поставить проверку !empty($data['filename']) вместо вышеуказанного?

raketa

Спасибо. Учту. Использовал array_key_exists т.к. проверял существует ли элемент в массиве $data. С empty тоже работает. Но например если использовать empty, когда на форме есть checkbox, то выдает ошибку.

raketa

Переделал

seqond

Зачем использовать множественные get / post маршруты для profile если можно использовать 1 запись resource?

Route::resource('profile', 'UserController')

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.