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


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

Отлично!

demyanovpaul@yandex.ru 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 с конкретной ошибкой.

demyanovpaul@yandex.ru 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 нет.

aleh.mialeshka90@gmail.com 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

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

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