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


SBTesla

файл ActiveRecordEntity.php

     public function delete(): void
     {
         $db = Db::getInstance();
         $db->query('DELETE FROM `' . static::getTableName() . '` WHERE id = :id', [':id' => $this->id]);
         $this->id = null;

     }
     public static function getById(int $id) : ?self
     {
          $db = Db::getInstance();
          $entities = $db->query(
                'SELECT * FROM `' . static::getTableName() . '` WHERE id=:id;',
                [':id' => $id],
                static::class
          );
          return $entities ? $entities[0] : null;
     }

файл Route.php

'~^articles/delete/(\d+)$~' => [\MyProject\Controllers\ArticlesController::class, 'delete'],

файл ArticleController.php

    public function delete (int $id)
    {
        $article = Article::getById($id);
        if ($article) {
            $article->delete();
            echo ' Статья удалена';
        }

       echo ' Статьи с таким id не существует';

    }
ivashkevich

Отлично!

demyanovpaul@yandex.ru

Создайте роут для удаления статей - http://myproject.loc/articles/2/delete
При заходе на него получайте объект статьи по id и после этого удаляйте статью. Если статьи с таким id нет, то выдавайте соответствующее сообщение. Если же статья была, то выводите объект с помощью var_dump после удаления.

//notObject.php
<h1>Статья не существует, либо удалена</h1>

//ArticlesController.php
public function delete(int $articleId): void
{
        $article = Article::getById($articleId);

        if ($article === null) {
            $this->view->renderHtml('errors/notObject.php', [], 404);
            return;
        }
        $article->delete();

        var_dump($article);
}
ivashkevich

Супер! Шаблон можно назвать NotFound, и передавать в него переменную error с конкретной ошибкой.

demyanovpaul@yandex.ru

Спасибо, доделаю.

ivashkevich

Это необязательно, но будет круто, если сделаешь!

Ilon

ДЗ:
routes.php

'~^articles/(\d+)/delete$~' => [\MyProject\Controllers\ArticlesController::class, 'delete']

ArticlesController.php

public function delete(int $articleId): void
    {
        $article = Article::getById($articleId);

        if($article){
            $article->delete();
            echo "<p>Молодец, ты удалил статью !</p>";
            echo '<pre>';
            var_dump($article);
            echo '</pre>';
        }else {
            $this->view->renderHtml('errors/PageNot.php', [], 404);
        }
    }

PageNot.php

<title>Как ты нашел эту страницу ?!</title>
<p>Такая статья не существует!</p>
ivashkevich

Не надо в контроллерах HTML-тегов. Заведите отдельный шаблон для случая успешного удаления статьи.

Шаблон для отсутствующей страницы лучше назвать NotFound.

Вот так проверять:

if ($article)

плохо. Лучше сравнивать, что переменная !== null, или что значение является объектом какого-то класса (при помощи instanseof).

dom1r

После удаление статьи, если добавить новую, то в БД id присваивается следующий номер после удаленной, а не по порядку. Хотя в поле id стоит auto_increment, так и должно быть?
http://s1.radikali.ru/uploads/2018/12/2/5857e823d14c9bfc9790ffb029fa2ef2-full.png

ivashkevich

Да, база просто хранит последний использованный id отдельно, и шагает именно от него.

excent63

Вот решение д/з:
ArticlesController.php

...
public function delete(int $id)
    {
        $article = Article::getById($id);

        if ($article) {
            $article->delete();
            $this->view->renderHtml('articles/delete.php');
        } else {
            $this->view->renderHtml('errors/notFound.php',[], 404);
        }
    }
...

Роут

...
'~^articles/(\d+)/delete$~' => [\MyProject\Controllers\ArticlesController::class, 'delete']
...

delete.php

<?php include __DIR__ . '\..\header.php' ?>
<h1>Статья удалена</h1>
<?php include __DIR__ . '\..\footer.php' ?>

notFound.php

