Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Сам текст задачи вот такой
Будем считать, что директория . корень проекта Laravel 5.4
Для Laravel 5.4 написать сервис, отдельным модулем,
который возможно проинсталлировать через composer из локальной директории в vendor из дериктории ../vendor/objects
При публикации сервиса через artisan vendor: publish в дериктории конфигураций laravel должен создаться конфиг objects.php
Сервис должен быть доступен через алиас "Objects" фасада сервиса
Сервис имеет метод make - возвращающий объекты типа класса из конфига objects.php
В конфиг objects.php будут вноситься различные значения '{Наименование}'' => [class => '{Класс}', age => {Возраст}], например 'Dog' => ['class' => \Examples\Dogs::class, 'age' => 7 ], 'Cat' => ['class' => \Examples\Cats::class, 'age' => 3 ],
где все классы обязаны иметь методы age() возвращающие соответствующее значение из age - конфига в соответствии с классом, и class() возвращающие строку с наименованием класса объекта в котором вызван
Сервис не может создать объект, у класса которого отсутствуют обязательные методы.
Если запросить не существующий в конфиге класс, должно быть брошено исключение класса \Examples\ObjectsMakeException::class
Тесты в php artisan tinker:
$dog = Objects::make('Dog'); \\$dog объект класса \Examples\Dogs
$dog->age(); \\Должен вернуть 7
Objects::make('Cat')->age(); \\Должен вернуть 3
Objects::make('Cat')->class(); \\Должен вернуть (String) '\Examples\Cats'
Objects::make('Human'); // ObjectsMakeException
Насколько я понимаю, нужно действовать вот так:
1. Создать в корне папку packages, в которой будет весь код пакета
2. Создать там сервис провайдер, который будет регистрировать весь пакет
3. Создать абстрактный класс Object, который будет содержать абстрактные методы age и class
4. Наследовать все классы, которые заданы в конфиге от этого Object...
...
Как то дальше не соображу
Не в сети
Судя по заданию классы, которые должен создавать сервис не должны быть в этом сервисе. Они существуют где-то отдельно. То есть они не должны наследоваться от Object. Надо конечно этот момент уточнить.
Если это так, то надо через рефлексию проверять если в классе нужные методы с нужной сигнатурой.
Если не надо проверять сигнатуры, то достаточно функции method_exists (вроде твой случай)
Получается 3 и 4 пункт не нужны (вроде).
В методе класса который отвечает за возврат объекта проверяешь
- есть ли такой класс
- создаешь объект с установкой нужного age
- проверяешь есть ли метод age() и что он возвращает
- проверяешь есть ли метод class() и что он возвращает
Проблема может быть только в пункте про установку нужного age. Для этого эти классы должны поддерживать установку через сеттер (реализовывать какой-то интерфейс), но в задаче про это ничего не сказано и если они независимы от пакета то этого может и не быть. Или опять делать это через рефлексию (насколько помню это можно сделать).
Изменено DBR (06.09.2017 07:47:04)
Не в сети