динамическая загрузка классов - Попытка загрузить класс _CLASS_ из пространства имен _NAMESPACE_ - PullRequest
0 голосов
/ 22 января 2019

Поэтому я пытаюсь загрузить класс внутри службы в Symfony4.Не имеет значения, загружаю ли я его как classname или как App\to\class\name\classname.
. Выдает ту же ошибку.

В других сообщениях говорилось, что вам нужно добавить полностью полное имя класса.
Это не работаетЯ что-то пропустил?Код ниже:

<?php
// src/Service/AdwordsService.php
namespace App\Service;

use App\Service\AdTypes\ExpendedTextAdTypes as ExpendedTextAdTypes;

class AdwordsService{ 
    ...
    public function getAdsModel($ad) //<-- for example "EXPANDED_TEXT_AD"
    {
        $type = explode('_',strtolower($ad->getType()));
        $modelName = array_map('ucfirst', $type);
        $modelName = implode('',$modelName).'Types';
        // will load ExpandedTextAdTypes
        return new $modelName($ad);
    }
    ...
}

Класс, который он пытается загрузить:

<?php
// src/Service/AdTypes/ExpendedTextAdTypes.php
namespace App\Service\AdTypes;

class ExpendedTextAdTypes
{

    private $adData;

    public function __construct($ad)
    {
        $this->adData = $ad;
    }
}

1 Ответ

0 голосов
/ 22 января 2019

Конечная проблема (и) заключалась в простой опечатке: EXPANDED_TEXT_AD против EXPENDED_TEXT_AD вместе с необходимостью использования полного имени класса:

// No need for any use statements
// use App\Service\AdTypes\ExpendedTextAdTypes as ExpendedTextAdTypes;

public function getAdsModel($ad) //<-- for example "EXPENDED_TEXT_AD"
{
    $type = explode('_',strtolower($ad));
    $modelName = array_map('ucfirst', $type);
    $modelName = implode('',$modelName).'Types';
    $modelName = 'App\\Service\\AdTypes\\' . $modelName; // Add this
    return new $modelName($ad);
}

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

Название вопроса также вводит в заблуждение.Я нажал на вопрос, потому что я никогда не видел CLASS в сообщении об ошибке.Лучше было бы опубликовать фактическое сообщение об ошибке, что позволило бы легче обнаружить опечатку.

И, наконец, небольшой совет.Такое преобразование из EXPENDED_TEXT_AD в ExpendedTextAdTypes может быть сложным в обслуживании и определенно привязывает вас к схеме именования классов.Почему бы просто не использовать ExpendedTextAd вместо EXPENDED_TEXT_AD?Symfony делает такие вещи постоянно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...