Пишем сообщество phpland на Laravel - Часть 2

В этой статье мы продолжим разработку нашего сообщества "phpland" на Laravel.

Планы

  • Мы разграничим доступ и сделаем так, чтобы пользователь мог добавлять, редактировать и удалять только свои статьи и страницы
  • Админ сможет редактировать и удалять любые статьи и страницы

Сделаем так, чтобы при переходе на главную, у нас отображались все записи из блога

Откроем файл "routes/web.php" и изменим маршрут для "/":

Route::get('/', 'PagesController@index');

Теперь можно смело удалить не нужный нам View: "resources/views/welcome.blade.php".

Разграничим доступ

Немного теории:

Каждый пользователь будет иметь права на добавление, редактирование и удаление своих страниц. Админ сайта будет иметь полные права и сможет редактироват и чужие страницы, для этого мы добавим новое поле "is_admin" в таблицу "Users", которую мы создали ранее.

Отредактируем миграцию "database/migrations/2014_10_12_000000_create_users_table.php" и добавим в Up:

$table->enum('is_admin', [0, 1])->default(0);
$table->enum('is_premium', [0, 1])->default(0);
$table->string('github')->nullable();
$table->enum('status', ['active', 'inactive'])->default('inactive');

Так как у нас пока что нету важной информации в таблице, мы просто удалим всё и создадим по новой. Для этого в Artisan есть команда:

php artisan migrate:fresh

Теперь нам нужно создать "Policy" класс где будут храниться права для нашей модели "Page":

php artisan make:policy PagePolicy -m Page

Откроем созданный файл "app/Policies/PagePolicy.php" и отредактируем его:

<?php

namespace App\Policies;

use App\User;
use App\Page;
use Illuminate\Auth\Access\HandlesAuthorization;

/**
 * Class PagePolicy
 *
 * @package App\Policies
 */
class PagePolicy
{
    use HandlesAuthorization;

    /**
     * Determine whether the user can view the page.
     *
     * @param  User  $user
     * @param Page  $page
     *
     * @return bool
     */
    public function view(User $user, Page $page): bool
    {

        if ($page->status_id == 'public') {
            return true;
        }

        if ($user !== null && $page->owner_id === $user->id) {
            return true;
        }

        return false;

    }

    /**
     * Determine whether the user can create pages.
     *
     * @return bool
     */
    public function create(): bool
    {
        return auth()->check();
    }

    /**
     * Determine whether the user can update the page.
     *
     * @param  User  $user
     * @param  Page  $page
     *
     * @return bool
     */
    public function update(User $user, Page $page): bool
    {
        return $page->owner_id == $user->id;
    }

    /**
     * Determine whether the user can delete the page.
     *
     * @param  User  $user
     * @param  Page  $page
     *
     * @return bool
     */
    public function delete(User $user, Page $page): bool
    {
        return $page->owner_id == $user->id;
    }
}

Теперь адаптируем файл "app/Providers/AuthServiceProvider.php":

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use App\User;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        'App\Page' => 'App\Policies\PagePolicy',
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot(Gate $gate)
    {
        $this->registerPolicies();

        $gate::before(function (User $user) {

            if($user->isAdmin()) {
                return true;
            }

        });
    }
}

А также нашу модель "User" (app/User.php), добавив туда новый метод:

/**
     * @return bool
     */
    public function isAdmin(): bool {
        return (int) $this->is_admin;
    }

Теперь осталось отредактировать наш контроллер Pages (app/Http/Controllers/PagesController.php):

/**
     * PagesController constructor.
     */
    public function __construct()
    {
        $this->authorizeResource(Page::class);
    }

Добавим ссылку на редактирование

Откроем файл "resources/views/pages/show.blade.php" и добавим туда:

@can('update', $page)
    <div>
        <a href="/page/{{$page->slug}}/edit">Редактировать</a>
    </div>
@endauth

На этом пока всё, увидимся в следующей статье, где мы подключим HtmlPurifier и Markdown.

Посмотреть всё в виде коммита можно на Github: https://github.com/dignityinside/phpland_laravel/commit/04d62c676491745155654144a0c464b0d005e960


Оставьте комментарий!

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий:


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

Видео

Самые полезные видео на темы "веб-разработка", "Linux" и "IT". Смотри и обучайся!

Подробнее »

Сделки

Самые горячие и выгодные сделки, акции и скидки на видео-курсы, софт, услуги, книги и железо из всего рунета.

Подробнее »

Планета

Наша планета собирает интересные статьи из различных источников и объединяет их в одну ленту. Которую можно читать на нашем сайте.

Подробнее »

Сообщество

Наше сообщество славится своим дружелюбием и стремлением делиться приобретённым опытом с новыми веб-разработчиками и пользователями ОС Linux.

Любой желающий может совершенно свободно зарегистрироваться на нашем сайте и принять активное участия в жизни сообщества!

Подробнее »