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


ArtemijeKA 28.10.2018 в 09:50

Ооочень насыщенный. Как бы все переварить.

ivashkevich 28.10.2018 в 10:22

Да, тема не самая простая. Изучай в несколько подходов.

sirserik 03.03.2019 в 15:39

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

ivashkevich 03.03.2019 в 21:50

Привет. Репа тут - https://gitlab.com/ivashkevitch/myproject

Dram 17.05.2019 в 18:32

С сожалением должен признать что уроки превратились в ctrl C => ctrl V. Очень много материала вываливается за один урок, и я уже перестал что-то понимать сам. Да и домашки опять нет.
Если что-то неудачно скопировал - ошибку найти практически не возможно с нашим уровнем :((

ivashkevich 17.05.2019 в 21:56

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

andreskrip 30.01.2020 в 17:25

Переставайте делать ctrl+c=>ctrl+v. Пишите код от руки, так будете лучше и понимать что вы пишете и запоминать построение кода. Мне очень помогло еще на курсе php для начинающих. При этом я еще и конспект от руки веду, чтобы когда писал дополнительно в голове проговаривал и понимал/запоминал. :)

ashfedor 17.06.2019 в 14:08

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

sergey.demin1997@gmail.com 19.07.2019 в 01:41

Немного непонятки, почему при вардампе вот этого $article = Article::getById($articleId);
Он говорит что это обьект

ivashkevich 19.07.2019 в 07:03

А что там должно быть?

Metey 20.07.2019 в 22:11

отличный урок!!

Тема мне кажется тут ошибка в коде :
в этой строке <p>Автор: <?= $article->getAuthor()->getNickname() ?></p>
Должно же быть getAuthorId() вместо getAuthor() ?????

<?php include DIR . '/../header.php'; ?>
<h1><?= $article->getName() ?></h1>
<p><?= $article->getText() ?></p>
<p>Автор: <?= $article->getAuthor()->getNickname() ?></p>
<?php include DIR . '/../footer.php'; ?>

ivashkevich 21.07.2019 в 05:33

Нет, всё правильно. Посмотри внимательно на метод getAuthor.

Metey 22.07.2019 в 08:42

это я у себя тут что-то начудил, нашел ошибку)

Iliusha99 21.07.2019 в 16:23

Вроде как в коде понимаю, вижу что происходит, берет отсюда, идет там, потом обрабатываем и так далее, ошибки если что вроде разбираюсь где найти и что перезаписать, но, вот чтобы я сам такое сделал, чтобы взять и сказать: давайте так, нам нужно страничку, потом контроллер для нее чтобы работать с БД, потом наследоваться от ActiveRecord и многое такое, я по прежнему не могу сам писать((

ivashkevich 21.07.2019 в 19:18

Сможешь через несколько уроков, не бойся

vtolstov 03.10.2019 в 08:23

Вот это жееесть! Вроде осилил, но придется еще не раз это переосмыслить.

ivashkevich 03.10.2019 в 17:16

Изи, изи)

Pro100Bah 07.10.2019 в 17:02

Предыдущие вопросы сами собой отпали, но чтоб все это переварить, ладно справимся)))

P.S.
Прям кайфанул от урока)))

ivashkevich 07.10.2019 в 17:15

Еее!

prinzplanloser0514@gmail.com 08.10.2019 в 22:27

Что-то я пропустил

   public function main()
    {
        $articles = $this->db->query('SELECT * FROM `articles`;', [], Article::class);
        $this->view->renderHtml('main/main.php', ['articles' => $articles]);
    }
}

['articles' => $articles] вот этот момент зачем нам нужен?

ivashkevich 08.10.2019 в 22:34

Переменную в шаблон передаём таким образом. Этот массив потом попадает в функцию extract, перед подключением шаблона.

iluha22 29.10.2019 в 06:35

У меня после всех манипуляций на странице "http://newproj.loc/articles/2" вышла следующая ошибка:

Fatal error:
Uncaught TypeError:
Return value of MyProject\Models\ActiveRecordEntity::getById() must be an instance of MyProject\Models\ActiveRecordEntity or null, array returned in C:\OSPanel\domains\newproj.loc\src\MyProject\Models\ActiveRecordEntity.php:54 Stack trace: #0 C:\OSPanel\domains\newproj.loc\src\MyProject\Controllers\ArticlesController.php(20): MyProject\Models\ActiveRecordEntity::getById(2) #1 C:\OSPanel\domains\newproj.loc\www\index.php(30): MyProject\Controllers\ArticlesController->view(2) #2 {main} thrown in C:\OSPanel\domains\newproj.loc\src\MyProject\Models\ActiveRecordEntity.php on line 54

Вот и всё тут. И не могу найти где собака зарыта.

ivashkevich 29.10.2019 в 06:56

Ошибку не пробовал прочитать?

iluha22 29.10.2019 в 07:10

Вернутое значение getById должно быть экземпляром или нулем, массив получился в ActiveRecordEntity на 54 строке.
И про что это!? ))

 public static function getById(int $id): ?self
    {
        $db = new Db();
        $entities = $db->query(
            'SELECT * FROM `' . static::getTableName() . '` WHERE id=:id;',
            [':id' => $id],
            static::class
        );
// стр.54:
        return $entities ? $entities[0] : null;
    }
ivashkevich 29.10.2019 в 09:41

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

iluha22 29.10.2019 в 09:58

Потому что так в уроке было показано(!) :)

ivashkevich 29.10.2019 в 10:03

Дебаггер в руки и вперёд

iluha22 29.10.2019 в 12:05

Всё как всегда банально оказалось.
В подключении к дб осталась старая запись:

