Этот урок набрал набрал достаточно большое количество комментариев и дальнейшее его комментирование отключено. Если вы хотели убедиться в правильности выполнения ДЗ или у вас возник вопрос по уроку, посмотрите ранее добавленные комментарии, кликнув по кнопке ниже. Скорее всего вы найдете там то, что искали. Если это не помогло - задайте вопрос в чате в телеграме - https://t.me/php_zone
SBTesla 06.11.2018 в 10:38

файл 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 08.11.2018 в 10:34

Отлично!

Dram 20.01.2023 в 14:07

ivashkevich, что "отлично", роут же неверный! такой паттерн должен быть!

'~^articles/(\d+)/delete$~'

И вторая ошибка, при удалении нужно сообщения выводить через if/else

        if ($article) {
            $article->delete();
            echo ' Статья удалена';
        }else{
            echo ' Статьи с таким id не существует';
        }

а в описанном выше коде будут два срабатывания echo вне зависимости от результата!

Как вы проверяете домашку? ))

stokato 12.11.2018 в 00:26

Создайте роут для удаления статей - 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 12.11.2018 в 22:50

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

stokato 13.11.2018 в 09:24

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

ivashkevich 13.11.2018 в 22:09

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

Ilon 23.11.2018 в 14:37

ДЗ:
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 24.11.2018 в 21:42

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

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

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

if ($article)

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

dom1r 02.12.2018 в 13:28

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

ivashkevich 02.12.2018 в 22:52

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

excent63 24.03.2019 в 22:09

Вот решение д/з:
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 25.03.2019 в 11:39
if ($article) {

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

if ($article !== null) {
excent63 25.03.2019 в 11:45

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

Boodoo 26.04.2019 в 06:15

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 29.04.2019 в 11:30

Отлично!

Metey 21.07.2019 в 16:58
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 21.07.2019 в 19:20
$article = new Article();

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

Metey 21.07.2019 в 23:51

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

Metey 21.07.2019 в 23:53

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

ivashkevich 22.07.2019 в 15:57

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

Metey 23.07.2019 в 13:20

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

ivashkevich 23.07.2019 в 20:33

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

Iliusha99 29.07.2019 в 19:10
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 30.07.2019 в 09:04

Отлично

Moskva 04.08.2019 в 15:03

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 04.08.2019 в 21:05

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

khuurak 24.08.2019 в 20:14

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 25.08.2019 в 13:56

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

khuurak 25.08.2019 в 14:03

Хорошо )

artemship 25.08.2019 в 16:03

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 26.08.2019 в 06:50

Отлично

bratislavka21 28.08.2019 в 11:31

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

ivashkevich 28.08.2019 в 17:52

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

[email protected] 25.10.2019 в 13:35

Routes.php

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

ArticlesController.php

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

    if($article === null) {
        $this->view->renderHtml('errors/404.php', [], 404);
    return;
    } else {    
    $article->delete();
    echo 'Статья '.$articleId.' удалена!';
    }
}
ivashkevich 25.10.2019 в 16:12

Ок. Только нужно поправить отступы.

teroni 19.12.2019 в 10:24

когда мы удаляем строку в Бд, а потом добавляем новую строку то id идет не по порядку из-за того, что мы используем lastInsertId(), как это исправить?

ivashkevich 21.12.2019 в 20:03

Что значит не по порядку? Можно конкретный пример?

EugeneGrigoryev 25.01.2020 в 23:35

src/routes.php

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

src/MyProject/Models/ActiveRecordEntity.php

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

src/MyProject/Controllers/ArticlesController.php

    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 28.01.2020 в 18:44

Отлично

andreskrip 04.02.2020 в 17:17

Спасибо за урок!)
routes.php:

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

ArticlesController.php:

    public function delete(int $articleId): void
    {
        $article = Article::getById($articleId);
        if ($article === null) {
            $this->view->renderHtml('errors/NotFound.php', [], 404);
            return;
        }

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

ActiveRecordEntity.php:

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

Кстати, заметил один момент: при обращении по адресу /articles/несуществующий_id мы как положено отправляли 404 ошибку, но при обращении по адресу /articles/несуществующий_id/ уже был код 200 и выводилось сообщение из index.php:

if (!$isRouteFound) {
    echo 'Страница не найдена!';
    return;
}

В связи с эти я немного подправил наш главный статейный роут (добавил /? в конце):

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

Может быть это и не важно (а может и вообще неправильно), но решил на этом заострить внимание

ivashkevich 06.02.2020 в 03:11

Зачем слеш после id статьи? Не понял что вы хотите сделать и зачем.

andreskrip 11.02.2020 в 16:27

Я замечал что на разных сайтах урл по разному заканчивается, где-то есть слеш, где-то нет.

Слеш в конце урл - это моё предположение, что такая ситуация может случиться, и её нужно как-то обработать. Если это незачем - поправьте меня)

ivashkevich 12.02.2020 в 13:07

Просто так такой ситуации произойти не может. Если только на такой адрес не поставят ссылку.

andreskrip 12.02.2020 в 14:07

Понял, спасибо за разъяснение)

[email protected] 05.03.2020 в 20:16

ArticlesController.php

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

        if ($article === null) {
            echo 'Статьи с таким id не существует';
            return;
        }
        $article->delete();
        var_dump($article);
    }
ivashkevich 06.03.2020 в 05:58

Отлично

OneMoreTime 11.03.2020 в 16:48

ArticlesController.php

public function delete(int $articleId): void
    {
        $article = Article::getById($articleId);
        if(null === $article) {
            $this->view->renderHtml('errors/404.php',[], 404);
            return;
        }
        $article->delete();
        $this->view->renderHtml('successMessages/deleted.php',['articleId' => $articleId]);
        var_dump($article);
        return;
    }

ActiveRecordEntity.php

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

deleted.php

<?php
echo '<h2>The article #'.$articleId.' was successfully deleted</h2>';
ivashkevich 14.03.2020 в 19:51

Отлично

Dimitry 05.04.2020 в 07:45
//ArticleController
 public function delete(int $articleId){
        $article = Article::getById($articleId);
        if ($article === null) {
            $this->view->renderHtml('errors/404.php', [], 404);
            return;
        }
        $article->delete();
        vardump($article);
    }
ivashkevich 05.04.2020 в 19:19

Отлично!

[email protected] 15.04.2020 в 11:24

Роут

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

ArticlesController

  public function delete() : void
  {
    $pattern = '~^articles/(\d+)/delete$~';
    preg_match($pattern, $_GET['route'], $match);
    $articleId = $match[1];

    $article = Article::getById($articleId);

    if($article !== null)
    {
      $article->delete();
      var_dump($article);
    } else {
      echo 'Уупс, такой статьи не существует';
    }
  }
ivashkevich 15.04.2020 в 11:42

Отлично

Alexann 15.04.2020 в 14:00

routes.php:

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

ArticlesController.php:

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

        if ($article === null) {
            $this->view->renderHtml('errors/notId.php');
            return;
        }
        $article->delete();
        var_dump($article);
    }
...

notId.php:

<h2>Статьи с таким id не существует</h2>
<a href="/">Вернуться на главную станицу</a>
ivashkevich 15.04.2020 в 17:43

Логичнее будет назвать шаблон notFound, и раз уж он только для статей, это тоже нужно отразить в его названии/пути.

Alexann 15.04.2020 в 22:33

Согласен, но наверное лучше сделать его общим для разных объектов:
MyProject/errors/notFound.php:

<h2>Таких данных не существует</h2>
<a href="/">Вернуться на главную станицу</a>
ivashkevich 16.04.2020 в 07:00

Не факт. Возможно в нем просто стоит выводить переменную, которую вы будете передавать из контроллера? А в ней уже будет написано, чего именно не хватает.

Alexann 16.04.2020 в 11:29

Действительно так лучше. 404.php:

<h1><?= $error ?></h1>
<br>
<a href="/">Вернуться на главную страницу</a>

ArticleController.php:

...
if ($article === null) {
            $this->view->renderHtml('errors/404.php',
                ['error'=>'Не найдена такая статья'],404);
            return;
...

А с исключениями:

...
if ($article === null) {
            throw new NotFoundException('Не найдена такая статья');
        }
...
ivashkevich 16.04.2020 в 14:12

Отлично!

Fill 29.04.2020 в 09:22

src/routes.php

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

src/MyProject/Controllers/ArticleController.php

...
    public function delete(int $articleId): void
    {
        $article = Article::getById($articleId);
        if ($article === null) {
            $this->view->renderHtml('errors/NotFound.php', [], 404);
            return;
        }
        $article->delete();
        var_dump($article);
    }
...

templates/errors/NotFound.php

<?php include __DIR__ . '/../header.php'; ?>
<h1>Статьи с таким ID не существует</h1>
<?php include __DIR__ . '/../footer.php'; ?>
ivashkevich 29.04.2020 в 19:18

Отлично

Salexandr 11.05.2020 в 22:16

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);
    }

routes

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

Отлично

studentDev 13.05.2020 в 10:27
//routes
'~^articles/(\d+)/delete$~' => [\MyProject\Controllers\ArticlesController::class, 'articleDelete'],

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

//ArticlesController
public function articleDelete(int $articleId)
        {
            $article = Article::getById($articleId);

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

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

Исправил +

ivashkevich 14.05.2020 в 12:47

У нас же есть 404-исключение

Timurik 14.05.2020 в 17:52

src\routes.php

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

src\MyProject\Controllers\ArticlesController.php

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

src\MyProject\Models\ActiveRecordEntity.php

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

Отлично

[email protected] 14.05.2020 в 20:58

Роут

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

Метод контроллера для удаления статьи

public function delete(int $articleId)
{
    $article = Article::getById($articleId);
    if($article != null) {
        $article->delete();
        var_dump($article);
    }
    else{
        $this->view->renderHtml('errors/404.php', [], 404);
    }
}
ivashkevich 15.05.2020 в 18:27
if($article != null) {

Тогда уж строгое неравенство !==. Мало ли к чему так null приведется.

titelivus 19.05.2020 в 13:57

routes.php

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

ArticlesController.php

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

Output:

MyProject\Models\ArticlesArticle (object) [Object ID #7][5 properties]
     name:protected: (string) "Новое название статьи"
     text:protected: (string) "Новый текст статьи"
     authorId:protected: (string) "1"
     createdAt:protected: (string) "2020-05-17 16:27:55"
     id:protected: (null) NULL
ivashkevich 20.05.2020 в 07:53

Отлично

Sviatoslav 21.06.2020 в 20:11

routes.php
Добавлено:

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

ArticleController.php
Добавлено:

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

        if ($article) {
            $article->delete();
            echo "Статья успешно удалена.";
            var_dump($article);
            return;
        }

        echo "Такой статьи не существует!";
    }
ivashkevich 21.06.2020 в 20:44

Приучайте себя в первую очередь обрабатывать негативные кейсы. Если сначала проверить что статьи нет и вернуть в этом случае ошибку, основной поток не будет находиться в блоке условия и код будет выглядеть проще.

Sviatoslav 21.06.2020 в 23:04
public function delete(int $articleId): void
    {
        $article = Article::getById($articleId);

        if ($article == null) {
            echo 'Такой статьи не существует!';
            return;
        }

        $article->delete();
        echo 'Статья успешно удалена.';
        var_dump($article);   
    }

Так?
У меня если честно, вообще в последних 5-6 уроках домашка вызывает ступор. Сам с ходу сделать не могу. Если подсмотреть готовые решение, тогда все становиться понятно и логично и могу у себя такое же сделать. Немного руки опускаются. Ведь в 30 лет перейти в IT сферу и так не просто, а мне еще и ООП туго идет

ivashkevich 22.06.2020 в 07:13

Да, так.

Попробуйте уделять больше времени урокам в день, и заниматься каждый день хотя бы по часу. И не забывайте про алгоритмические задачки.

ivashkevich 21.06.2020 в 20:45

Строки пишутся в одинарных кавычках.

IePyton 25.06.2020 в 18:16

routes.php

<?php
return [
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
    '~^articles/(\d+)$~' => [\MyProject\Controllers\ArticlesController::class, 'view'],
    '~^articles/(\d+)/edit$~' => [\MyProject\Controllers\ArticlesController::class, 'edit'],
    '~^articles/add$~' => [\MyProject\Controllers\ArticlesController::class, 'add'],
    '~^articles/(\d+)/delete$~' => [\MyProject\Controllers\ArticlesController::class, 'delete']
];

ArticlesController.php

public function delete(int $articleId): void
    {
        $article = Article::getById($articleId);
        if ($article == null) {
            echo 'Статьи с таким ID не существует';
            return;
        }
        $article->delete();
        var_dump($article);
    }

ActiveRecordEntity.php

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

Отлично!

[email protected] 27.06.2020 в 13:00

ActiveRecordEntity

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

ArticlesController

public function delete(int $id)
    {
        $article = Article::getById($id);
        if ($article !== null) {
            $article->delete();
            echo 'Статья удалена';
            var_dump($article);
        } else {
            $this->view->renderHtml('errors/404.php', [], 404);
        }
    }
ivashkevich 27.06.2020 в 17:01

Отлично

HardBass 27.06.2020 в 16:36

routes.php

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

ArticlesController.php

        public function delete(int $articleId): void
        {
            $article = Article::getById($articleId);
            if ($article === null){
                $this->view->renderHtml('errors404.php', [], 404);
            }
            $article->delete();
            echo 'Статья удалена';
        }

ActiveRecordEntity.php

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

Если попытаться удалить несуществующую статью, будет ошибка.

HardBass 28.06.2020 в 09:19

ArticleController.php

  public function delete(int $articleId): void
        {
            $article = Article::getById($articleId);
            if ($article === null)
            {
                $this->view->renderHtml('errors404.php', [], 404);
            }
            else
            {
               $article->delete();
               echo 'Статья удалена';
            }
        }
ivashkevich 29.06.2020 в 11:05

Ок. Лучше поставить return после отрисовки 404-шаблона, и блок else не понадобится тогда.

Проблема с форматированием. Делайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L

Hellbound 29.07.2020 в 16:40

routes.php

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

ArticlesController.php

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

        if ($article === null) {
            $this->view->renderHtml('errors/404.php', [], 404);
        } else {
            $article->delete();
            echo 'Статья удалена';
            var_dump($article);
        }
ivashkevich 29.07.2020 в 17:55

Отлично

VitaliyB 19.08.2020 в 10:19

routes.php

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

ArticlesController.php

 public function delete($articleId)
    {

        $article = Article::getById($articleId);

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

    }
ivashkevich 19.08.2020 в 17:56

А почему не через исключение 404 ошибка реализована?

VitaliyB 27.08.2020 в 08:49

наверное, что на данном этапе мы ещё не проходили исключения)))

