원칙 SOLID: PHP/Laravel을 사용하지 않는 경우(Parte 01 - Responsabilidade Única)
13577 단어 laravelphparchitecturesolid
Dentro deste tema costuma-se falar de arquitetura de software, padrões de projeto, design de software 등
Nesta série de artigos vou abordar o SOLID que é um princípio de design de software orientado a objeto (OOD). 기본, SOLID é um acrônimo para:
S - Single Responsibility Principle
O - Open-closed Principle
L - Liskov Substitution Principle
I - Interface Segregation Principle
D - Dependency Inversion Principle
Vamos entender como funciona cada um deles e exemplicar usando o PHP. Laravel의 세부 사항은 MVC에서 MVC로 확장할 수 있는 프레임워크이며, 응용 프로그램에서 사용할 수 있고, 구성/작업을 구성할 수 있습니다.
Então, neste primeiro artigo vamos abordar o primeiro dos princípios de forma detalhada.
단일 책임 원칙
(Princípio da Responsabilidade Única)
Uma classe deve ter uma e apenas uma razão para mudança, significando que uma classe deve ter apenas uma responsabilidade.
Este é o primeiro, mais simples, e mais importante princípio, pois parte da premissa que toda classe deve ter apenas 1 objetivo quando se trata do fluxo de uma requisição do 소프트웨어.
Vamos dar uma olhada no exemplo abaixo:
class UserRegistrationController extends Controller
{
public function register(Request $request)
{
$attributes = $request->all();
if($attributes['type'] === 'employee') {
$this->saveEmployee($attributes);
}
if($attributes['type'] === 'contractor') {
$this->saveContractor($attributes);
}
return view('user.register');
}
public function saveEmployee($request)
{
DB::table('employees')->insert([
/* Dados do funcionário aqui... */
]);
}
public function saveContractor($request)
{
DB::table('employees')->insert([
/* Dados do terceirizado aqui... */
]);
}
}
Esta classe acima viola o princípio da responsabilidade única pelos motivos a seguir:
Uma classe deve ter uma e apenas uma razão para mudança, significando que uma classe deve ter apenas uma responsabilidade.
class UserRegistrationController extends Controller
{
public function register(Request $request)
{
$attributes = $request->all();
if($attributes['type'] === 'employee') {
$this->saveEmployee($attributes);
}
if($attributes['type'] === 'contractor') {
$this->saveContractor($attributes);
}
return view('user.register');
}
public function saveEmployee($request)
{
DB::table('employees')->insert([
/* Dados do funcionário aqui... */
]);
}
public function saveContractor($request)
{
DB::table('employees')->insert([
/* Dados do terceirizado aqui... */
]);
}
}
Vamos는 클래스를 수정합니다.
class UserRegistrationController extends Controller
{
protected $userService;
public function __construct(UserService $userService)
{
$this->userService = $userService;
}
public function register(Request $request)
{
$userService->register($request);
return view('user.register');
}
}
Aqui deixamos o Controller isolado com a sua única responsabilidade: gerenciar a request e a response.
Laravel, para podermos adicionar uma camada de comunicação com a classe atual, nós usamos a injeção de dependsência nativa do framework. Basta adicionar a classe desejada como paraâmetro no construtor e atribuí-la em uma propriedade da classe. E eu fiz isso adicionando a classe
UserService
.Vamos entender 아고라 클래스
UserService
:class UserService
{
protected $employeeRepository;
protected $contractorRepository;
public function __construct(
EmployeeRepository $employeeRepository,
ContractorRepository $contractorRepository
)
{
$this->userRepository = $userRepository;
$this->contractorRepository = $contractorRepository;
}
public function register(Request $request)
{
$attributes = $request->all();
if($attributes['type'] === 'employee') {
$this->employeeRepository->save($attributes);
}
if($attributes['type'] === 'contractor') {
$this->contractorRepository->save($attributes);
}
}
}
O Service é o local onde colocamos toda a regra de negócio, como é o caso do condicional que usamos para identificar o tipo de usuário.
Aqui também usamos a injeção de dependsência, mas importamos 2 클래스. Exatamente os Repositories dos tipos de usuário. Como o Model é a Representativeação da tabela do banco dentro da aplicação, eo Repository é reponsável pela operação de banco de cada Model, nada mais coerente mantê-los separados.
Vamos entender 아고라 os 리포지토리:
class EmployeeRespository
{
protected $employee;
public function __construct(Employee $employee)
{
$this->employee = $employee;
}
public function save(array $attributes)
{
$this->employee->insert($attributes);
}
}
class ContractorRespository
{
protected $contractor;
public function __construct(Employee $contractor)
{
$this->contractor = $contractor;
}
public function save(array $attributes)
{
$this->contractor->insert($attributes);
}
}
Em ambos os Repositories utilizamos a mesma estrutura: injeção de dependsência com oreceivivos Models, e um método
save()
.Dessa maneira, separamos as responsabilidades em camadas, deixando o código mais legível e com uma arquitetura mais correta.
No próximo artigo vou abordar o segundo princípio: 개방 폐쇄 원칙(Princípio Aberto-fechado).
Espero que você tenha gostado. Dúvidas e feedbacksão semper muito bem vindos.
추신: 추가 서비스 e 리포지토리는 Laravel 응용 프로그램으로서 파스타
app/Services
및 app/Repositories
추가 클래스 설명서입니다.PPS: Neste exemplo abordei apenas o essencial para explicá-lo, deixando de fora imports, return, validationators, etc.
PPPS: Eu sei que o ideal seria terum Model
User
e estender para Employee
e Contractor
. Mas para o exemplo ficar mais claro, deixei-os separados mesmo.
Reference
이 문제에 관하여(원칙 SOLID: PHP/Laravel을 사용하지 않는 경우(Parte 01 - Responsabilidade Única)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/lucascavalcante/principios-solid-o-que-sao-e-como-aplica-los-no-php-laravel-parte-01-responsabilidade-unica-3mjj텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)