Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
PHP: layers
<?php
// warstwa aplikacji – tutaj udostępniamy co aplikacja może zrobić
namespace CalculatorCompany\CalculatorProject\Application;
class AddNumbersUseCase
{
public function handle($firstNumber, $secondNumber)
{
$result = $this->calculator->add($firstNumber, $secondNumber);
// może być przydatne, np żeby dołożyć logowanie
$this->eventSystem->notify('Numbers were added', [
'first number' => $firstNumber,
'second number' => $secondNumber,
'result' => $result,
]);
return $result;
}
}
<?php
namespace CalculatorCompany\CalculatorProject\ConsoleUI;
use Console\Input;
use Console\Output;
// kontroler do pośredniczenia między użytkownikiem a aplikacją w środowisku konsolowym
class AddNumbersController
{
public function addNumbersAction(Input $input, Output $output)
{
do {
$firstNumber = $input->ask('Podaj pierwszą liczbę:');
} while (!is_numeric($firstNumber));
do {
$secondNumber = $input->ask('Podaj drugą liczbę:');
} while (!is_numeric($secondNumber));
$result = $this->addNumbersUseCase->handle((float) $firstNumber, (float) $secondNumber);
$outputInterface->sprintf('Wynik dodawania %f i %f to %f', $firstNumber, $secondNumber, $result);
}
}
<?php
// warstwa domenowa, nasza firma zajmuje się obliczeniami
namespace CalculatorCompany\CalculatorProject\Domain;
// mamy więc usługę, która takie obliczenia potrafi przeprowadzać
class Calculator
{
public function add($fistNumber, $secondNumber)
{
// na tym poziomie oczekujemy, że są liczbami – w końcu kalkulator operuje na liczbach
$this->assertNumber($firstNumber);
$this->assertNumber($secondNumber);
return $firstNumber + $secondNumber;
}
private function assertNumber($value)
{
if (!is_int($value) && !is_float($value)) {
throw new \InvalidArgumentException('The must be an integer or float');
}
}
}
<?php
namespace CalculatorCompany\CalculatorProject\WebUI;
use Http\Request;
use Http\Response;
class AddNumbersController
{
public function twoInputFieldsFormAction(Request $request)
{
$firstNumber = $request->query->get('first_number');
$secondNumber = $request->query->get('second_number');
// tutaj walidacja UI – ten formularz przyjmuje dane w postaci dwóch napisów, które powinny być liczbami
// oczywiście można/należy wydzielić tę logikę do jakiejś usługi walidacji, żeby odciążyć kontroler
// w najprostszej formie:
if (is_numeric($firstNumber) && is_numeric($secondNumber)) {
$result = $this->addNumbersUseCase->handle((float) $firstNumber, (float) $secondNumber);
$error = null;
} else {
$result = null;
$error = 'Both numbers must be numeric';
}
$responseHtml = $this->templatingEngine->render('twoInputFieldsForm.html', [
'firstNumber' => $firstNumber,
'secondNumber' => $secondNumber,
'result' => $result,
'error' => $error,
]);
// UI: dajemy zwrotkę zgodnie z protokołem HTTP
return new Response(Response::STATUS_CODE_OK, $responseHtml);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment