ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ основному содСрТимому

πŸ’» ΠŸΡ€ΠΎΠ΅ΠΊΡ‚Π½Ρ‹Π΅ ΠΊΠΎΠ΄-стили

πŸ”€ ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅β€‹

πŸ“Œ ΠžΠ±Ρ‰ΠΈΠ΅ правила​

  1. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ camelCase для имСнования ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….
  2. ΠŸΠΎΠ΄Π±ΠΈΡ€Π°Π΅ΠΌ осмыслСнныС ΠΈΠΌΠ΅Π½Π°, ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‰ΠΈΠ΅ Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅.
  3. Boolean ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ с is/has.
$userRole = $this->user->role;
$requestData = $request->getData();
$isAdminUser = $userRole === 'admin';

πŸ”’ ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ класса​

  1. ВсСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ protected.
  2. Π―Π²Π½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ….
protected string $userName;
protected string $email;

public function __construct(string $userName, string $email)
{
$this->userName = $userName;
$this->email = $email;
}

πŸ”‘ ΠšΠ»ΡŽΡ‡ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²β€‹

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ snake_case:

return [
'user_role' => $userRole,
'request_data' => $requestData,
'is_admin_user' => $isAdminUser,
];

πŸ”₯ ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρ‹β€‹

  • ВсСгда капсом (SNAKE_CASE).
  • ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ доступа.
public const USER_ROLE_KEY = 'user_role';

πŸ— Ѐункции​

βœ… ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ принципы​

  1. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ camelCase.
  2. ΠŸΠΎΠ΄Π±ΠΈΡ€Π°Π΅ΠΌ названия ΠΏΠΎ смыслу.
  3. Boolean-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠΌΠ΅Π½ΡƒΠ΅ΠΌ Ρ‡Π΅Ρ€Π΅Π· is/has.
  4. Π‘Π»Π΅Π΄ΡƒΠ΅ΠΌ схСмС Π³Π»Π°Π³ΠΎΠ» + ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅.
  5. ВсСгда ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Ρ‚ΠΈΠΏ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния.
public function getUserRole(User $user): ?string
{
return $user->role ?? null;
}

πŸ”€ ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ вСтвлСния​

❌ ΠœΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ Π»ΠΎΠ³ΠΈΠΊΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ if​

// ❌ ΠŸΠ»ΠΎΡ…ΠΎ
if ($user) {
// слоТная логика
} else {
throw new Exception;
}
return $user;

// βœ… Π₯ΠΎΡ€ΠΎΡˆΠΎ
if (!$user) {
throw new Exception;
}

// слоТная логика
return $user;

❌ ИзбСгаСм Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… if ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ match​

// ❌ ΠŸΠ»ΠΎΡ…ΠΎ
function getGradeComment($grade) {
if ($grade === 'A') return 'Excellent';
if ($grade === 'B') return 'Good';
if ($grade === 'C') return 'Average';
return 'Invalid Grade';
}

// βœ… Π₯ΠΎΡ€ΠΎΡˆΠΎ
function getGradeComment($grade) {
return match ($grade) {
'A' => 'Excellent',
'B' => 'Good',
'C' => 'Average',
default => 'Invalid Grade',
};
}

πŸ” АрхитСктурный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ (SOLID)​

🎯 ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ принципы​

  1. S (Single Responsibility) β€” ΠΎΠ΄ΠΈΠ½ класс = ΠΎΠ΄Π½Π° Π·Π°Π΄Π°Ρ‡Π°.
  2. O (Open/Closed) β€” классы ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, Π½ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ для измСнСния.
  3. D (Dependency Inversion) β€” зависимости ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· интСрфСйсы.

πŸ›  ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρ‹ (Controller)​

  • ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с рСквСстом ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ рСспонс.
  • ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡ‡Π΅ΡΠΊΠΈ ΠΈΠ·Π±Π΅Π³Π°Π΅ΠΌ Π»ΠΎΠ³ΠΈΠΊΠΈ Π² ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π΅!
class TitlesTableController extends Controller
{
public function __construct(protected readonly TitlesTableServiceInterface $service) {}

public function index(): JsonResponse
{
try {
return response()->json($this->service->getTitlesTableData());
} catch (Exception $e) {
return response()->json(['error' => $e->getMessage()], 500);
}
}
}

🏭 БСрвисы (Service)​

  • Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ.
  • Запросы ΠΊ Π‘Π” Ρ‡Π΅Ρ€Π΅Π· Repository.
class TitlesTableService implements TitlesTableServiceInterface
{
public function __construct(protected TitlesTableRepositoryInterface $repository) {}

public function getTitlesTableData(): array
{
return $this->repository->getTitles()->toArray();
}
}

πŸ”„ UseCase vs Service​

  • UseCase β€” ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ дСйствиС, содСрТит 1 ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ handle().
  • Service β€” выполняСт Π»ΠΎΠ³ΠΈΠΊΡƒ, ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡƒΡŽ Π² Ρ€Π°Π·Π½Ρ‹Ρ… мСстах.
class CheckCaptchaUseCase
{
public function handle(?string $token): bool
{
return $this->validateCaptcha($token);
}
}

πŸ“¦ DTO (Data Transfer Object)​

  • DTO β€” это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ слоями.
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ SerializedName для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с сСриализатором.
#[SerializedName('email')]
protected string $email;

🎭 ENUM​

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ enum вмСсто строковых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ:

enum UserStatus: string
{
case ACTIVE = 'active';
case BANNED = 'banned';
}

⚑ ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡβ€‹

  1. НС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠΉ ΠΏΡ€Π΅ΠΆΠ΄Π΅Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ!
  2. Π‘ΠΌΠΎΡ‚Ρ€ΠΈ Π½Π° запросы β€” ΠΈΠ·Π±Π΅Π³Π°ΠΉ N+1!
  3. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ batch-запросы.

πŸš€ Π˜Ρ‚ΠΎΠ³β€‹

Π­Ρ‚ΠΎΡ‚ ΡΡ‚ΠΈΠ»ΡŒ написания ΠΊΠΎΠ΄Π° Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌ, ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ ΠΈ Π»Π΅Π³ΠΊΠΈΠΌ Π² ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅.