Completed
Push — master ( 460827...4b7807 )
by Christian
12:37
created

src/DependencyInjection/Configuration.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the Sonata Project package.
7
 *
8
 * (c) Thomas Rabaix <[email protected]>
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 */
13
14
namespace Sonata\MediaBundle\DependencyInjection;
15
16
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
17
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
18
use Symfony\Component\Config\Definition\ConfigurationInterface;
19
20
/**
21
 * This is the class that validates and merges configuration from your app/config files.
22
 *
23
 * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html#cookbook-bundles-extension-config-class}
24
 */
25
/**
26
 * @final since sonata-project/media-bundle 3.x
27
 */
28
class Configuration implements ConfigurationInterface
29
{
30
    /**
31
     * NEXT_MAJOR: make constant protected/private.
32
     */
33
    public const DB_DRIVERS = ['doctrine_orm', 'doctrine_mongodb', 'doctrine_phpcr', 'no_driver'];
34
35
    /**
36
     * {@inheritdoc}
37
     */
38
    public function getConfigTreeBuilder()
39
    {
40
        $treeBuilder = new TreeBuilder('sonata_media');
41
42
        // Keep compatibility with symfony/config < 4.2
43
        if (!method_exists($treeBuilder, 'getRootNode')) {
44
            $node = $treeBuilder->root('sonata_media');
0 ignored issues
show
Deprecated Code introduced by
The method Symfony\Component\Config...der\TreeBuilder::root() has been deprecated with message: since Symfony 4.3, pass the root name to the constructor instead

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
45
        } else {
46
            $node = $treeBuilder->getRootNode();
47
        }
48
49
        $node
50
            ->children()
51
                ->scalarNode('db_driver')
52
                    ->defaultValue('no_driver')
53
                    ->info('Choose persistence mechanism driver from the following list: "doctrine_orm", "doctrine_mongodb", "doctrine_phpcr"')
54
                    ->validate()
55
                        ->ifNotInArray(self::DB_DRIVERS)
56
                        ->thenInvalid('SonataMediaBundle - Invalid db driver %s.')
57
                    ->end()
58
                ->end()
59
                ->scalarNode('default_context')->isRequired()->end()
60
                ->scalarNode('category_manager')
61
                    ->defaultValue('sonata.media.manager.category.default')
62
                ->end()
63
                ->booleanNode('force_disable_category')
64
                    ->info('true IF you really want to disable the relation with category')
65
                    ->defaultFalse()
66
                ->end()
67
                ->arrayNode('admin_format')
68
                    ->info('Configures the thumbnail preview for the admin')
69
                    ->addDefaultsIfNotSet()
70
                    ->children()
71
                        ->scalarNode('width')->defaultValue(200)->end()
72
                        ->scalarNode('height')->defaultValue(null)->end()
73
                        ->scalarNode('quality')->defaultValue(90)->end()
74
                        ->scalarNode('format')->defaultValue('jpg')->end()
75
                        ->scalarNode('constraint')->defaultValue(true)->end()
76
                    ->end()
77
                ->end()
78
            ->end()
79
        ;
80
81
        $this->addContextsSection($node);
82
        $this->addCdnSection($node);
83
        $this->addFilesystemSection($node);
84
        $this->addProvidersSection($node);
85
        $this->addExtraSection($node);
86
        $this->addModelSection($node);
87
        $this->addBuzzSection($node);
88
        $this->addResizerSection($node);
89
        $this->addAdapterSection($node);
90
91
        return $treeBuilder;
92
    }
93
94
    private function addContextsSection(ArrayNodeDefinition $node): void
95
    {
96
        $node
97
            ->children()
98
                ->arrayNode('contexts')
99
                    ->useAttributeAsKey('id')
100
                    ->prototype('array')
101
                        ->children()
102
                            ->arrayNode('download')
103
                                ->addDefaultsIfNotSet()
104
                                ->children()
105
                                    ->scalarNode('strategy')->defaultValue('sonata.media.security.superadmin_strategy')->end()
106
                                    ->scalarNode('mode')->defaultValue('http')->end()
107
                                ->end()
108
                            ->end()
109
                            ->arrayNode('providers')
110
                                ->prototype('scalar')
111
                                    ->defaultValue([])
112
                                ->end()
113
                            ->end()
114
                            ->arrayNode('formats')
115
                                ->useAttributeAsKey('id')
116
                                ->prototype('array')
117
                                    ->children()
118
                                        ->scalarNode('width')->defaultValue(null)->end()
119
                                        ->scalarNode('height')->defaultValue(null)->end()
120
                                        ->scalarNode('quality')->defaultValue(80)->end()
121
                                        ->scalarNode('format')->defaultValue('jpg')->end()
122
                                        ->scalarNode('constraint')->defaultValue(true)->end()
123
                                        ->scalarNode('resizer')->defaultNull()->end()
124
                                        ->arrayNode('resizer_options')
125
                                            ->info('options directly passed to selected resizer. e.g. {use_crop: true, crop_gravity: center}')
126
                                            ->defaultValue([])
127
                                            ->useAttributeAsKey('name')
128
                                            ->prototype('scalar')
129
                                        ->end()
130
                                    ->end()
131
                                ->end()
132
                            ->end()
133
                        ->end()
134
                    ->end()
135
                ->end()
136
            ->end()
137
        ;
138
    }
139
140
    private function addCdnSection(ArrayNodeDefinition $node): void
141
    {
142
        $node
143
            ->children()
144
                ->arrayNode('cdn')
145
                    ->children()
146
                        ->arrayNode('server')
147
                            ->addDefaultsIfNotSet()
148
                            ->children()
149
                                ->scalarNode('path')->defaultValue('/uploads/media')->end()
150
                            ->end()
151
                        ->end()
152
153
                        ->arrayNode('panther')
154
                            ->children()
155
                                ->scalarNode('path')
156
                                    ->info('e.g. http://domain.pantherportal.com/uploads/media')
157
                                    ->isRequired()
158
                                ->end()
159
                                ->scalarNode('site_id')->isRequired()->end()
160
                                ->scalarNode('password')->isRequired()->end()
161
                                ->scalarNode('username')->isRequired()->end()
162
                            ->end()
163
                        ->end()
164
165
                        ->arrayNode('cloudfront')
166
                            ->children()
167
                                ->scalarNode('path')
168
                                    ->info('e.g. http://xxxxxxxxxxxxxx.cloudfront.net/uploads/media')
169
                                    ->isRequired()
170
                                ->end()
171
                                ->scalarNode('distribution_id')->isRequired()->end()
172
                                ->scalarNode('key')->isRequired()->end()
173
                                ->scalarNode('secret')->isRequired()->end()
174
                            ->end()
175
                        ->end()
176
177
                        ->arrayNode('fallback')
178
                            ->children()
179
                                ->scalarNode('master')->isRequired()->end()
180
                                ->scalarNode('fallback')->isRequired()->end()
181
                            ->end()
182
                        ->end()
183
                    ->end()
184
                ->end()
185
            ->end()
186
        ;
187
    }
188
189
    private function addFilesystemSection(ArrayNodeDefinition $node): void
190
    {
191
        $node
192
            ->children()
193
                ->arrayNode('filesystem')
194
                    ->children()
195
                        ->arrayNode('local')
196
                            ->addDefaultsIfNotSet()
197
                            ->children()
198
                                ->scalarNode('directory')->defaultValue('%kernel.root_dir%/../web/uploads/media')->end()
199
                                ->scalarNode('create')->defaultValue(false)->end()
200
                            ->end()
201
                        ->end()
202
203
                        ->arrayNode('ftp')
204
                            ->children()
205
                                ->scalarNode('directory')->isRequired()->end()
206
                                ->scalarNode('host')->isRequired()->end()
207
                                ->scalarNode('username')->isRequired()->end()
208
                                ->scalarNode('password')->isRequired()->end()
209
                                ->scalarNode('port')->defaultValue(21)->end()
210
                                ->scalarNode('passive')->defaultValue(false)->end()
211
                                ->scalarNode('create')->defaultValue(false)->end()
212
                                ->scalarNode('mode')->defaultValue(\defined('FTP_BINARY') ? FTP_BINARY : false)->end()
213
                            ->end()
214
                        ->end()
215
216
                        ->arrayNode('s3')
217
                            ->children()
218
                                ->scalarNode('directory')->defaultValue('')->end()
219
                                ->scalarNode('bucket')->isRequired()->end()
220
                                ->scalarNode('accessKey')->isRequired()->end()
221
                                ->scalarNode('secretKey')->isRequired()->end()
222
                                ->scalarNode('create')->defaultValue(false)->end()
223
                                ->scalarNode('storage')
224
                                    ->defaultValue('standard')
225
                                    ->validate()
226
                                    ->ifNotInArray(['standard', 'reduced'])
227
                                        ->thenInvalid('Invalid storage type - "%s"')
228
                                    ->end()
229
                                ->end()
230
                                ->scalarNode('cache_control')->defaultValue('')->end()
231
                                ->scalarNode('acl')
232
                                    ->defaultValue('public')
233
                                    ->validate()
234
                                    ->ifNotInArray(['private', 'public', 'open', 'auth_read', 'owner_read', 'owner_full_control'])
235
                                        ->thenInvalid('Invalid acl permission - "%s"')
236
                                    ->end()
237
                                ->end()
238
                                ->scalarNode('encryption')
239
                                    ->defaultValue('')
240
                                    ->validate()
241
                                    ->ifNotInArray(['aes256'])
242
                                        ->thenInvalid('Invalid encryption type - "%s"')
243
                                    ->end()
244
                                ->end()
245
                                ->scalarNode('region')->defaultValue('s3.amazonaws.com')->end()
246
                                ->scalarNode('version')->defaultValue('latest')->end()
247
                                ->enumNode('sdk_version')
248
                                    ->values([2, 3])
249
                                    ->defaultValue(2)
250
                                ->end()
251
                                ->arrayNode('meta')
252
                                    ->useAttributeAsKey('name')
253
                                    ->prototype('scalar')
254
                                    ->end()
255
                                ->end()
256
                            ->end()
257
                        ->end()
258
259
                        ->arrayNode('mogilefs')
260
                            ->children()
261
                                ->scalarNode('domain')->isRequired()->end()
262
                                ->arrayNode('hosts')
263
                                    ->prototype('scalar')->end()
264
                                    ->isRequired()
265
                                ->end()
266
                            ->end()
267
                        ->end()
268
269
                        ->arrayNode('replicate')
270
                            ->children()
271
                                ->scalarNode('master')->isRequired()->end()
272
                                ->scalarNode('slave')->isRequired()->end()
273
                            ->end()
274
                        ->end()
275
                        ->arrayNode('openstack')
276
                            ->children()
277
                                ->scalarNode('url')->isRequired()->end()
278
                                ->arrayNode('secret')
279
                                    ->children()
280
                                        ->scalarNode('username')->isRequired()->end()
281
                                        ->scalarNode('password')->isRequired()->end()
282
                                    ->end()
283
                                ->end()
284
                                ->scalarNode('region')->end()
285
                                ->scalarNode('containerName')->defaultValue('media')->end()
286
                                ->scalarNode('create_container')->defaultValue(false)->end()
287
                            ->end()
288
                        ->end()
289
                        ->arrayNode('rackspace')
290
                            ->children()
291
                                ->scalarNode('url')->isRequired()->end()
292
                                    ->arrayNode('secret')
293
                                        ->children()
294
                                            ->scalarNode('username')->isRequired()->end()
295
                                            ->scalarNode('apiKey')->isRequired()->end()
296
                                        ->end()
297
                                    ->end()
298
                                    ->scalarNode('region')->isRequired()->end()
299
                                    ->scalarNode('containerName')->defaultValue('media')->end()
300
                                    ->scalarNode('create_container')->defaultValue(false)->end()
301
                                ->end()
302
                            ->end()
303
                        ->end()
304
                    ->end()
305
                ->end()
306
            ->end()
307
        ;
308
    }
309
310
    private function addProvidersSection(ArrayNodeDefinition $node): void
311
    {
312
        $node
313
            ->children()
314
                ->arrayNode('providers')
315
                    ->addDefaultsIfNotSet()
316
                    ->children()
317
                        ->arrayNode('file')
318
                            ->addDefaultsIfNotSet()
319
                            ->children()
320
                                ->scalarNode('service')->defaultValue('sonata.media.provider.file')->end()
321
                                ->scalarNode('resizer')->defaultValue(false)->end()
322
                                ->scalarNode('filesystem')->defaultValue('sonata.media.filesystem.local')->end()
323
                                ->scalarNode('cdn')->defaultValue('sonata.media.cdn.server')->end()
324
                                ->scalarNode('generator')->defaultValue('sonata.media.generator.default')->end()
325
                                ->scalarNode('thumbnail')->defaultValue('sonata.media.thumbnail.format')->end()
326
                                ->arrayNode('allowed_extensions')
327
                                    ->prototype('scalar')->end()
328
                                    ->defaultValue([
329
                                        'pdf', 'txt', 'rtf',
330
                                        'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx',
331
                                        'odt', 'odg', 'odp', 'ods', 'odc', 'odf', 'odb',
332
                                        'csv',
333
                                        'xml',
334
                                    ])
335
                                ->end()
336
                                ->arrayNode('allowed_mime_types')
337
                                    ->prototype('scalar')->end()
338
                                    ->defaultValue([
339
                                        'application/pdf', 'application/x-pdf', 'application/rtf', 'text/html', 'text/rtf', 'text/plain',
340
                                        'application/excel', 'application/msword', 'application/vnd.ms-excel', 'application/vnd.ms-powerpoint',
341
                                        'application/vnd.ms-powerpoint', 'application/vnd.oasis.opendocument.text', 'application/vnd.oasis.opendocument.graphics', 'application/vnd.oasis.opendocument.presentation', 'application/vnd.oasis.opendocument.spreadsheet', 'application/vnd.oasis.opendocument.chart', 'application/vnd.oasis.opendocument.formula', 'application/vnd.oasis.opendocument.database', 'application/vnd.oasis.opendocument.image',
342
                                        'text/comma-separated-values',
343
                                        'text/xml', 'application/xml',
344
                                        'application/zip', // seems to be used for xlsx document ...
345
                                    ])
346
                                ->end()
347
                            ->end()
348
                        ->end()
349
350
                        ->arrayNode('image')
351
                            ->addDefaultsIfNotSet()
352
                            ->children()
353
                                ->scalarNode('service')->defaultValue('sonata.media.provider.image')->end()
354
                                ->scalarNode('resizer')->defaultValue('sonata.media.resizer.default')->end()
355
                                ->scalarNode('filesystem')->defaultValue('sonata.media.filesystem.local')->end()
356
                                ->scalarNode('cdn')->defaultValue('sonata.media.cdn.server')->end()
357
                                ->scalarNode('generator')->defaultValue('sonata.media.generator.default')->end()
358
                                ->scalarNode('thumbnail')->defaultValue('sonata.media.thumbnail.format')->end()
359
                                ->scalarNode('adapter')->defaultValue('sonata.media.adapter.image.default')->end()
360
                                ->arrayNode('allowed_extensions')
361
                                    ->prototype('scalar')->end()
362
                                    ->defaultValue(['jpg', 'png', 'jpeg'])
363
                                ->end()
364
                                ->arrayNode('allowed_mime_types')
365
                                    ->prototype('scalar')->end()
366
                                    ->defaultValue([
367
                                        'image/pjpeg',
368
                                        'image/jpeg',
369
                                        'image/png',
370
                                        'image/x-png',
371
                                    ])
372
                                ->end()
373
                            ->end()
374
                        ->end()
375
376
                        ->arrayNode('youtube')
377
                            ->addDefaultsIfNotSet()
378
                            ->children()
379
                                ->scalarNode('service')->defaultValue('sonata.media.provider.youtube')->end()
380
                                ->scalarNode('resizer')->defaultValue('sonata.media.resizer.default')->end()
381
                                ->scalarNode('filesystem')->defaultValue('sonata.media.filesystem.local')->end()
382
                                ->scalarNode('cdn')->defaultValue('sonata.media.cdn.server')->end()
383
                                ->scalarNode('generator')->defaultValue('sonata.media.generator.default')->end()
384
                                ->scalarNode('thumbnail')->defaultValue('sonata.media.thumbnail.format')->end()
385
                                ->scalarNode('html5')->defaultValue(false)->end()
386
                            ->end()
387
                        ->end()
388
389
                        ->arrayNode('dailymotion')
390
                            ->addDefaultsIfNotSet()
391
                            ->children()
392
                                ->scalarNode('service')->defaultValue('sonata.media.provider.dailymotion')->end()
393
                                ->scalarNode('resizer')->defaultValue('sonata.media.resizer.default')->end()
394
                                ->scalarNode('filesystem')->defaultValue('sonata.media.filesystem.local')->end()
395
                                ->scalarNode('cdn')->defaultValue('sonata.media.cdn.server')->end()
396
                                ->scalarNode('generator')->defaultValue('sonata.media.generator.default')->end()
397
                                ->scalarNode('thumbnail')->defaultValue('sonata.media.thumbnail.format')->end()
398
                            ->end()
399
                        ->end()
400
401
                        ->arrayNode('vimeo')
402
                            ->addDefaultsIfNotSet()
403
                            ->children()
404
                                ->scalarNode('service')->defaultValue('sonata.media.provider.vimeo')->end()
405
                                ->scalarNode('resizer')->defaultValue('sonata.media.resizer.default')->end()
406
                                ->scalarNode('filesystem')->defaultValue('sonata.media.filesystem.local')->end()
407
                                ->scalarNode('cdn')->defaultValue('sonata.media.cdn.server')->end()
408
                                ->scalarNode('generator')->defaultValue('sonata.media.generator.default')->end()
409
                                ->scalarNode('thumbnail')->defaultValue('sonata.media.thumbnail.format')->end()
410
                            ->end()
411
                        ->end()
412
                    ->end()
413
                ->end()
414
            ->end()
415
        ;
416
    }
417
418
    private function addExtraSection(ArrayNodeDefinition $node): void
419
    {
420
        $node
421
            ->children()
422
                ->arrayNode('pixlr')
423
                    ->info('More info at https://pixlr.com/')
424
                    ->addDefaultsIfNotSet()
425
                    ->children()
426
                        ->scalarNode('enabled')->defaultValue(false)->end()
427
                        ->scalarNode('secret')->defaultValue(sha1(uniqid((string) random_int(1, 9999), true)))->end()
428
                        ->scalarNode('referrer')->defaultValue('Sonata Media')->end()
429
                    ->end()
430
                ->end()
431
            ->end()
432
        ;
433
    }
434
435
    private function addModelSection(ArrayNodeDefinition $node): void
436
    {
437
        $node
438
            ->children()
439
                ->arrayNode('class')
440
                    ->addDefaultsIfNotSet()
441
                    ->children()
442
                        ->scalarNode('media')->defaultValue('Application\\Sonata\\MediaBundle\\Entity\\Media')->end()
443
                        ->scalarNode('gallery')->defaultValue('Application\\Sonata\\MediaBundle\\Entity\\Gallery')->end()
444
                        ->scalarNode('gallery_item')->defaultValue('Application\\Sonata\\MediaBundle\\Entity\\GalleryItem')->end()
445
                        ->scalarNode('category')->defaultValue('Application\\Sonata\\ClassificationBundle\\Entity\\Category')->end()
446
                        ->end()
447
                    ->end()
448
                ->end()
449
            ->end()
450
        ;
451
    }
452
453
    private function addBuzzSection(ArrayNodeDefinition $node): void
454
    {
455
        $node
456
            ->children()
457
                ->arrayNode('buzz')
458
                    ->addDefaultsIfNotSet()
459
                    ->children()
460
                        ->scalarNode('connector')->defaultValue('sonata.media.buzz.connector.curl')->end()
461
                        ->arrayNode('client')
462
                        ->addDefaultsIfNotSet()
463
                        ->children()
464
                            ->booleanNode('ignore_errors')->defaultValue(true)->end()
465
                            ->scalarNode('max_redirects')->defaultValue(5)->end()
466
                            ->scalarNode('timeout')->defaultValue(5)->end()
467
                            ->booleanNode('verify_peer')->defaultValue(true)->end()
468
                            ->scalarNode('proxy')->defaultNull()->end()
469
                        ->end()
470
                    ->end()
471
                ->end()
472
            ->end()
473
        ;
474
    }
475
476
    private function addResizerSection(ArrayNodeDefinition $node): void
477
    {
478
        $node
479
            ->children()
480
                ->arrayNode('resizer')
481
                    ->addDefaultsIfNotSet()
482
                    ->children()
483
                        ->arrayNode('simple')
484
                            ->addDefaultsIfNotSet()
485
                            ->children()
486
                                ->scalarNode('mode')->defaultValue('inset')->end()
487
                            ->end()
488
                        ->end()
489
                        ->arrayNode('square')
490
                            ->addDefaultsIfNotSet()
491
                            ->children()
492
                                ->scalarNode('mode')->defaultValue('inset')->end()
493
                            ->end()
494
                        ->end()
495
                    ->end()
496
                ->end()
497
                ->arrayNode('resizers')
498
                    ->addDefaultsIfNotSet()
499
                    ->children()
500
                        ->scalarNode('default')->defaultValue('sonata.media.resizer.simple')->end()
501
                    ->end()
502
                ->end()
503
            ->end()
504
        ;
505
    }
506
507
    private function addAdapterSection(ArrayNodeDefinition $node): void
508
    {
509
        $node
510
            ->children()
511
                ->arrayNode('adapters')
512
                    ->addDefaultsIfNotSet()
513
                    ->children()
514
                        ->scalarNode('default')->defaultValue('sonata.media.adapter.image.gd')->end()
515
                    ->end()
516
                ->end()
517
            ->end()
518
        ;
519
    }
520
}
521