PHP 프레임워크 Laravel Laravel 인터페이스 지향 프로그래밍(연습)

Laravel 인터페이스 지향 프로그래밍(연습)

May 21, 2020 am 11:06 AM
laravel php

Laravel 인터페이스 지향 프로그래밍(연습)

인터페이스 지향 프로그래밍은 고정 클래스가 아닌 인터페이스를 기반으로 애플리케이션을 구축하는 코딩의 설계 철학입니다.

프로그래머라면 인터페이스 지향 프로그래밍, 고정 클래스 대신 추상 클래스 사용 등과 같은 말을 들어봤을 것입니다.

이것들은 모두 같은 뜻입니다. 애플리케이션 코드를 작성할 때 구체적인 클래스가 아닌 추상 인터페이스에 의존하도록 하세요.

왜요?

처음 이 문장을 들었을 때 저의 정확한 반응은 이러했습니다. 클래스 대신 인터페이스를 사용하는 이유는 무엇입니까? 인터페이스를 생성하더라도 해당 인터페이스를 구현하는 클래스를 생성해야 합니다. 이건 시간낭비 아닌가요?

물론 아니죠! !

이 세상에서 유일하게 변하지 않는 것은 변화 그 자체, 즉 변화는 영원하다는 것입니다.

프로그래밍에 있어서도 예외는 없습니다. 시간이 지남에 따라 비즈니스 요구 사항이 변경됨에 따라 코드도 변경되어야 합니다.

따라서 코드는 유연하게 유지되어야 합니다.

인터페이스 지향 프로그래밍은 코드를 느슨하게 결합하고 유연하게 만들 수 있습니다.

어떻게 하나요?

아래 코드를 관찰하세요.

class Logger {
    public function log($content) 
    {
        //日志保存到文件中.
        echo "Log to file";
    }
}
로그인 후 복사

파일에 로그를 기록하는 간단한 클래스입니다. 컨트롤러에서 이를 호출할 수 있습니다.

class LogController extends Controller
{
    public function log()
    {
        $logger = new Logger;
        $logger->log('Log this');
    }
}
로그인 후 복사

하지만 로그를 여러 장소(데이터베이스, 파일, 클라우드 등)에 기록해야 한다면 어떻게 해야 할까요?

그런 다음 LogController 및 Logger 클래스를 변경하여 이러한 변경 사항을 수용할 수 있습니다.

class Logger {
    public function logToDb($content) 
    {
        //将日志记录到 db.
    }
    public function logToFile($content) 
    {
        //将日志保存到 file.
    }
    public function logToCloud($content) 
    {
        //将日志存储到 cloud.
    }
}
로그인 후 복사
class LogController extends Controller
{
    public function log()
    {
        $logger = new Logger;
        $target = config('log.target');
        if ($target == 'db') {
            $logger->logToDb($content);
        } elseif ($target == 'file') {
            $logger->logToFile($content);
        } else {
            $logger->logToCloud($content);
        }
    }
}
로그인 후 복사

이제 다양한 목표를 기록할 수 있습니다. 하지만 Redis 서버에 다른 대상(예: 로그)을 추가하려면 어떻게 해야 할까요? 마지막으로 Logger 클래스와 LogController 클래스를 모두 수정하겠습니다.

보시다시피 이는 우리의 통제 범위를 빨리 벗어났고 코드는 지저분해졌습니다. Logger 클래스는 빠르게 전체가 되었습니다. 이것은 악몽이다.

그래서 우리는 일을 나누어야 합니다. SOLID 원칙에 따라 책임을 적절한 클래스로 이동할 수 있습니다.

class DBLogger
{
    public function log()
    {
        //将日志记录到 db
    }
}
class FileLogger
{
    public function log()
    {
        //将日志保存到 file
    }
}
class CloudLogger
{
    public function log()
    {
        //将日志存储到 cloud
    }
}
로그인 후 복사

그러면 컨트롤러가 다음과 같이 변경됩니다.

class LogController extends Controller
{
    public function log()
    {
        $target = config('log.target');
        if ($target == 'db') {
            (new DBLogger)->log($content);
        } elseif ($target == 'file') {
            (new FileLogger)->log($content);
        } else {
            (new CloudLogger)->log($content);
        }
    }
}
로그인 후 복사

훨씬 좋습니다. 이제 추가 로깅 대상을 추가하려면 새 클래스를 생성하고 이를 컨트롤러의 if-else에 추가하면 됩니다.

그러나 로거 선택은 여전히 ​​컨트롤러의 책임입니다. 컨트롤러의 경우 다양한 로거에 대해 알고 그 중에서 선택할 필요가 없습니다. 콘텐츠를 기록하려면 log() 메서드가 있는 로거 클래스가 필요합니다.

인터페이스 사용

이 상황은 인터페이스를 사용하기에 적합합니다. 그렇다면 인터페이스란 무엇인가?

인터페이스는 객체가 수행할 수 있는 작업에 대한 설명입니다.

이 예에서 컨트롤러에는 log() 메서드가 있는 로거 클래스만 필요합니다. 따라서 인터페이스에는 log() 메서드가 있어야 함을 설명해야 합니다.

interface Logger
{
    public function log($content);
}
로그인 후 복사

보시다시피 함수 선언만 포함되어 있고 구현은 포함되어 있지 않으므로 추상이라고 부릅니다.

인터페이스를 구현할 때 인터페이스를 구현하는 클래스는 인터페이스에 정의된 추상 메서드의 구현 세부 정보를 제공해야 합니다.

이 예제에서 Logger 인터페이스를 구현하는 모든 클래스는 추상 메서드 log()의 구현 세부 정보를 제공해야 합니다.

그런 다음 이 인터페이스를 컨트롤러에 삽입할 수 있습니다.

class LogController extends Controller
{
    public function log(Logger $logger)
    {
        $logger->log($content);
    }
}
로그인 후 복사

이제 컨트롤러는 전달된 로거 유형에 더 이상 신경 쓰지 않습니다. 알아야 할 것은 Logger 인터페이스를 구현해야 한다는 것입니다.

따라서 이 인터페이스를 구현하려면 Logger 클래스를 수정해야 합니다.

class DBLogger implements Logger
{
    public function log()
    {
        //将日志记录到 db
    }
}
class FileLogger implements Logger
{
    public function log()
    {
        //将日志存储到 file
    }
}
class CloudLogger implements Logger
{
    public function log()
    {
        //将日志保存到 cloud
    }
}
로그인 후 복사

이제 기존 코드를 건드리지 않고도 더 많은 로거를 추가할 수 있습니다. 우리가 해야 할 일은 Logger 인터페이스를 구현하는 새 클래스를 만드는 것뿐입니다.

class RedisLogger implements Logger
{
    public function log()
    {
        //将日志存储到 redis
    }
}
로그인 후 복사

이제 우리 코드는 유연하고 낮은 결합으로 보입니다. 이전 코드를 변경하지 않고도 언제든지 구현 방법을 변경할 수 있습니다.

종속성 주입

Laravel 프레임워크를 사용할 때 서비스 컨테이너를 사용하여 인터페이스 구현을 자동으로 등록할 수 있습니다.

Laravel은 기본적으로 메소드 주입을 제공하므로 인터페이스와 구현만 바인딩하면 됩니다.

먼저 로거 구성 파일을 생성해야 합니다. 이렇게

<?php
return [
    &#39;default&#39; => env(&#39;LOG_TARGET&#39;, &#39;file&#39;),
    &#39;file&#39; => [
        &#39;class&#39; => App\Log\FileLogger::class,
    ],
    &#39;db&#39; => [
        &#39;class&#39; => App\Log\DBLogger::class,
    ],
    &#39;redis&#39; => [
        &#39;class&#39; => App\Log\RedisLogger::class,
    ]
];
로그인 후 복사

그런 다음 app/Providers 경로 아래의 AppServiceProvider.php 파일에 다음 코드를 추가하세요

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $default = config(&#39;log.default&#39;);
        $logger = config("log.{$default}.class");
        $this->app->bind(
            App\Contracts\Logger::class, // the logger interface
            $logger
        );
    }
}
로그인 후 복사

이 효과는 logger.php 구성 파일에서 기본 로거를 읽은 다음 이를 Logger에 바인딩하는 것입니다. 인터페이스. 이러한 방식으로 Logger 인터페이스를 사용할 때 컨테이너는 기본 Logger 인스턴스를 구문 분석하고 반환합니다.

env() 어시스턴트를 사용하여 기본 로거를 지정하기 때문에 로컬 환경의 파일, 프로덕션 환경의 db 등 다양한 환경에서 서로 다른 로거를 사용할 수 있습니다.

요약

인터페이스를 사용하면 낮은 결합 코드를 작성하고 추상화 계층을 제공할 수 있습니다. 이를 통해 언제든지 구현을 변경할 수 있습니다. 따라서 가능한 한 인터페이스 지향 방식으로 애플리케이션의 변수 부분을 구현하도록 노력하십시오.