<?php include __DIR__ . '\..\header.php' ?>
<h1>Страницы не сущетвует</h1>
<?php include __DIR__ . '\..\footer.php' ?>
ivashkevich
if ($article) {

Лучше более явно проверять:

if ($article !== null) {
excent63

Понял, спасибо!

Boodoo

ArticleController.php

public function delete(int $articleId)
{
    $article = Article::getById($articleId);

    if($article == null) {
        echo 'Статья не найдена';   
    } else {
        $article->delete();
        echo 'Статья удалена.';
        var_dump($article);
    }

}

routes.php

'#^articles/(\d+)/delete$#' => [MyProject\Controllers\ArticlesController::class, 'delete']
ivashkevich

Отлично!

Metey
public function delete($id): void
    {
        $article = new Article();
        $article = $article->getById($id);
        if ($article !== null) {
            $article->delete();
            var_dump($article);
        } 
        else {
            $this->view->renderHtml('errors/404.php', [], 404);
        }
    }
ivashkevich
$article = new Article();

А это для чего?

Metey

так ведь метод же нужно брать от созданного объекта?? иначе то ошибку выдает, или можно как то иначе?

Metey

аа, понял он статический и можно вот так Article::getById($articleId); )))

ivashkevich

Нужно, а не можно) Статические методы для этого и нужны

Metey

все таки есть некоторая каша в голове по поводу того почему нельзя везде делать статические или динамические только, как понять где статику ставить а где нет?

ivashkevich

Статика применяется тогда, когда объектов нет. Например, для их создания. Но не только. В целом, если уже есть объект, то стоит использовать динамические методы.

Iliusha99
public function delete(int $articleId): void //delete a record from Data Base
    {
        $article = Article::getById($articleId);

        if ($article === null) {
            $this->view->renderHtml('errors/404.php', [], 404);
            return;

        }
        $article->delete();
        var_dump($article);
    }

route: '~^articles/(\d+)/delete$~' => [ArticlesController::class, 'delete']

После удаления:
object(MyProject\Models\Articles\Article)[4]
  protected 'name' => string 'Новое название статьи' (length=40)
  protected 'text' => string 'Новый текст статьи' (length=34)
  protected 'authorId' => string '1' (length=1)
  protected 'createdAt' => string '2019-07-29 18:43:05' (length=19)
  protected 'id' => null

Если обновить страницу или прописать адрес с Id которого в базе нет - будет ошибка 404.
ivashkevich

Отлично

Moskva

routes.php

'~^articles/(\d+)/delete~' => [\MyProject\Controllers\ArticlesController::class, 'del'],

ArticlesController.php

public function del(int $articleId): void
    {
        $article = Article::getById($articleId);

        if($article !== null) {
            $article->delete();
            var_dump($article);
        } else {
        $this->view->renderHtml('errors/NotFound.php', [], 404);
        return;
        }
    }

NotFound.php

Статья не существует или удалена.
ivashkevich

Что за del?) Называйте понятно

khuurak

ArticleController.php

public function delete(int $articleId): void
    {
        $article = Article::getById($articleId);

        if(is_null($article)) {
            $this->view->renderHtml('errors/notfound.php', [], 404);
            return;
        }

        $article->delete();

        var_dump($article);
    }

notfound.php
...
<h2>Извините, этой статьи не существует!!</h2>
...

ivashkevich

Не используйте is_null. Или сравнивайте с null явно, или проверяйте через instanceof.

khuurak

Хорошо )

artemship

routes.php:

'~^articles/(\d+)/delete$~' => [\MyProject\Controllers\ArticlesController::class, 'delete']

ArticlesController:

    public function delete(int $articleId): void
    {
        $article = Article::getById($articleId);

        if ($article === null) {
            $this->view->renderHtml('errors/404.php', [], 404);
            return;
        }

        $article->delete();
        var_dump($article);
    }
ivashkevich

Отлично

bratislavka21

Привет, Артем. Я не очень понял зачем в src/MyProject/Models/ActiveRecordEntity.php в конце метода delete() обращать свойство id в null ($this->id = null)? Ведь все равно в результате работы этого метода строка с таким id будет удалена из базы данных, зачем дополнительно уничтожать id у объекта-то?

ivashkevich

Объект должен отражать состояние строки в таблице. Если строки нет, то и id у объекта быть не должно. Если у этого объекта теперь вызвать метод save(), то создастся новая запись. Если же id объекта перед этим не очистить, то будет выполнен запрос в базу с типом UPDATE, из-за чего возникнет ошибка, так как записи с таким id нет.

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