return $sth->fetchAll();

А должно было быть через классы:

return $sth->fetchAll(\PDO::FETCH_CLASS, $className);

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

ivashkevich 29.10.2019 в 12:32

Красава!

iluha22 29.10.2019 в 12:38

Та ваще капец, моск ломает нещадно... фуф...

ivashkevich 29.10.2019 в 13:08

Сам порешал, молодец. Учись читать ошибки, в них всё есть.

zeexo 22.11.2019 в 23:53

ivashkevich, спасибо за урок!
Всё доступно и понятно.
Подскажите, как расширить этот класс?
Например:

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

Как грамотно реализовать добавление дополнительных условий?
Например, вместо getById учитывать несколько условий: WHERE x = 'y' AND a = 'b' ORDER BY k DESC LIMIT n;

ivashkevich 23.11.2019 в 06:02

Судя по запросу вам требуется уже не способ достать по ID, а что-то другое. Просто добавляете в нужную сущность метод findByXAndA()

daneela 04.12.2019 в 21:55
 public function __set(string $name, $value)
    {
        $camelCaseName = $this->underscoreToCamelCase($name);
        $this->$camelCaseName = $value;
    }

    private function underscoreToCamelCase(string $source): string
    {
        return lcfirst(str_replace('_', '', ucwords($source, '_')));
    }

Эти два метода не работают в паттерне, из-за этого не могу вывести никнейм, в чем может быть проблема?Когда методы возвращаю в Article.php всё работает

ivashkevich 05.12.2019 в 14:53

Вы уверены, что понимаете, что такое паттерн?

daneela 05.12.2019 в 22:06

Ошибся, буду дальше изучать

ivashkevich 07.12.2019 в 19:50

С вопросом-то разобрались?) Если нет - напишите лучше в телегу или ВК.

zeexo 19.12.2019 в 01:42

А как можно реализовать findAllCount() по аналогии с findAll(), только запросом COUNT(*) ?
Собственно, получить количество записей таблицы, в рамках работы с ActiveRecord.

ivashkevich 19.12.2019 в 07:44

А в чём проблема? Вы же сами написали ответ на свой вопрос - запросом COUNT(*)

zeexo 19.12.2019 в 15:11

Вопрос в самой реализации кода в ActiveRecordEntity.php

Например код:

    public static function findAllCount(): array
    {
        $db = Db::getInstance();
        return $db->query('SELECT COUNT(*) FROM `' . static::getTableName() . '`;', [], static::class);
    }

Результат просто объект:

array(1) { [0]=> object(App\Models\Model)#8 (2) { ["id":protected]=> NULL ["cOUNT(*)"]=> string(3) "N" } }

Вопрос в том, как грамотно выводить просто число сразу из ActiveRecord при использовании:

Model::findAllCount(); //должно отдавать кол-во записей числом
ivashkevich 21.12.2019 в 20:07

Ну, начать стоит с того, почему вы выбрали тип static::class в качестве результата запроса? Вам ведь нужно только число, для чего его в объект запихивать? Пробовали погуглить по этой теме? Я вот погуглил и нашел ответ на второй позиции поисковика - тут.

andreskrip 30.01.2020 в 17:31

Спасибо большое за урок, получился очень интересным :)

И всё то, что я делал в комментариях к прошлому уроку оказалось в следующем уроке, правда удобнее и лаконичнее. Но зато класс User уже был готов)

ivashkevich 31.01.2020 в 13:18

На здоровье)

New 07.03.2020 в 13:33

1.

public function getAuthor(): User
    {
        return User::getById($this->authorId);
    }
<p>Автор: <?= $article->getAuthor()->getNickname() ?></p>

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

public function getAuthor (): string
    {
        return User::getById($this->authorId)->getNickname();
    }

а в шаблоне уже выводил

<p>Автор:<?= $article->getAuthor()?></p>

Посему у меня возник вопрос : А есть ли разница?

2. Есть ли случаи, когда НУЖНО применять не позднее, а именно раннее связывание? Если да, то можно какие-то примеры?

3. В примере всего две таблицы в БД и данные в них перемежаются, поэтому использован всего один, общий шаблон(и для статей и для юзеров) между БД и "основной программой", хотя в итоге по факту наследования этот шаблон делится уже на два отдельных. А если бы свойства/методы не перемежались у статей и узеров, это были бы отдельные шаблоны? Т.е. фактически для связи основной программы с отдельной таблицей в БД - отдельный шаблон? Префикс ActiveRecord - обязательный в названии класса-шаблона?

ivashkevich 09.03.2020 в 08:14
  1. Тогда название метода некорректно. Он возвращает не автора, а его никнейм.
  2. В любом случае, когда не нужно позднее. Пример: когда вам нужно обращаться к имени класса, в котором код был НЕ ВЫЗВАН, а НАПИСАН, будет использоваться self, а не static.
  3. CRUD-операции для всех сущностей почти всегда будут одинаковыми, поэтому код для работы с БД не требует каких-то особых изменений, в зависимости от конкретной сущности. ActiveRecord даёт нам явно понять какой именно паттерн используется для реализации ORM. Так просто понятнее и является правилом хорошего тона.
Ember 02.04.2020 в 14:35

А не является ли тут нарушением MVC то, что шаблон по сути обращается к модели за автором? По идее это же работа контроллера. Вьюха не должна знать откуда брать данные, ее задача же просто отобразить уже готовые из контроллера.

ivashkevich 02.04.2020 в 15:26

Если хотите, можете сделать и так. Здесь шаблон использует только получение свойства модели, это допустимо.

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