Verification: a143cc29221c9be0

Php check if is resource

Php check if is resource

Работа с пользователями

Нужно еще предоставить администратору возможность работы с пользователями. Так что организуем просмотр списка и добавим форму для изменения данных пользователя. Страницу просмотра данных пользователя делать не будем, потому как данных-то всего две строки — «Имя, Фамилия» и «Адрес почты». При редактировании будет возможность изменить пароль пользователя. Не уверен, что это нужно — но пусть будет для полноты картины — в конце концов, это учебный проект.

Я князь! Чего хочу — того и ворочу… эээ… действую в интересах державы.

Мультфильм «Илья Муромец и Соловей Разбойник»

Создаем ресурсный контроллер:

> php artisan make:controller Admin/UserController --resource --model=Models/User
namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;

class UserController extends Controller {
    /**
     * Показывает список всех пользователей
     *
     * @return \Illuminate\Http\Response
     */
    public function index() {
        $users = User::paginate(5);
        return view('admin.user.index', compact('users'));
    }

    /**
     * Показывает форму для редактирования пользователя
     *
     * @param  \App\Models\User  $user
     * @return \Illuminate\Http\Response
     */
    public function edit(User $user) {
        return view('admin.user.edit', compact('user'));
    }

    /**
     * Обновляет данные пользователя в базе данных
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Models\User  $user
     * @return \Illuminate\Http\RedirectResponse
     * @throws \Illuminate\Validation\ValidationException
     */
    public function update(Request $request, User $user) {
        /*
         * Проверяем данные формы
         */
        $this->validator($request->all(), $user->id)->validate();
        /*
         * Обновляем пользователя
         */
        if ($request->change_password) { // если надо изменить пароль
            $request->merge(['password' => Hash::make($request->password)]);
            $user->update($request->all());
        } else {
            $user->update($request->except('password'));
        }
        /*
         * Возвращаемся к списку
         */
        return redirect()
            ->route('admin.user.index')
            ->with('success', 'Данные пользователя успешно обновлены');
    }

    /**
     * Возвращает объект валидатора с нужными нам правилами
     *
     * @param array $data
     * @return \Illuminate\Contracts\Validation\Validator|\Illuminate\Validation\Validator
     */
    private function validator(array $data, int $id) {
        $rules = [
            'name' => [
                'required',
                'string',
                'max:255'
            ],
            'email' => [
                'required',
                'string',
                'email',
                'max:255',
                // проверка на уникальность email, исключая
                // этого пользователя по идентифкатору
                'unique:users,email,'.$id.',id',
            ],
        ];
        if (isset($data['change_password'])) {
            $rules['password'] = ['required', 'string', 'min:8', 'confirmed'];
        }
        return Validator::make($data, $rules);
    }
}

Добавляем маршруты в файл web.php:

Route::group([
    'as' => 'admin.', // имя маршрута, например admin.index
    'prefix' => 'admin', // префикс маршрута, например admin/index
    'namespace' => 'Admin', // пространство имен контроллера
    'middleware' => ['auth', 'admin'] // один или несколько посредников
], function () {
    // главная страница панели управления
    Route::get('index', 'IndexController')->name('index');
    // CRUD-операции над категориями каталога
    Route::resource('category', 'CategoryController');
    // CRUD-операции над брендами каталога
    Route::resource('brand', 'BrandController');
    // CRUD-операции над товарами каталога
    Route::resource('product', 'ProductController');
    // доп.маршрут для показа товаров категории
    Route::get('product/category/{category}', 'ProductController@category')
        ->name('product.category');
    // просмотр и редактирование заказов
    Route::resource('order', 'OrderController', ['except' => [
        'create', 'store', 'destroy'
    ]]);
    // просмотр и редактирование пользователей
    Route::resource('user', 'UserController', ['except' => [
        'create', 'store', 'show', 'destroy'
    ]]);
});

Шаблон для просмотра списка views/admin/user/index.blade.php:

@extends('layout.admin', ['title' => 'Все пользователи'])

@section('content')
    

class

="mb-4">Все пользователи class="table table-bordered"> @foreach($users as $user)@endforeach
# width="25%">Дата регистрации width="25%">Имя, фамилия width="25%">Адрес почты width="20%">Кол-во заказов class="fas fa-edit">
{{ $user->id }} {{ $user->created_at->format('d.m.Y H:i') }} {{ $user->name }} href="mailto:{{ $user->email }}">{{ $user->email }} {{ $user->orders->count() }} href="{{ route('admin.user.edit', ['user' => $user->id]) }}"> class="far fa-edit">
{{ $users->links() }} @endsection

Шаблон для редактирования views/admin/user/index.blade.php:

@extends('layout.admin', ['title' => 'Редактирование пользователя'])

@section('content')
    

class

="mb-4">Редактирование пользователя
method
="post" action="{{ route('admin.user.update', ['user' => $user->id]) }}"> @csrf @method('PUT')
class="form-group"> type="text" class="form-control" name="name" placeholder="Имя, Фамилия" required maxlength="255" value="{{ old('name') ?? $user->name ?? '' }}">
class="form-group"> type="email" class="form-control" name="email" placeholder="Адрес почты" required maxlength="255" value="{{ old('email') ?? $user->email ?? '' }}">
class="form-group form-check"> type="checkbox" class="form-check-input" name="change_password" id="change_password"> ="form-check-label" for="change_password"> Изменить пароль пользователя
class="form-group"> type="text" class="form-control" name="password" maxlength="255" placeholder="Новый пароль" value="">
class="form-group"> type="text" class="form-control" name="password_confirmation" maxlength="255" placeholder="Пароль еще раз" value="">
class="form-group"> ="submit" class="btn btn-success">Сохранить
@endsection

Преобразование даты регистрации из UTC в Europe/Moscow:

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Carbon;

class User extends Authenticatable {
    /**
     * Преобразует дату и время регистрации пользователя из UTC в Europe/Moscow
     *
     * @param $value
     * @return \Carbon\Carbon|false
     */
    public function getCreatedAtAttribute($value) {
        return Carbon::createFromFormat('Y-m-d H:i:s', $value)->timezone('Europe/Moscow');
    }

    /**
     * Преобразует дату и время обновления пользователя из UTC в Europe/Moscow
     *
     * @param $value
     * @return \Carbon\Carbon|false
     */
    public function getUpdatedAtAttribute($value) {
        return Carbon::createFromFormat('Y-m-d H:i:s', $value)->timezone('Europe/Moscow');
    }
}