ivashkevich 27.08.2020 в 16:36

Ох, сорян)

ChelovekAndrey 29.08.2020 в 12:57

File routes.php

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

File ArticlesController.php

public function delete(int $articleId): void
    {
        $article = Article::getById($articleId);
        if($article === null){
            $this->view->renderHtml('errors/404.php', [], 404);
        }else{
        $article->deleteFromDb();
        echo 'Статья удалена';
        var_dump($article);
        }
    }

File ActiveRecordEntity.php

    public function deleteFromDb(): void
    {
        $sql = 'DELETE FROM ' . static::getTableName() . ' WHERE id=:id';
        $db = Db::getInstance();
        $db->query($sql,[':id' => $this->id], static::class);
        foreach ($this as $name => $value){
                $this->$name = null;
        }
    }
ivashkevich 29.08.2020 в 18:10

Отлично. Вообще, чтобы показать что объект не хранится в базе, достаточно удалить у него идентификатор.

Larisa 06.12.2020 в 21:17

routes.php

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

ArticlesController.php

 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);
    }

ActiveRecordEntity.php

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

Отлично!

SkSeMi 20.12.2020 в 23:23

My URL
http://phpzone3/articles/13/delete

файл ActiveRecordEntity.php

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

Не совсем поняно что происходит в этотм универсальном методе универсального класса. Особенно в части касаемо каким образом передается ид, и подставляется имя таблицы, которое каким то образом привязано к статик. Это и есть рефлексия?!

В файле ArticleController.php

....
    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);
        $article->delete();
        //  Здесь редирект на главную статью например с тутлипом что страница удалена или на все статьи страницу
        return;
    }
....

routing.php

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

Не совсем поняно что происходит в этотм универсальном методе универсального класса. Особенно в части касаемо каким образом передается ид, и подставляется имя таблицы, которое каким то образом привязано к статик. Это и есть рефлексия?!

Нет здесь рефлексии. Сущность, у которой вызывается метод, имеет и свойство id и метод getTableName. Вы же сами их добавляли ранее :)

pixel 30.12.2020 в 00:59

Артём сделал удаление однако у меня не получается приравнять id к null. Пишет must be int, null used

ActiveRecordEntity

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

ArticlesController

    public function delete(int $idArticle){
        $article = Article::getById($idArticle);
        if ($article === null) {
            $this->view->renderHtml('errors/notFound.php', [], 404);
            return;
        }
        $article->delete();
        var_dump($article);
    }

Что выводит var_dump

ivashkevich 04.01.2021 в 06:52

А в каком месте ругается? Что на той строке написано? Использовать -1 не оч корректно.

SkSeMi 20.01.2021 в 23:51

ArticlesController.php

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

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

        $this->view->renderHtml('articles/view.php', [
            'article' => $article
        ]);

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

Зачем-то save сначала делал чтобы сохранить изменения. Убедлся что запись в таблице статей с соответсвующим ид удаляется, что видно при обновлении страницы.
Но при этом создавалась новая запись. Отследил ошибку через var_dump.

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

ivashkevich 21.01.2021 в 06:23

Супер!

XXX 23.02.2021 в 21:42

ArticlesController

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

        echo 'Статья с таким id не существует';
    }
ivashkevich 28.02.2021 в 06:01

Отлично

Логические задачи с собеседований