Laravel Interface的使用和封装

这篇博客介绍了如何通过定义接口LogInterface并实现不同的日志处理器(如DBLogger, FileLogger, RedisLogger),结合依赖注入和配置文件,实现灵活的日志记录系统。在AppServiceProvider中注册默认的日志处理器,使得每次请求都能根据配置自动获取相应的日志实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接口

接口是定义对象可以哪些执行操作的描述。
一般把 Interface 接口文件放在项目的 App\Contracts 文件夹。

以系统日志封装为例

interface LogInterface
{
    public function log($content);
}

// LogController
class LogController extends Controller
{
    public function log(LogInterface $logger)
    {
        $logger->log('log to');
    }
}

//DBLogger.php
namespace App\Logs;
use App\Contracts\LogInterface;

class DBLogger implements LogInterface
{
    public function log($content)
    {
        //输出日志到 DB。
    }
}

//FileLogger.php
namespace App\Logs;
use App\Contracts\LogInterface;

class FileLogger implements LogInterface
{
    public function log($content)
    {
        //输出 Log 日志到文件。
    }
}

//RedisLogger.php
namespace App\Logs;
use App\Contracts\LogInterface;
class RedisLogger implements Logger
{
    public function log($content)
    {
        //输出 Log 日志到redis。
    }
}

依赖注入

  • 我们先新建一个配置文件 config/log.php
<?php

return [
    'default' => env('LOG_TARGET', 'file'),

    'file' => [
        'class' => App\Logs\FileLogger::class,
    ],

    'db' => [
        'class' => App\Logs\DBLogger::class,
    ],

    'redis' => [
        'class' => App\Logs\RedisLogger::class,
    ]
];
  • 并在 app/Providers/AppServiceProvider.php 添加以下代码。
public function register()
{
    $default = config('log.default');
    $logger = config("log.{$default}.class");

    $this->app->bind(
        \App\Contracts\LogInterface::class, 
        $logger
    );
}

我们从配置文件中读取默认 Logger,并将其绑定到 LogInterface。这样每当我们请求 Logger 接口时,容器都会解析它并返回默认的 Logger 实例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值