У меня главная работает а на статью перехожу такая ошибка:
Что это может быть?
Включил xdebug и решил проблему так:
// src/MVCExample/Controllers/ArticlesController.php
use \MVCExample\Models\Article;
и еще добавил туда Article::class в
public function view(int $articleId)
{
$result = $this->db->query(
'SELECT * FROM `articles` WHERE id = :id;',
[':id' => $articleId],
Article::class
);
...
}
А так-же конечно поменял метод вывода в шаблоне через геттер
getName();
getText();
// templates/articles/view.php
<?php include __DIR__ . '/../header.php'; ?>
<h1><?= $article->getName() ?></h1>
<p><?= $article->getText() ?></p>
<?php include __DIR__ . '/../footer.php'; ?>
Первый screenshot в описании метода _set по-моему не на месте.
По тексту мы только добавили в класс Article метод _set, который просто выводит на экран Свойство и Значение, без назначения переменных, а на screenshot-е: правильно (отсутствуют свойства author_id, created_at - мы их только печатаем) и неправильно (свойствам authorId, createdAt уже присвоены правильные значения).
Потому что в БД есть свои правила по именованию столбцов, а в PHP есть стандарты именования переменных PSR. И они разные) Преобразовывать имена полей - это нормально.
Когда пытаюсь вывести автора получаю Fatal error:Uncaught Error: Cannot use object of type MyProject\Models\Articles\Article as array in C:\OSPanel\domains\myproject.loc\src\MyProject\Controllers\ArticlesController.php on line 31
<?php
namespace MyProject\Controllers;
use MyProject\Models\Articles\Article;
use MyProject\Services\Db;
use MyProject\View\View;
class ArticlesController
{
private $view;
private $db;
public function __construct()
{
$this->view = new View(__DIR__ . '/../../../Templates');
$this->db = new Db();
}
public function view(int $articleId)
{
$result = $this->db->query(
'SELECT * FROM `articles` WHERE id = :id;',
[':id' => $articleId],
Article::class
);
var_dump($result);
if ($result == false){
$result = $this->view->renderHtml('errors/404.php', [], 404);
return;
}
$author = $this->db->query(
'SELECT nickname FROM `users` WHERE id = :id',
[':id' => $result[0]['authorId']],
Article::class
);
var_dump($author);
$this->view->renderHtml('articles/view.php', ['article' => $result[0]]);
}
}
Та же ошибка вылазит, уже xDebug запускал, что-то не помогло.
var_dump() прогонял не пойму, что нужно исправить((
Читал комментарии, тоже до ответа не дошел((
$result[0]['authorId']] //Что здесь не так?
view.php
<?php include __DIR__ . '/../header.php'; ?>
<h1><?= $article->getName() ?></h1> <!-- <h1><?//= $article['name'] ?></h1> Это сменили в Lesson18 -->
<p><?= $article->getText() ?></p> <!-- <p><?//= $article['text'] ?></p> Это сменили в Lesson18 -->
<p><i>Автор: <?= $author['nickname'] ?></i></p> <!-- Homework 17 -->
<?php include __DIR__ . '/../footer.php'; ?>
ArticlesController.php
<?php
namespace MyProject\Controllers;
use MyProject\Services\Db;
use MyProject\View\View;
use MyProject\Models\Articles\Article;
class ArticlesController
{
/** @var View */
private $view;
/** @var Db */
private $db;
public function __construct()
{
$this->view = new View(__DIR__ . '/../../../templates');
$this->db = new Db();
}
public function view(int $articleId)
{
$result = $this->db->query(
'SELECT * FROM `articles` WHERE id = :id;', [':id' => $articleId]
);
if ($result === []) {
$this->view->renderHtml('errors/404.php', [], 404); // Здесь обрабатываем ошибку
return;
}
$resultAuthor = $this->db->query(
'SELECT `nickname` FROM `users` WHERE id = :id',
[':id' => $result[0]['author_id']]
);
$this->view->renderHtml('articles/view.php', ['article' => $result[0], 'author' => $resultAuthor[0]]); //homework17
}
}
stdClass - standart Class?
Да.
У меня главная работает а на статью перехожу такая ошибка:

Что это может быть?
Включил xdebug и решил проблему так:
и еще добавил туда
Article::class
вА так-же конечно поменял метод вывода в шаблоне через геттер
Всё правильно сделал, так и надо было)
Подскажите, а нельзя ли выводить статью таким методом?
Через конкатенацию?
Ни в коем случае. Почитайте о SQL-инъекциях.
Все работает, только имя автора не выводится
Ну так его и нет в шаблоне сейчас =) Если хотите - добавьте.
Первый screenshot в описании метода _set по-моему не на месте.

По тексту мы только добавили в класс Article метод _set, который просто выводит на экран Свойство и Значение, без назначения переменных, а на screenshot-е: правильно (отсутствуют свойства author_id, created_at - мы их только печатаем) и неправильно (свойствам authorId, createdAt уже присвоены правильные значения).
Почему нельзя просто создать в классе переменный с таким же название как и в бд? Зачем создавать отдельную функцию?
Потому что в БД есть свои правила по именованию столбцов, а в PHP есть стандарты именования переменных PSR. И они разные) Преобразовывать имена полей - это нормально.
Когда пытаюсь вывести автора получаю Fatal error:Uncaught Error: Cannot use object of type MyProject\Models\Articles\Article as array in C:\OSPanel\domains\myproject.loc\src\MyProject\Controllers\ArticlesController.php on line 31
Ну переведите ошибку и всё станет понятно. В продвинутом курсе уже это надо самостоятельно делать.
Столкнулся с такой же проблемой. Не понимаю - где тут ошибка. Артём, помогите пожалуйста.
Написано, что объект класса Article нельзя использовать как массив. В $result объект! А вы ему $result[0]['authorId']]
Та же ошибка вылазит, уже xDebug запускал, что-то не помогло.
var_dump() прогонял не пойму, что нужно исправить((
Читал комментарии, тоже до ответа не дошел((
view.php
ArticlesController.php
Да потому что это объект! Как обращаются к свойствам объекта?
Подсказка: не через квадратные скобки.
Где то вы уже объясняли, не могу найти - зачем комментарии типа
/* @var string /
Только для PhpStorm - что-то он там при этом правильно подсвечивает?
Да, после этого он знает тип этой переменной и может давать полезные подсказки.
А почему у нас метод __set вызывается автоматом? underscoreToCamelCase понятно,он используется в другом методе,а __set почему.
Магический метод __set() - этот абзац читали?