接口
接口是定义对象可以哪些执行操作的描述。
一般把 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 实例。