Чат Telegram
Группа ВКонтакте
Новый комментарий


Kirill.K

ArticlesController:

...
if ($this->user->getRole() !== admin) {
            throw new Forbidden();
        }
...

Templates\errors\403:

<?php include __DIR__ . '/../header.php'; ?>
    <h1>Для добавления статьи нужно обладать правами администратора</h1>
<?php include __DIR__ . '/../footer.php'; ?>

Index:

catch (\MyProject\Exceptions\Forbidden $e) {
    $view = new \MyProject\View\View(__DIR__ . '/../templates/errors');
    $view->renderHtml('403.php', ['error' => $e->getMessage()], 403);
}
ivashkevich

Хорошо, но в Templates\errors\403 стоит выводить переменную error в шаблоне, а не хардкодить текст ошибки.

А для проверки того, является ли юзер админом можно создать в модели User метод isAdmin, который будет это проверять:

if(!$user->isAdmin()) {
...
Kirill.K

Так?:
User:

 public function isAdmin(): bool
    {
        return $this->role === admin;
    }

ArticlesController:

if(!$this->user->isAdmin()) {
            throw new Forbidden('Для добавления статьи нужно обладать правами администратора');
        }

Templates\errors\403:

<?php include __DIR__ . '/../header.php'; ?>
<?= $error ?>
<?php include __DIR__ . '/../footer.php'; ?>
ivashkevich

Perfect!

Kirill.K

Ещё хотел спросить - при отображении ошибки наша шапка с ником юзера слетает. Куки живы, но отсутствует объект $user, от наличия которого у нас зависит вывод. Как бы это исправить, не могу додуматься?

ivashkevich

На странице с ошибкой не нужны данные о пользователе. Ошибка - это ошибка, больше ничего быть там не должно.

Kirill.K

Хорошо) Но тогда нужно сделать отдельный HeaderForErrors:

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Мой блог</title>
    <link rel="stylesheet" href="/styles.css">
</head>
<body>

<table class="layout">
    <tr>
        <td colspan="2" class="header">
            Мой блог
        </td>
    </tr>
    <tr>
        <td>

А то наш базовый предлагает войти или зарегистрироваться при выводе ошибки

ivashkevich

Да, можно так.

tomsonst
ArticlesController.php

if ($this->user->getRole !== 'admin') {
            throw new Forbidden();
        }

index.php

catch (\MyProject\Exceptions\Forbidden $e) {
    $view = new \MyProject\View\View(__DIR__ . '/../templates/errors');
    $view->renderHtml('403.php', ['error' => $e->getMessage(), 'user' => UsersAuthService::getUserByToken()], 403);
}

Создаем файл Forbidden.php и создаем шаблон 403.php

ivashkevich

Хорошо

excent63

Добрый день! д/з:

ArticlesController.php

public function add(): void
{
    if ($this->user === null) {
        throw new UnauthorizedException();
    }

    if ($this->user->getRole() !== 'admin') {
        throw new  ForbiddenException('У вас нет прав, за помощью обратитесь к администратору!');
    }
...

403.php

<?php include __DIR__ . '/../header.php'; ?>
    <strong><?= $error ?></strong>
<?php include __DIR__ . '/../footer.php'; ?>

index.php

...
 catch (\MyProject\Exceptions\ForbiddenException $e) {
    $view = new MyProject\View\View(__DIR__ . '/../templates/errors');
    $view->renderHtml('403.php', ['error' => $e->getMessage(), 'user' => \MyProject\Services\UsersAuthService::getUserByToken()], 403);
}
ivashkevich

Отлично! У юзера можно завести отдельный метод:

public function isAdmin(): bool
{
    return $this->getRole() === 'admin';
}
excent63

Вот дошёл уже до 31 урока, вроде задачи в домашках понятны, пока получается их решить))) Но вот не совсем доходит момент, когда нужно создать отдельный метод или какой тип этот метод должен отдать) Немного не понятно где создать тот или иной метод, видимо где то недочитал или недопонял) Надо как то оптимизировать своё обучение или начинать доводить блог до ума чтобы началось включение воображения, побольше практики или вернуться к началу и перечитать все по новой )))

ivashkevich

Все придет с практикой, не переживай.

excent63

Будем стараться) Главное что есть кому задать вопрос и получить на него правильный ответ! Спасибо за обучение!)

ivashkevich

Пожалуйста)

Metey

Вначале сделал, а затем учел некоторые рекомендации и немного переделал:
в index добавил ловлю эксепшнов:

