Completed
Push — develop ( c94dac...b0240c )
by Simon
03:03
created

GenericLoggerFactory   A

Complexity

Total Complexity 16

Size/Duplication

Total Lines 150
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Importance

Changes 3
Bugs 0 Features 1
Metric Value
wmc 16
c 3
b 0
f 1
lcom 1
cbo 1
dl 0
loc 150
rs 10

10 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 12 1
B create() 0 30 4
A createPHPLogger() 0 4 1
A createFileLogger() 0 4 1
A createSysLogger() 0 4 1
A createStdOutLogger() 0 4 1
A createStdErrLogger() 0 4 1
A createNullLogger() 0 4 1
A checkConfig() 0 16 2
A createLogger() 0 16 3
1
<?php
2
/*
3
 * This file is part of Yolk - Gamer Network's PHP Framework.
4
 *
5
 * Copyright (c) 2014 Gamer Network Ltd.
6
 * 
7
 * Distributed under the MIT License, a copy of which is available in the
8
 * LICENSE file that was bundled with this package, or online at:
9
 * https://github.com/gamernetwork/yolk-logger
10
 */
11
12
namespace yolk\log;
13
14
use yolk\contracts\log\LoggerFactory;
15
use yolk\contracts\log\Logger;
16
17
class GenericLoggerFactory implements LoggerFactory {
18
19
	protected $classes;
20
21
	public function __construct( array $classes = [] ) {
22
23
		$this->classes = $classes + [
24
			'php'    => __NAMESPACE__. '\adapter\PHPLogger',
25
			'file'   => __NAMESPACE__. '\adapter\FileLogger',
26
			'stderr' => __NAMESPACE__. '\adapter\StdErrLogger',
27
			'stdout' => __NAMESPACE__. '\adapter\StdOutLogger',
28
			'syslog' => __NAMESPACE__. '\adapter\SysLogger',
29
			'null'   => __NAMESPACE__. '\adapter\NullLogger',
30
		];
31
32
	}
33
34
	public function create( $config ) {
35
36
		$config = $this->checkConfig($config);
37
38
		$factories = [
39
			'php'    => 'createPHPLogger',
40
			'file'   => 'createFileLogger',
41
			'syslog' => 'createSysLogger',
42
			'stderr' => 'createStdErrLogger',
43
			'stdout' => 'createStdOutLogger',
44
			'null'   => 'createNullLogger',
45
		];
46
47
		if( empty($factories[$config['type']]) )
48
			throw new Exception("Invalid logger type: {$config['type']}");
49
50
		$factory = $factories[$config['type']];
51
52
		if( $config['type'] == 'file' ) {
53
			$config = $config + ['file' => ''];
54
			return $this->$factory($config['file'], $config['threshold']);
55
		}
56
		elseif( $config['type'] == 'syslog' ) {
57
			$config = $config + ['prefix' => ''];
58
			return $this->$factory($config['prefix'], $config['threshold']);
59
		}
60
61
		return $this->$factory($config['threshold']);
62
63
	}
64
65
	/**
66
	 * Create a logger that outputs to the standard PHP error log.
67
	 * @param  integer $threshold
68
	 * @return Logger
69
	 */
70
	public function createPHPLogger( $threshold = LogLevel::WARNING ) {
71
		return $this->createLogger('php')
72
			->setThreshold($threshold);
73
	}
74
75
	/**
76
	 * Create a logger that outputs to the specified file.
77
	 * @param  integer $threshold
78
	 * @return Logger
79
	 */
80
	public function createFileLogger( $file, $threshold = LogLevel::WARNING ) {
81
		return $this->createLogger('file', $file)
82
			->setThreshold($threshold);
83
	}
84
85
	/**
86
	 * Create a logger that outputs to Syslog.
87
	 * @param  integer $threshold
88
	 * @return Logger
89
	 */
90
	public function createSysLogger( $prefix = '', $threshold = LogLevel::WARNING ) {
91
		return $this->createLogger('syslog', $prefix)
92
			->setThreshold($threshold);
93
	}
94
95
	/**
96
	 * Create a logger that outputs to StdOut.
97
	 * The StdOut logger is only available when running via the command-line.
98
	 * @param  integer $threshold
99
	 * @return Logger
100
	 */
101
	public function createStdOutLogger( $threshold = LogLevel::WARNING ) {
102
		return $this->createLogger('stdout')
103
			->setThreshold($threshold);
104
	}
105
106
	/**
107
	 * Create a logger that outputs to StdErr.
108
	 * The StdErr logger is only available when running via the command-line.
109
	 * @param  integer $threshold
110
	 * @return Logger
111
	 */
112
	public function createStdErrLogger( $threshold = LogLevel::WARNING ) {
113
		return $this->createLogger('stderr')
114
			->setThreshold($threshold);
115
	}
116
117
	/**
118
	 * Create a logger that performs no output.
119
	 * @param  integer $threshold
120
	 * @return Logger
121
	 */
122
	public function createNullLogger( $threshold = LogLevel::WARNING ) {
123
		return $this->createLogger('null')
124
			->setThreshold($threshold);
125
	}
126
127
	/**
128
	 * Ensure the configuration is in a consistant format.
129
	 * @param  array|string $config
130
	 * @return array
131
	 */
132
	protected function checkConfig( $config ) {
133
134
		// if config isn't an array then treat it as the log type
135
		// - some adapters don't require configuration options
136
		if( !is_array($config) ) {
137
			$config = [
138
				'type' => $config,
139
			];
140
		}
141
142
		$config = $config + [
0 ignored issues
show
Unused Code introduced by
$config is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
143
			'type'   => '',
144
			'threshold' => LogLevel::WARNING,
145
		];
146
147
	}
148
149
	protected function createLogger( $type, $arg1 = null, $arg2 = null, $arg3 = null ) {
150
151
		// check the class exists before we try and use it
152
		if( !class_exists($class = $this->classes[$type]) )
153
			throw new Exception(sprintf("Class '\\%s' not found for logger type '%s'", $class, $type));
154
155
		// create a new instance
156
		$log = new $class($arg1, $arg2, $arg3);
157
158
		// check the instance implements the correct interface
159
		if( !$log instanceof Logger )
160
			throw new Exception(sprintf("Class '\\%s' does not implement yolk\contracts\log\Logger", $class));
161
162
		return $log;
163
164
	}
165
166
}
167
168
// EOF