создавать отдельный метод getProductList, в котором будет инициализирован класс
class Order
{
private ProductStorageInterface $products;
public function __construct(ProductStorageInterface $products)
{
$this->products = $products;
}
public function refundProduct(Product $product): void
{
// логика возврата товара
// и соответственно изменение состава $this->products
}
}
getProductList()
, это ужасно! Называйте как есть: createProductList()
или loadProductList()
, ну в зависимости от логики.class Dog extends Animal{}
class Penguin extends Animal{}
$allAnswers = [
1 => [2,3,4,5], // верный, тк даны только верные ответы
2 => [7,8,9,52], // не верный, дан неверный 52
3 => [10,11,12,25], // не верный, дан неверный 25
4 => [13], // не верный, тк пропущены верные ответы 14 и 15
];
$dbAnswers = [
// данные из БД
];
/**
* Группирует любой массив по любому полю $indexKey в качестве индекса,
* и $columnKey в качестве группируемых значений
*/
function groupBy(array $input, string $indexKey, string $columnKey): array
{
return array_reduce($input, function($res, $data) use ($indexKey, $columnKey){
if (!isset($data[$indexKey], $data[$columnKey])) {
return $res;
}
$res[$data[$indexKey]][] = $data[$columnKey];
return $res;
}, []);
}
/**
* Маппинг введенных ответов с верными ответами по каждому вопросу
*/
function computeAnswersResult(array $inputAnswers, array $questionsWithCorrectAnswers): array
{
$correctAnswers = $questionsWithCorrectAnswers[$questIn] ?? [];
$result = [];
foreach($inputAnswers as $questIn => $answesrIn) {
$errors = array_diff($answesrIn, $correctAnswers);
$corrects = array_diff($answesrIn, $errors); // если бы не нужно было выводить, то код сильно бы сократился
$correctDiff = array_diff($correctAnswers, $corrects);
// Если нет лишних ответов и число введенных верных ответов
// совпадает с числом верных в БД, то статус положительный
$completed = \count($errors) === 0 && \count($correctDiff) === 0;
$result[$questIn] = [
'errors' => $errors,
'corrects' => $corrects,
'completed' => $completed,
];
}
return $result;
}
// Группируем верные ответы по каждому вопросу
$questionsWithCorrectAnswers = groupBy($dbAnswers, 'id_question', 'id');
// Маппим введенные ответы на правильные и получаем результат
$result = computeAnswersResult($allAnswers, $questionsWithCorrectAnswers);
// Посчитаем успешные
$completedCount = \count(
array_filter($result, function($answer) {
return $answer['completed'] ?? false;
})
);
// ОТОБРАЖЕНИЕ
$html = '';
foreach ($result as $questId => $details) {
$status = $details['completed'] ? 'верный' : 'не верный';
$html .= 'Вопрос №:' . $questId . PHP_EOL;
$html .= 'Правильные ответы: ' . implode(', ', $details['corrects']) . PHP_EOL;
$html .= 'Результат вопроса: ' . $status . PHP_EOL;
$html .= '-------------------' . PHP_EOL;
}
$html .= 'Всего верных: ' . $completedCount;
echo $html;
/v2
одной строкой в роутах (ну или если в аннотациях задаете -- в них указать префикс)Не стоит юзать JMS сериалайзер или Symfony Serializer с аннотациями для сущностей. Для респонсов можно использовать обычные DTO-шки либо fractal.
API доку удобно писать с помощью https://github.com/bukalapak/snowboard
// Arrange
$provider = $this
->getMockBuilder(UserProvider::class)
->setMethodsExcept(['delete']) // перечисленные тут методы будут настоящими, хоть и мок
->setConstructorArgs([]) // сюда зависимости конструктора передать
->getMock();
$provider = $provider
->expects($this->once())
->method('canDelete') // мокаем приватный метод
->willReturn(true);
// Action
$result = $provider->delete();
// Assert
$this->assertEquals(true, $result);
location / {
try_files $uri /index.php?$args;
}
location / {
try_files $uri @rewrite;
}
location @rewrite {
rewrite ^/first/?$ first.php;
rewrite ^/second/?$ second.php;
rewrite ^ /index.php;
}
f = '1232132131, 12321321, 34232423423, 324234234234'
f.split.size ## 4
f.split(', ').size ## 4, вот так корректней
new Assert\Collection([
'address' => ...
new Assert\Expression([
'expression' => 'this.isValidAddress()',
'message' => 'Адрес или пустой или массив',
])
public function isValidAddress(): bool
{
return $this->address === null || \is_array($this->address);
}
/** @return MemberEntity[] */
public function getMembers() {}
В блок server добавьте блок location следующего вида:
location / { root /data/www; }
Этот блок location задаёт “/” в качестве префикса, который сравнивается с URI из запроса. Для подходящих запросов добавлением URI к пути, указанному в директиве root, то есть, в данном случае, к /data/www, получается путь к запрашиваемому файлу в локальной файловой системе.