Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 01.09.2017 10:59:22

respectpick
Откуда: Москва
Сообщений: 83

Расскажите порядок действий для выполнения этой задачи

Сам текст задачи вот такой

Будем считать, что директория . корень проекта 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...
...
Как то дальше не соображу

Не в сети

#2 06.09.2017 07:46:20

Re: Расскажите порядок действий для выполнения этой задачи

Судя по заданию классы, которые должен создавать сервис не должны быть в этом сервисе. Они существуют где-то отдельно. То есть они не должны наследоваться от Object. Надо конечно этот момент уточнить.

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

Если не надо проверять сигнатуры, то достаточно функции method_exists (вроде твой случай)

Получается 3 и 4 пункт не нужны (вроде).

В методе класса который отвечает за возврат объекта проверяешь

- есть ли такой класс
- создаешь объект с установкой нужного age
- проверяешь есть ли метод age() и что он возвращает
- проверяешь есть ли метод class() и что он возвращает

Проблема может быть только в пункте про установку нужного age. Для этого эти классы должны поддерживать установку через сеттер (реализовывать какой-то интерфейс), но в задаче про это ничего не сказано и если они независимы от пакета то этого может и не быть. Или опять делать это через рефлексию (насколько помню это можно сделать).

Изменено DBR (06.09.2017 07:47:04)

Не в сети

Подвал раздела