추천 튜토리얼: "PHP 튜토리얼"

위 내용은 Laravel 인터페이스 지향 프로그래밍(연습)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

<gum> : Bubble Gum Simulator Infinity- 로얄 키를 얻고 사용하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
Nordhold : Fusion System, 설명
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora : 마녀 트리의 속삭임 - Grappling Hook 잠금 해제 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

session_start () 함수의 중요성은 무엇입니까? session_start () 함수의 중요성은 무엇입니까? May 03, 2025 am 12:18 AM

session_start () iscrucialinphpformanagingUsersessions.1) itiniteSanewsessionifnoneexists, 2) ResumesAnxistessions, and3) setSasessionCookieForContInuityAcrosrequests, enablingplicationsirecationSerauthenticationAndpersonalizestContent.

작곡가 : PHP 개발자의 패키지 관리자 작곡가 : PHP 개발자의 패키지 관리자 May 02, 2025 am 12:23 AM

Composer는 PHP의 종속성 관리 도구이며 Composer.json 파일을 통해 프로젝트 종속성을 관리합니다. 1) 종속성 정보를 얻기 위해 Composer.json을 구문 분석합니다. 2) 종속성 트리를 형성하기위한 종속성; 3) Packagist에서 공급 업체 디렉토리로 종속성을 다운로드하여 설치합니다. 4) Composer.Lock 파일을 생성하여 팀 일관성 및 프로젝트 유지 관리 가능성을 보장하기 위해 종속성 버전을 잠그십시오.

JavaScript 프레임 워크 (React, Vue, Angular)와 Laravel 백엔드 통합 JavaScript 프레임 워크 (React, Vue, Angular)와 Laravel 백엔드 통합 May 03, 2025 am 12:20 AM

React, vue, andangularcanbeintegratedwithlaravelbyfollowspecificsetupsteps.1) forreact : installEactusingLaravelui, setupcomponentsinApp.js.2) Forvue : Uselaravel'sbuilt-Invuesupport, configureinApt.3)

PHP 성능 최적화 전략. PHP 성능 최적화 전략. May 13, 2025 am 12:06 AM

phPapplicationSCanBeoptimizedForsPeedandefficiencyby : 1) ENABLEOPCACHEINPHP.INI, 2) PREPAREDSTATEMENTSWITHPDOFORDATABASEQUERIES 사용

PHP의 종속성 주입을위한 모범 사례 PHP의 종속성 주입을위한 모범 사례 May 08, 2025 am 12:21 AM

의존성 주입 (DI)을 사용하는 이유는 코드의 느슨한 커플 링, 테스트 가능성 및 유지 관리 가능성을 촉진하기 때문입니다. 1) 생성자를 사용하여 종속성을 주입하고, 2) 서비스 로케이터 사용을 피하고, 3) 종속성 주입 컨테이너를 사용하여 종속성을 관리하고, 4) 주입 종속성을 통한 테스트 가능성을 향상 시키십시오.

phpmyadmin의 기능 : MySQL과 상호 작용 (SQL) phpmyadmin의 기능 : MySQL과 상호 작용 (SQL) May 07, 2025 am 12:16 AM

Phpmyadmin은 웹 인터페이스를 통해 MySQL 데이터베이스 관리를 단순화합니다. 1) 데이터베이스 및 테이블 작성 : 그래픽 인터페이스를 사용하여 쉽게 작동합니다. 2) 복잡한 쿼리 실행 : SQL 편집기를 통해 구현 된 Join Query와 같은 실행. 3) 최적화 및 모범 사례 : SQL 쿼리 최적화, 인덱스 관리 및 데이터 백업 포함.

PHP 성능 최적화 점검표 : 지금 속도를 향상시킵니다 PHP 성능 최적화 점검표 : 지금 속도를 향상시킵니다 May 12, 2025 am 12:07 AM

toImprovePhPapplicationSpeed, followthesesteps : 1) enableOpCodeCachingWithApcuTeCeScripteXecutionTime.2) 구현 구현

Laravel을 사용한 전체 스택 애플리케이션 구축 : 실용적인 튜토리얼 Laravel을 사용한 전체 스택 애플리케이션 구축 : 실용적인 튜토리얼 May 01, 2025 am 12:23 AM

laravelisidealforfull-stackapplicationsduetoitselegantsyntax, 포괄적 인 Cosystem 및 powerfulfeatures.1) audeeloquentormforintucive backenddatamanipulation, butavoidn 1queryisss.2) Employblatingforcleanfrontendviews, beencautiousofoversing@i

See all articles