Как правильно создать класс фабричным методом? В Laravel имею следующие классы:use Illuminate\Support\Str; interface IParser { public function get(); } class ParserFactory { public static function create($engine) { $class = Str::title($engine) . 'Parser'; return new $class; } } class FirstParser implements IParser { public function get() { echo 1; } } Создаю класс следующим образом:$engine = 'first'; $parser = ParserFactory::create($engine); В итоге получаю ошибку:FatalErrorException in Parser.php line 14: Class 'FirstParser' not found Если в фабричном методе написать:public static function create($engine) { $class = new FirstParser(); return $class; } То всё работает, класс создается. Не понимаю, почему с помощью new $class тоже самое не работает?
Проблема заключается в том, что метод Str::title() возвращает строку, начинающуюся с заглавной буквы, но не преобразует её в нижний регистр. Поэтому, когда вы пытаетесь создать класс с помощью new $class, PHP ищет класс с таким же именем, как результат метода Str::title(), который начинается со заглавной буквы.
Для исправления этой проблемы нужно преобразовать результат метода Str::title() в нижний регистр, а затем создать класс. Вот как это можно сделать:
class ParserFactory { public static function create($engine) { $class = Str::title($engine) . 'Parser'; $class = 'App\Models\\' . $class; // добавляем пространство имен к имени класса $class = app()->make($class); // создаем класс с помощью сервис-контейнера Laravel return $class; } }
Теперь ваш фабричный метод должен правильно создавать классы на основе переданного движка.
Проблема заключается в том, что метод Str::title() возвращает строку, начинающуюся с заглавной буквы, но не преобразует её в нижний регистр. Поэтому, когда вы пытаетесь создать класс с помощью new $class, PHP ищет класс с таким же именем, как результат метода Str::title(), который начинается со заглавной буквы.
Для исправления этой проблемы нужно преобразовать результат метода Str::title() в нижний регистр, а затем создать класс. Вот как это можно сделать:
class ParserFactory {public static function create($engine)
{
$class = Str::title($engine) . 'Parser';
$class = 'App\Models\\' . $class; // добавляем пространство имен к имени класса
$class = app()->make($class); // создаем класс с помощью сервис-контейнера Laravel
return $class;
}
}
Теперь ваш фабричный метод должен правильно создавать классы на основе переданного движка.