catch (\MyProject\Exceptions\ForbiddenException $e) {
    $view = new \MyProject\View\View(__DIR__ . '/../templates/errors');
    $view->renderHtml('403.php', ['error' => $e->getMessage()], 403);
}

добавил метод isAdmin в User.php :

public function isAdmin(): bool
    {
        return $this->role === 'admin';
    }

и в метод ArticlesController add() :

if ($this->user === null) {
            throw new UnauthorizedException();
        }
        if (!$this->user->isAdmin()) {
            throw new ForbiddenException('Для доступа к данной странице необходимы права администратора!');
        }
........

сделал отдельно headerError.php и в нем изменил это :

<tr>
        <td colspan="2" style="text-align: right"> 
            <a href="/users/login">Войти как администратор</a> |
            <a href="/users/register">Зарегистрироваться</a>
        </td>
    </tr>
ivashkevich

А для чего headerError.php? Не вижу, чтобы он где-то использовался.

Metey

забыл сюда вставить шаблон 403.php

<?php include __DIR__ . '/../headerError.php'; ?>
    <h1><?= $error ?></h1>
<?php include __DIR__ . '/../footer.php'; ?>
ivashkevich

Так ведь, то что прав нет, ещё не означает, что пользователя надо просить войти. Ну да ладно, это уже вопрос бизнес логики. В целом ок.

Metey

понял)) спасибо, возьму на заметку

Iliusha99
Articles Controller:
if ($this->user->getRole() !== 'admin'){
            throw new AccessForbidden('Forbidden', 403);
        }

User Model:
public function getRole(): string
    {
        return $this->role;
    }

index.php:
...
catch (AccessForbidden $e) {
    $view = new View(__DIR__ . '/../templates/errors');
    $view->renderHtml('403.php', ['error' => $e->getMessage()], 403);
}
ivashkevich

Норм. Но проверку на то, что юзер админ стоит проверять на уровне модели. Для этого стоит завести в ней метод isAdmin(): bool

Moskva

User.php

...
    public function IsAdmin(): bool
    {
        return $this->role === 'admin';
    }
...

ArticlesController.php

public function add(): void // добавление статьи в БД
    {
        if($this->user === null){
            throw new UnauthorizedException();
        }
        if(!$this->user->IsAdmin()){
            throw new ForbiddenException();
        }
...

index.php

...
} catch (\MyProject\Exceptions\ForbiddenException $e){
    $view = new \MyProject\View\View(__DIR__ . '/../templates/errors');
    $view->renderHtml('403.php', ['error' => $e->getMessage(), 'user' => \MyProject\Services\UsersAuthService::getUserByToken()], 403);
}

403.php

<?php include __DIR__ . '/../header.php'; ?>
<h1>У вас нет прав администратора.</h1>
<?php include __DIR__ . '/../footer.php'; ?>
ivashkevich
public function IsAdmin(): bool

Имена методов пишутся с маленькой буквы.

В остальном все хорошо.

Reechniy
index:

 catch (\MyProject\Exceptions\ForbiddenException $e) {
    $view = new \MyProject\View\View(__DIR__ . '/../templates/errors');
    $view->renderHtml('403.php', ['error' => $e->getMessage()], 403);
}
 User:

 public function isAdmin(): bool
    {
        return $this->role === 'admin';
    }

AticleController:

        if(!$this->user->isAdmin()) {
            throw new ForbiddenException('Недостаточно прав, для добавления статьи');
        }

        $this->view->renderHtml('articles/add.php');
        return;
    }

Создал исключение ForbiddenException.php и 403.php как у всех
ivashkevich

Отлично

artemship

User:

    public function isAdmin(): bool
    {
        return $this->role === 'admin';
    }

ArticlesController:

    public function add(): void
    {
        if (!$this->user->isAdmin()) {
            throw new ForbiddenException('Статьи могут добавлять только администраторы');
        }
    ...

index.php:

} catch (ForbiddenException $e) {
    $view = new View(__DIR__ . '/../templates/errors');
    $view->renderHtml('403.php', [
        'error' => $e->getMessage(),
        'user' => UsersAuthService::getUserByToken()
    ], 403);
}

403.php:

<?php include __DIR__ . '/../header.php'; ?>
    <h1>Недостаточно прав</h1>
    <?= $error ?>
<?php include __DIR__ . '/../footer.php'; ?>
ivashkevich

Супер

Онлайн обучение PHP
Путь с полного нуля до джуниора!
Начать бесплатно
Логические задачи с собеседований