1
|
|
|
<?php |
|
|
|
|
2
|
|
|
|
3
|
|
|
if (php_sapi_name() !== 'cli') { |
4
|
|
|
exit(1); |
5
|
|
|
} |
6
|
|
|
|
7
|
|
|
require __DIR__.'/autoload.php'; |
8
|
|
|
set_time_limit(0); |
9
|
|
|
ini_set('display_errors', 1); |
10
|
|
|
|
11
|
|
|
define('COMPOSER_FILE', 'composer.phar'); |
12
|
|
|
define('COMPOSER_SETUP_FILE', 'composer-setup.php'); |
13
|
|
|
|
14
|
|
|
setUseAnsi($argv); |
15
|
|
|
|
16
|
|
|
$argv = is_array($argv) ? $argv : array(); |
17
|
|
|
|
18
|
|
|
$argv[1] = isset($argv[1]) ? $argv[1] : null; |
19
|
|
|
$argv[2] = isset($argv[2]) ? $argv[2] : null; |
20
|
|
|
|
21
|
|
|
if (in_array('--help', $argv) || empty($argv[1])) { |
22
|
|
|
displayHelp($argv); |
23
|
|
|
exit(1); |
24
|
|
|
} |
25
|
|
|
out('EC-CUBE3 installer use database driver of ', null, false); |
26
|
|
|
|
27
|
|
|
$database_driver = 'pdo_sqlite'; |
28
|
|
|
switch($argv[1]) { |
29
|
|
|
case 'mysql': |
30
|
|
|
$database_driver = 'pdo_mysql'; |
31
|
|
|
break; |
32
|
|
|
case 'pgsql': |
33
|
|
|
$database_driver = 'pdo_pgsql'; |
34
|
|
|
break; |
35
|
|
|
default: |
36
|
|
|
case 'sqlite': |
37
|
|
|
case 'sqlite3': |
38
|
|
|
case 'sqlite3-in-memory': |
39
|
|
|
$database_driver = 'pdo_sqlite'; |
40
|
|
|
} |
41
|
|
|
out($database_driver); |
42
|
|
|
|
43
|
|
|
$database = getDatabaseConfig($database_driver); |
44
|
|
|
$connectionParams = $database['database']; |
45
|
|
|
|
46
|
|
|
if ($argv[2] != 'none') { |
47
|
|
|
composerSetup(); |
48
|
|
|
composerInstall(); |
49
|
|
|
} |
50
|
|
|
|
51
|
|
|
createConfigFiles($database_driver); |
52
|
|
|
createDatabase($connectionParams); |
53
|
|
|
|
54
|
|
|
$app = createApplication(); |
55
|
|
|
initializeDatabase($app); |
56
|
|
|
out('EC-CUBE3 install finished successfully!', 'success'); |
57
|
|
|
if (PHP_VERSION_ID >= 50400) { |
58
|
|
|
out('PHP built-in web server to run applications, `php -S localhost:8080 -t html`', 'info'); |
59
|
|
|
out('Open your browser and access the http://localhost:8080/', 'info'); |
60
|
|
|
} |
61
|
|
|
exit(0); |
62
|
|
|
|
63
|
|
|
function displayHelp($argv) |
|
|
|
|
64
|
|
|
{ |
65
|
|
|
echo <<<EOF |
66
|
|
|
EC-CUBE3 Installer |
67
|
|
|
------------------ |
68
|
|
|
Usage: |
69
|
|
|
${argv[0]} [mysql|pgsql|sqlite3] [none] [options] |
70
|
|
|
|
71
|
|
|
Arguments[1]: |
72
|
|
|
Specify database types |
73
|
|
|
|
74
|
|
|
Arguments[2]: |
75
|
|
|
Specifying the "none" to skip the installation of Composer |
76
|
|
|
|
77
|
|
|
Options: |
78
|
|
|
--help this help |
79
|
|
|
--ansi force ANSI color output |
80
|
|
|
--no-ansi disable ANSI color output |
81
|
|
|
|
82
|
|
|
Environment variables: |
83
|
|
|
ADMIN_USER=admin |
84
|
|
|
ADMIN_PASS=password |
85
|
|
|
[email protected] |
86
|
|
|
SHOP_NAME=EC-CUBE SHOP |
87
|
|
|
ADMIN_ROUTE=admin |
88
|
|
|
DBSERVER=127.0.0.1 |
89
|
|
|
DBNAME=cube3_dev |
90
|
|
|
DBUSER=cube3_dev_user |
91
|
|
|
DBPASS=password |
92
|
|
|
DBPORT=<database port> |
93
|
|
|
MAIL_BACKEND=smtp |
94
|
|
|
MAIL_HOST=localhost |
95
|
|
|
MAIL_PORT=25 |
96
|
|
|
MAIL_USER=<SMTP AUTH user> |
97
|
|
|
MAIL_PASS=<SMTP AUTH password> |
98
|
|
|
|
99
|
|
|
EOF; |
100
|
|
|
} |
101
|
|
|
|
102
|
|
|
function composerSetup() |
|
|
|
|
103
|
|
|
{ |
104
|
|
|
if (!file_exists(__DIR__.'/'.COMPOSER_FILE)) { |
105
|
|
|
if (!file_exists(__DIR__.'/'.COMPOSER_SETUP_FILE)) { |
106
|
|
|
copy('https://getcomposer.org/installer', COMPOSER_SETUP_FILE); |
107
|
|
|
} |
108
|
|
|
|
109
|
|
|
$sha = hash_file('SHA384', COMPOSER_SETUP_FILE).PHP_EOL; |
110
|
|
|
out(COMPOSER_SETUP_FILE.': '.$sha); |
111
|
|
|
|
112
|
|
|
$command = 'php '.COMPOSER_SETUP_FILE; |
113
|
|
|
out("execute: $command", 'info'); |
114
|
|
|
passthru($command); |
115
|
|
|
unlink(COMPOSER_SETUP_FILE); |
116
|
|
|
} else { |
117
|
|
|
$command = 'php '.COMPOSER_FILE.' self-update'; |
118
|
|
|
passthru($command); |
119
|
|
|
} |
120
|
|
|
} |
121
|
|
|
|
122
|
|
|
function composerInstall() |
|
|
|
|
123
|
|
|
{ |
124
|
|
|
$command = 'php '.COMPOSER_FILE.' install --dev --no-interaction'; |
125
|
|
|
passthru($command); |
126
|
|
|
} |
127
|
|
|
|
128
|
|
|
function createDatabase(array $connectionParams) |
|
|
|
|
129
|
|
|
{ |
130
|
|
|
$dbname = $connectionParams['dbname']; |
131
|
|
|
switch ($connectionParams['driver']) { |
132
|
|
|
case 'pdo_pgsql': |
133
|
|
|
$connectionParams['dbname'] = 'postgres'; |
134
|
|
|
$connectionParams['user'] = (getenv('ROOTUSER') ? getenv('ROOTUSER') : (getenv('DBUSER') ? getenv('DBUSER') : 'postgres')); |
135
|
|
|
$connectionParams['password'] = (getenv('ROOTPASS') ? getenv('ROOTPASS') : (getenv('DBPASS') ? getenv('DBPASS') : 'password')); |
136
|
|
|
break; |
137
|
|
|
case 'pdo_mysql': |
138
|
|
|
$connectionParams['dbname'] = 'mysql'; |
139
|
|
|
$connectionParams['user'] = (getenv('ROOTUSER') ? getenv('ROOTUSER') : (getenv('DBUSER') ? getenv('DBUSER') : 'root')); |
140
|
|
|
if (getenv('TRAVIS')) { |
141
|
|
|
$connectionParams['password'] = ''; |
142
|
|
|
} else { |
143
|
|
|
$connectionParams['password'] = (getenv('ROOTPASS') ? getenv('ROOTPASS') : (getenv('DBPASS') ? getenv('DBPASS') : 'password')); |
144
|
|
|
} |
145
|
|
|
break; |
146
|
|
|
default: |
147
|
|
|
case 'pdo_sqlite': |
148
|
|
|
$connectionParams['dbname'] = $database['database']['path']; |
149
|
|
|
if (file_exists($dbname)) { |
150
|
|
|
out('remove database to '.$dbname, 'info'); |
151
|
|
|
unlink($dbname); |
152
|
|
|
} |
153
|
|
|
break; |
154
|
|
|
} |
155
|
|
|
|
156
|
|
|
$config = new \Doctrine\DBAL\Configuration(); |
157
|
|
|
$conn = \Doctrine\DBAL\DriverManager::getConnection($connectionParams, $config); |
158
|
|
|
$sm = $conn->getSchemaManager(); |
159
|
|
|
out('Created database connection...', 'info'); |
160
|
|
|
|
161
|
|
|
if ($connectionParams['driver'] != 'pdo_sqlite') { |
162
|
|
|
$databases = $sm->listDatabases(); |
163
|
|
|
if (in_array($dbname, $databases)) { |
164
|
|
|
out('database exists '.$dbname, 'info'); |
165
|
|
|
out('drop database to '.$dbname, 'info'); |
166
|
|
|
$sm->dropDatabase($dbname); |
167
|
|
|
} |
168
|
|
|
} |
169
|
|
|
out('create database to '.$dbname, 'info'); |
170
|
|
|
$sm->createDatabase($dbname); |
171
|
|
|
} |
172
|
|
|
|
173
|
|
|
/** |
174
|
|
|
* @return \Eccube\Application |
175
|
|
|
*/ |
176
|
|
|
function createApplication() |
|
|
|
|
177
|
|
|
{ |
178
|
|
|
$app = \Eccube\Application::getInstance(); |
179
|
|
|
$app['debug'] = true; |
180
|
|
|
$app->initDoctrine(); |
181
|
|
|
$app->initSecurity(); |
182
|
|
|
$app->register(new \Silex\Provider\FormServiceProvider()); |
183
|
|
|
$app->register(new \Eccube\ServiceProvider\EccubeServiceProvider()); |
184
|
|
|
$app->boot(); |
185
|
|
|
return $app; |
|
|
|
|
186
|
|
|
} |
187
|
|
|
|
188
|
|
|
function initializeDatabase(\Eccube\Application $app) |
|
|
|
|
189
|
|
|
{ |
190
|
|
|
// Get an instance of your entity manager |
191
|
|
|
$entityManager = $app['orm.em']; |
192
|
|
|
|
193
|
|
|
$pdo = $entityManager->getConnection()->getWrappedConnection(); |
194
|
|
|
|
195
|
|
|
// Clear Doctrine to be safe |
196
|
|
|
$entityManager->getConnection()->getConfiguration()->setSQLLogger(null); |
197
|
|
|
$entityManager->clear(); |
198
|
|
|
gc_collect_cycles(); |
199
|
|
|
|
200
|
|
|
// Schema Tool to process our entities |
201
|
|
|
$tool = new \Doctrine\ORM\Tools\SchemaTool($entityManager); |
202
|
|
|
$classes = $entityManager->getMetaDataFactory()->getAllMetaData(); |
203
|
|
|
|
204
|
|
|
// Drop all classes and re-build them for each test case |
205
|
|
|
out('Dropping database schema...', 'info'); |
206
|
|
|
$tool->dropSchema($classes); |
207
|
|
|
out('Creating database schema...', 'info'); |
208
|
|
|
$tool->createSchema($classes); |
209
|
|
|
out('Database schema created successfully!', 'success'); |
210
|
|
|
$config = new \Doctrine\DBAL\Migrations\Configuration\Configuration($app['db']); |
211
|
|
|
$config->setMigrationsNamespace('DoctrineMigrations'); |
212
|
|
|
|
213
|
|
|
$migrationDir = __DIR__.'/src/Eccube/Resource/doctrine/migration'; |
214
|
|
|
$config->setMigrationsDirectory($migrationDir); |
215
|
|
|
$config->registerMigrationsFromDirectory($migrationDir); |
216
|
|
|
|
217
|
|
|
$migration = new \Doctrine\DBAL\Migrations\Migration($config); |
218
|
|
|
$migration->migrate(); |
219
|
|
|
out('Database migration successfully!', 'success'); |
220
|
|
|
|
221
|
|
|
$login_id = (getenv('ADMIN_USER') ? getenv('ADMIN_USER') : 'admin'); |
222
|
|
|
$login_password = (getenv('ADMIN_PASS') ? getenv('ADMIN_PASS') : 'password'); |
223
|
|
|
$passwordEncoder = new \Eccube\Security\Core\Encoder\PasswordEncoder($app['config']); |
224
|
|
|
$salt = \Eccube\Util\Str::random(32); |
225
|
|
|
$encodedPassword = $passwordEncoder->encodePassword($login_password, $salt); |
226
|
|
|
|
227
|
|
|
out('Creating admin accounts...', 'info'); |
228
|
|
|
$sql = "INSERT INTO dtb_member (member_id, login_id, password, salt, work, del_flg, authority, creator_id, rank, update_date, create_date,name,department) VALUES (2, :login_id, :admin_pass , :salt , '1', '0', '0', '1', '1', current_timestamp, current_timestamp,'管理者', 'EC-CUBE SHOP');"; |
229
|
|
|
$stmt = $pdo->prepare($sql); |
230
|
|
|
$stmt->execute( |
231
|
|
|
array( |
|
|
|
|
232
|
|
|
':login_id' => $login_id, |
233
|
|
|
':admin_pass' => $encodedPassword, |
234
|
|
|
':salt' => $salt |
235
|
|
|
) |
236
|
|
|
); |
237
|
|
|
$stmt->closeCursor(); |
238
|
|
|
|
239
|
|
|
$shop_name = (getenv('SHOP_NAME') ? getenv('SHOP_NAME') : 'EC-CUBE SHOP'); |
|
|
|
|
240
|
|
|
$admin_mail = (getenv('ADMIN_MAIL') ? getenv('ADMIN_MAIL') : '[email protected]'); |
241
|
|
|
$sql = "INSERT INTO dtb_base_info (id, shop_name, email01, email02, email03, email04, update_date, option_product_tax_rule) VALUES (1, :shop_name, :admin_mail1, :admin_mail2, :admin_mail3, :admin_mail4, current_timestamp, 0)"; |
242
|
|
|
$stmt = $pdo->prepare($sql); |
243
|
|
|
$stmt->execute( |
244
|
|
|
array( |
245
|
|
|
':shop_name' => $login_id, |
246
|
|
|
':admin_mail1' => $admin_mail, |
247
|
|
|
':admin_mail2' => $admin_mail, |
248
|
|
|
':admin_mail3' => $admin_mail, |
249
|
|
|
':admin_mail4' => $admin_mail, |
250
|
|
|
) |
251
|
|
|
); |
252
|
|
|
$stmt->closeCursor(); |
253
|
|
|
} |
254
|
|
|
|
255
|
|
|
function createConfigFiles($database_driver) |
|
|
|
|
256
|
|
|
{ |
257
|
|
|
$config_path = __DIR__.'/app/config/eccube'; |
258
|
|
|
createYaml(getConfig(), $config_path.'/config.yml'); |
259
|
|
|
createYaml(getDatabaseConfig($database_driver), $config_path.'/database.yml'); |
260
|
|
|
createYaml(getMailConfig(), $config_path.'/mail.yml'); |
261
|
|
|
createYaml(getPathConfig(), $config_path.'/path.yml'); |
262
|
|
|
} |
263
|
|
|
|
264
|
|
|
function createYaml($config, $path) |
|
|
|
|
265
|
|
|
{ |
266
|
|
|
$content = \Symfony\Component\Yaml\Yaml::dump($config); |
267
|
|
|
$fs = new \Symfony\Component\Filesystem\Filesystem(); |
268
|
|
|
$fs->dumpFile($path, $content); |
269
|
|
|
} |
270
|
|
|
|
271
|
|
|
function getConfig() |
|
|
|
|
272
|
|
|
{ |
273
|
|
|
$config = array ( |
274
|
|
|
'auth_magic' => \Eccube\Util\Str::random(32), |
275
|
|
|
'password_hash_algos' => 'sha256', |
276
|
|
|
'shop_name' => (getenv('SHOP_NAME') ? getenv('SHOP_NAME') : 'admin'), |
277
|
|
|
'force_ssl' => NULL, |
|
|
|
|
278
|
|
|
'admin_allow_host' => |
279
|
|
|
array ( |
|
|
|
|
280
|
|
|
), |
281
|
|
|
'cookie_lifetime' => 0, |
282
|
|
|
'locale' => 'ja', |
283
|
|
|
'timezone' => 'Asia/Tokyo', |
284
|
|
|
'eccube_install' => 1, |
285
|
|
|
); |
286
|
|
|
return $config; |
|
|
|
|
287
|
|
|
} |
288
|
|
|
|
289
|
|
|
function getDatabaseConfig($database_driver) |
|
|
|
|
290
|
|
|
{ |
291
|
|
|
$database = array ( |
|
|
|
|
292
|
|
|
'database' => |
293
|
|
|
array ( |
294
|
|
|
'driver' => $database_driver, |
295
|
|
|
) |
296
|
|
|
); |
297
|
|
|
|
298
|
|
|
switch ($database_driver) { |
299
|
|
|
case 'pdo_sqlite': |
300
|
|
|
$database['database']['dbname'] = $database['database']['path'] = __DIR__.'/app/config/eccube/eccube.db'; |
301
|
|
|
|
302
|
|
|
break; |
303
|
|
|
case 'pdo_mysql': |
304
|
|
|
$database['database']['host'] = (getenv('DBSERVER') ? getenv('DBSERVER') : 'localhost'); |
305
|
|
|
|
306
|
|
|
$database['database']['dbname'] = (getenv('DBNAME') ? getenv('DBNAME') : 'cube3_dev'); |
307
|
|
|
$database['database']['user'] = (getenv('DBUSER') ? getenv('DBUSER') : 'cube3_dev_user'); |
308
|
|
|
$database['database']['port'] = (getenv('DBPORT') ? getenv('DBPORT') : '3306'); |
309
|
|
|
if (getenv('TRAVIS')) { |
310
|
|
|
$database['database']['password'] = ''; |
311
|
|
|
} else { |
312
|
|
|
$database['database']['password'] = (getenv('DBPASS') ? getenv('DBPASS') : 'password'); |
313
|
|
|
} |
314
|
|
|
break; |
315
|
|
|
case 'pdo_pgsql': |
316
|
|
|
$database['database']['host'] = (getenv('DBSERVER') ? getenv('DBSERVER') : 'localhost'); |
317
|
|
|
|
318
|
|
|
$database['database']['dbname'] = (getenv('DBNAME') ? getenv('DBNAME') : 'cube3_dev'); |
319
|
|
|
$database['database']['user'] = (getenv('DBUSER') ? getenv('DBUSER') : 'cube3_dev_user'); |
320
|
|
|
$database['database']['password'] = (getenv('DBPASS') ? getenv('DBPASS') : 'password'); |
321
|
|
|
$database['database']['port'] = (getenv('DBPORT') ? getenv('DBPORT') : '5432'); |
322
|
|
|
break; |
323
|
|
|
} |
324
|
|
|
$database['database']['charset'] = 'utf8'; |
325
|
|
|
$database['database']['defaultTableOptions'] = array('collate' => 'utf8_general_ci'); |
326
|
|
|
return $database; |
|
|
|
|
327
|
|
|
} |
328
|
|
|
|
329
|
|
|
function getMailConfig() |
|
|
|
|
330
|
|
|
{ |
331
|
|
|
$mail = array ( |
332
|
|
|
'mail' => |
333
|
|
|
array ( |
334
|
|
|
'transport' => (getenv('MAIL_BACKEND') ? getenv('MAIL_BACKEND') : 'smtp'), |
335
|
|
|
'host' => (getenv('MAIL_HOST') ? getenv('MAIL_HOST') : 'localhost'), |
336
|
|
|
'port' => (getenv('MAIL_PORT') ? getenv('MAIL_PORT') : 25), |
337
|
|
|
'username' => (getenv('MAIL_USER') ? getenv('MAIL_USER') : null), |
338
|
|
|
'password' => (getenv('MAIL_PASS') ? getenv('MAIL_PASS') : null), |
339
|
|
|
'encryption' => NULL, |
|
|
|
|
340
|
|
|
'auth_mode' => NULL, |
|
|
|
|
341
|
|
|
'charset_iso_2022_jp' => false, |
342
|
|
|
), |
343
|
|
|
); |
344
|
|
|
return $mail; |
|
|
|
|
345
|
|
|
} |
346
|
|
|
|
347
|
|
|
function getPathConfig() |
|
|
|
|
348
|
|
|
{ |
349
|
|
|
$root_dir = realpath(__DIR__); |
350
|
|
|
// TODO path.yml.dist から取得したい |
351
|
|
|
// TODO root_urlpath を指定できるようにする |
352
|
|
|
$path = array ( |
353
|
|
|
'root' => '/', |
354
|
|
|
'admin_dir' => (getenv('ADMIN_ROUTE') ? getenv('ADMIN_ROUTE') : 'admin'), |
355
|
|
|
'tpl' => '/user_data/packages/default/', |
356
|
|
|
'admin_tpl' => '/user_data/packages/admin/', |
357
|
|
|
'image_path' => '/upload/save_image/', |
358
|
|
|
'root_dir' => $root_dir, |
359
|
|
|
'root_urlpath' => NULL, |
|
|
|
|
360
|
|
|
'template_code' => 'default', |
361
|
|
|
'admin_route' => 'admin', |
362
|
|
|
'user_data_route' => 'user_data', |
363
|
|
|
'public_path' => '/html', |
364
|
|
|
'public_path_realdir' => $root_dir.'/html', |
365
|
|
|
'image_save_realdir' => $root_dir.'/html/upload/save_image', |
366
|
|
|
'image_temp_realdir' => $root_dir.'/html/upload/temp_image', |
367
|
|
|
'user_data_realdir' => $root_dir.'/html/user_data', |
368
|
|
|
'block_default_realdir' => $root_dir.'/src/Eccube/Resource/template/default/Block', |
369
|
|
|
'block_realdir' => $root_dir.'/app/template/default/Block', |
370
|
|
|
'template_default_realdir' => $root_dir.'/src/Eccube/Resource/template/default', |
371
|
|
|
'template_default_html_realdir' => $root_dir.'/html/template/default', |
372
|
|
|
'template_admin_realdir' => $root_dir.'/src/Eccube/Resource/template/admin', |
373
|
|
|
'template_admin_html_realdir' => $root_dir.'/html/template/admin', |
374
|
|
|
'template_realdir' => $root_dir.'/app/template/default', |
375
|
|
|
'template_html_realdir' => $root_dir.'/html/template/default', |
376
|
|
|
'template_temp_realdir' => $root_dir.'/app/cache/eccube/template', |
377
|
|
|
'csv_temp_realdir' => $root_dir.'/app/cache/eccube/csv', |
378
|
|
|
'plugin_realdir' => $root_dir.'/app/Plugin', |
379
|
|
|
'plugin_temp_realdir' => $root_dir.'/app/cache/plugin', |
380
|
|
|
'plugin_html_realdir' => $root_dir.'/html/plugin', |
381
|
|
|
'admin_urlpath' => '/template/admin', |
382
|
|
|
'front_urlpath' => '/template/default', |
383
|
|
|
'image_save_urlpath' => '/upload/save_image', |
384
|
|
|
'image_temp_urlpath' => '/upload/temp_image', |
385
|
|
|
'user_data_urlpath' => '/user_data', |
386
|
|
|
'plugin_urlpath' => '/plugin', |
387
|
|
|
); |
388
|
|
|
return $path; |
|
|
|
|
389
|
|
|
} |
390
|
|
|
|
391
|
|
|
/** |
|
|
|
|
392
|
|
|
* @link https://github.com/composer/windows-setup/blob/master/src/php/installer.php |
393
|
|
|
*/ |
394
|
|
|
function setUseAnsi($argv) |
|
|
|
|
395
|
|
|
{ |
396
|
|
|
// --no-ansi wins over --ansi |
397
|
|
|
if (in_array('--no-ansi', $argv)) { |
398
|
|
|
define('USE_ANSI', false); |
399
|
|
|
} elseif (in_array('--ansi', $argv)) { |
400
|
|
|
define('USE_ANSI', true); |
401
|
|
|
} else { |
402
|
|
|
// On Windows, default to no ANSI, except in ANSICON and ConEmu. |
403
|
|
|
// Everywhere else, default to ANSI if stdout is a terminal. |
404
|
|
|
define( |
405
|
|
|
'USE_ANSI', |
406
|
|
|
(DIRECTORY_SEPARATOR == '\\') |
407
|
|
|
? (false !== getenv('ANSICON') || 'ON' === getenv('ConEmuANSI')) |
408
|
|
|
: (function_exists('posix_isatty') && posix_isatty(1)) |
409
|
|
|
); |
410
|
|
|
} |
411
|
|
|
} |
412
|
|
|
|
413
|
|
|
/** |
|
|
|
|
414
|
|
|
* @link https://github.com/composer/windows-setup/blob/master/src/php/installer.php |
415
|
|
|
*/ |
416
|
|
|
function out($text, $color = null, $newLine = true) |
|
|
|
|
417
|
|
|
{ |
418
|
|
|
$styles = array( |
|
|
|
|
419
|
|
|
'success' => "\033[0;32m%s\033[0m", |
420
|
|
|
'error' => "\033[31;31m%s\033[0m", |
421
|
|
|
'info' => "\033[33;33m%s\033[0m" |
422
|
|
|
); |
423
|
|
|
$format = '%s'; |
424
|
|
|
if (isset($styles[$color]) && USE_ANSI) { |
425
|
|
|
$format = $styles[$color]; |
426
|
|
|
} |
427
|
|
|
if ($newLine) { |
428
|
|
|
$format .= PHP_EOL; |
429
|
|
|
} |
430
|
|
|
printf($format, $text); |
431
|
|
|
} |
432
|
|
|
|
The PSR-1: Basic Coding Standard recommends that a file should either introduce new symbols, that is classes, functions, constants or similar, or have side effects. Side effects are anything that executes logic, like for example printing output, changing ini settings or writing to a file.
The idea behind this recommendation is that merely auto-loading a class should not change the state of an application. It also promotes a cleaner style of programming and makes your code less prone to errors, because the logic is not spread out all over the place.
To learn more about the PSR-1, please see the PHP-FIG site on the PSR-1.