Чат 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 Patron 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 Patron 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

На здоровье)

OneMoreTime 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

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

Timurik Patron 30.04.2020 в 07:25

Спасибо за урок, очень интересный!
Хотел попросить, если имеется такая возможность, скинуть исходники предыдущего урока, чтобы можно было ещё раз построчно пробежаться по каждому изменению. До этого урока всё понимал быстро, а здесь почему-то мозг взрывается)

ivashkevich 30.04.2020 в 11:42

Сорян, не осталось исходников

Timurik Patron 30.04.2020 в 11:57

Ничего страшного, с 8-го урока пробегусь ещё раз всё руками забью, даже лучше усвою программу.

paskelas 29.05.2020 в 10:05

Так как создание самого этого класса нам не нужно, то делаем его абстрактным.

Может быть, не "создание класса не нужно" , а "создание объектов этого класса не нужно"? Класс-то создается в итоге, а его объекты нет.

ivashkevich 29.05.2020 в 12:52

Конечно да) Спасибо, исправил

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