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


Sparkqy 29.09.2018 в 16:05
Warning: require_once(E:\OSPanel\domains\myproject.loc\www/../src/http\Exception\InvalidArgumentException.php): failed to open stream: No such file or directory in E:\OSPanel\domains\myproject.loc\www\index.php on line 16

Fatal error: require_once(): Failed opening required 'E:\OSPanel\domains\myproject.loc\www/../src/http\Exception\InvalidArgumentException.php' (include_path='.;e:/ospanel/modules/php/PHP-7.2-x64;e:/ospanel/modules/php/PHP-7.2-x64/PEAR/pear') in E:\OSPanel\domains\myproject.loc\www\index.php on line 16

Подскажи, пожалуйста, в чем может быть проблема? Никаких typo в коде нет, не могу понять что не так

Sparkqy 29.09.2018 в 16:08

Возникает на этапе обработки исключения в UsersController (в уроке это когда мы делали валидацию на наличие данных в nickname, email, password) при нажатии на submit

ivashkevich 30.09.2018 в 10:53

полный путь до исключения (неймспейс + имя класса) не прописан в классе через use. скорее всего, даже шторм выделяет цветом неопределенный класс.

Sparkqy 30.09.2018 в 12:11

В контроллере есть use MyProject\Exceptions\InvalidArgumentException, если ты об этом

Sparkqy 30.09.2018 в 19:41

Оказалось, что нужно было бросать исключение вот так:

if (empty($userData['nickname']))
       {
           throw new \MyProject\Exceptions\InvalidArgumentException('Не передан никнейм');
       }
ivashkevich 02.10.2018 в 21:45

Можно и так, но вы должны понимать: можно (и нужно) просто добавить его через use в том классе, в котором оно бросается и где оно ловится. И это относится не только к исключениям, но и вообще к любым классам.

ilyaOrlov 01.12.2018 в 22:11

Подскажите, пожалуйста

public function signUp()
{
    if (!empty($_POST)) {
        try {
            $user = User::signUp($_POST);
        } catch (InvalidArgumentException $e) {
            $this->view->renderHtml('users/signUp.php', ['error' => $e->getMessage()]);
            return;
        }

        if ($user instanceof User) {
            $this->view->renderHtml('users/signUpSuccessful.php');
            return;
        }
    }

    $this->view->renderHtml('users/signUp.php');
}

После всех условий, мы рендерим страницу. Дело в том, что у меня она рендерится дважды. А без последнего рендеринга всё ок. Что это может быть? Либо он и не нужен, а я туплю?

ivashkevich 02.12.2018 в 09:51

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

prognoz 24.08.2019 в 19:33

У меня тоже самое. Почему-то такое часто возникает. Если условие поменять, то все отработает.

public function signUp()
    {
        if (!empty($_POST)) {
            try {
                $user = User::signUp($_POST);
            } catch(InvalidArgumentException $e) {
                $this->view->renderHtml('users/signUp.php', ['error' => $e->getMessage()]);
                return;
            }

            if ($user instanceof User) {
                $this->view->renderHtml('users/signUpSuccessful.php');
            }
        } else {
            $this->view->renderHtml('users/signUp.php');
        }

    }
ivashkevich 25.08.2019 в 13:44

Смотрите отладчиком. Магии тут никакой нет)

alepawka 07.01.2019 в 14:25
Warning: ReflectionObject::__construct() expects parameter 1 to be object, null given in E:\Programs\OSPanel\domains\dz.ru\src\MyProject\Models\ActiveRecordEntity.php on line 108

Fatal error: Uncaught Error: Internal error: Failed to retrieve the reflection object in E:\Programs\OSPanel\domains\dz.ru\src\MyProject\Models\ActiveRecordEntity.php:109 Stack trace: #0 E:\Programs\OSPanel\domains\dz.ru\src\MyProject\Models\ActiveRecordEntity.php(109): ReflectionClass->getProperties() #1 E:\Programs\OSPanel\domains\dz.ru\src\MyProject\Models\ActiveRecordEntity.php(102): MyProject\Models\ActiveRecordEntity->refresh() #2 E:\Programs\OSPanel\domains\dz.ru\src\MyProject\Models\ActiveRecordEntity.php(60): MyProject\Models\ActiveRecordEntity->insert(Array) #3 E:\Programs\OSPanel\domains\dz.ru\src\MyProject\Models\Users\User.php(90): MyProject\Models\ActiveRecordEntity->save() #4 E:\Programs\OSPanel\domains\dz.ru\src\MyProject\Controllers\UsersController.php(22): MyProject\Models\Users\User::signUp(Array) #5 E:\Programs\OSPanel\domains\dz.ru\www\index.php(29): MyProject\Controllers\UsersController->signUp() #6 {main} thrown in E:\Programs\OSPanel\domains\dz.ru\src\MyProject\Models\ActiveRecordEntity.php on line 109 

Помогите пожалуйста разобраться с этой ошибкой
ivashkevich 07.01.2019 в 16:03

На строке 108 ожидается объект, а прилетает null.

alepawka 07.01.2019 в 20:02

строка 108 - это в функции refresh(), а именно
$reflector = new \ReflectionObject($objectFromDb);
почему то на эту строку ругается при регистрации пользователя.
Проверял запрос в бд, все верно, В остальных файлах тоже все норм. С чем может связано?

ivashkevich 07.01.2019 в 21:45

В $objectFromDb - null. Дебажьте, разбирайтесь.

alepawka 08.01.2019 в 12:41

спасибо большое!
оказалось у меня в таблице и в классе другие названия столбцов.
Весь день убил, но зато код почти наизусть выучил :D

ivashkevich 09.01.2019 в 21:27

Красава, что разобрался! =)

Iliusha99 30.07.2019 в 17:41

Один из самых динамических уроков, спасибо за вашу работу :3

ivashkevich 30.07.2019 в 18:27

Пожалуйста) Рад, что понравилось)

artemship 26.08.2019 в 16:36

Присоединяюсь! Отличный урок, спасибо!

andreskrip 11.02.2020 в 20:39

Спасибо за урок! Подскажите, пожалуйста, для чего в методе findOneByColumn в sql-запросе мы устанавливаем LIMIT 1?

ivashkevich 12.02.2020 в 13:09

Чтобы ограничить выборку единственным значением.

New 17.03.2020 в 18:01

Есть несколько вопросов:
1. путь в атрибуте action в шаблоне для регистрации:

<?php include __DIR__ . '/../header.php'; ?>
    <div style="text-align: center;">
        <h1>Регистрация</h1>
        <form action="/users/register" method="post">
            <label>Nickname <input type="text" name="nickname"></label>
            <br><br>
            <label>Email <input type="text" name="email"></label>
            <br><br>
            <label>Пароль <input type="password" name="password"></label>
            <br><br>
            <input type="submit" value="Зарегистрироваться">
        </form>
    </div>
<?php include __DIR__ . '/../footer.php'; ?>

Я так понимаю, что в данном случае это равносильно:

action = ""

Смущает сама форма записи - тут и не название скрипта и перемешано register c signUp, может хотя бы для примера нужно было оставить одноименные названия - и в названии файла шаблона и в пути - или register или signUp. До этого встречались только названия файлов со скриптами в этом атрибуте, ну или путь к этому файлу. В общем - относительно этого момента получилась каша в голове... Можно прояснить этот момент?

2. проверка ника на корректность.

if (!preg_match('/[a-zA-Z0-9]+/', $userData['nickname'])) {
        throw new InvalidArgumentException('Nickname может состоять только из символов латинского алфавита и цифр');
    }

Что-то меня смущает, что никто не задал этот вопрос в комментариях..
Я ошибаюсь, или действительно эта проверка не корректная? Мне кажется, что должно быть в регулярке вот так:

/^[a-zA-Z0-9]+$/

3. if ($result === [])

public static function findOneByColumn(string $columnName, $value): ?self
{
    $db = Db::getInstance();
    $result = $db->query(
        'SELECT * FROM `' . static::getTableName() . '` WHERE `' . $columnName . '` = :value LIMIT 1;',
        [':value' => $value],
        static::class
    );
    if ($result === []) {
        return null;
    }
    return $result[0];
}

Тут же равнозначно проверять на null или empty? Почему в уроке именно такая проверка?

4. Регистрозависимая проверка имени пользователя.
Собственно изначально - корректно ли в контексте иметь регистрозависимые ники? С другой стороны, ситуации разные есть, и касаться это может не только ников. Поэтому второй вопрос - на какой стороне необходимо(оптимальнее) озадачиваться этим нюансов - в БД делать регистрозависимые поля или указывать при запросе в БД?

ivashkevich 18.03.2020 в 05:12
  1. Мой совет - не оставляйте action пустым, это поможет избежать ошибок. По поводу нэйминга - да, пожалуй, так будет лучше. Каши в голове у вас быть не должно. Имя шаблона указывается при рендеринге и никак не связано с роутом. Оно может быть каким угодно. Делать его таким же как и роут - решать вам.
  2. Отлично! Глаз-алмаз) Исправил урок, спасибо.
  3. Нет, с null сравнивать некорректно. ->query вернет массив подходящих записей. Если их нет, значит будет пустой массив, и только так.
  4. Тут уж как вам хочется =) Разницы с точки зрения технических ограничений нет.
Логические задачи с собеседований