Completed
Pull Request — master (#1163)
by Grégoire
02:51
created

Configuration   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 499
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Importance

Changes 0
Metric Value
dl 0
loc 499
rs 10
c 0
b 0
f 0
wmc 11
lcom 1
cbo 4

10 Methods

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