Как исправить «Вы забыли выражение« use »[...]» в Symfony только при использовании статических методов? - PullRequest
0 голосов
/ 16 июня 2019

С помощью инфраструктуры Symfony я пытаюсь использовать один из моих классов Model (в частности, оболочку Contao для Doctrine ORM), чтобы выгрузить некоторые вещи в мою базу данных.

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

Attempted to load class "GenericModel" from the global namespace. Did you 
forget a "use" statement for "correct\namespace\GenericModel"?

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

Как я могу изменить свой код, чтобы использовать статические функции?Если я пропустил важную информацию, пожалуйста, дайте мне знать.

use correct\namespace\GenericModel;

class GenericClass {
    public function doThing() {
        $genericModel = new GenericModel(); // this works as expected
        $genericModel->setRow([
            'field1' => 'banana',
            'field2' => 'strawberry'
        ]);
        $genericModel->save();

        GenericModel::findBy('field1','banana'); // this line causes the error
    }
}

1 Ответ

1 голос
/ 16 июня 2019

Я нашел решение проблемы здесь:

https://community.contao.org/de/showthread.php?68881-Symfony-bundle-Model-ClassNotFoundException

Это на немецком языке, поэтому я кратко расскажу о механике проблемы.

Статический метод findBy вызывает метод в Collection, который вызывает функцию с именем класса переменной. Имя класса в этом случае 'GenericModel'. Поскольку GenericModel не находится в глобальном пространстве имен, я получаю вышеупомянутую ошибку.

Решение состоит в том, чтобы зарегистрировать имя класса в конфигурации Contao.

$GLOBALS['TL_MODELS']['table_name'] = 'namespace\GenericModel';  
...