Test Failed
Pull Request — main (#21)
by
unknown
12:39 queued 09:00
created

FormServiceProvider   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 88
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 1
Metric Value
wmc 7
eloc 29
c 2
b 0
f 1
dl 0
loc 88
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A register() 0 21 1
A provides() 0 3 1
A registerBladeDirectives() 0 15 4
A boot() 0 9 1
1
<?php
2
3
namespace Hafijul233\Form;
4
5
use Hafijul233\Form\Builders\FormBuilder;
6
use Hafijul233\Form\Providers\GroupFieldServiceProvider;
7
use Hafijul233\Form\Providers\HorizontalFieldServiceProvider;
8
use Hafijul233\Form\Providers\InlineFieldServiceProvider;
9
use Hafijul233\Form\Providers\LabelServiceProvider;
10
use Hafijul233\Form\Providers\NormalFieldServiceProvider;
11
use Illuminate\Contracts\Support\DeferrableProvider;
12
use Illuminate\Support\ServiceProvider;
13
use Illuminate\Support\Str;
14
use Illuminate\View\Compilers\BladeCompiler;
15
16
class FormServiceProvider extends ServiceProvider implements DeferrableProvider
17
{
18
    /**
19
     * Supported Blade Directives
20
     *
21
     * @var array
22
     */
23
    protected $directives = ['entities', 'decode', 'script', 'style', 'image', 'favicon', 'link', 'secureLink', 'linkAsset', 'linkSecureAsset', 'linkRoute', 'linkAction', 'mailto', 'email', 'ol', 'ul', 'dl', 'meta', 'tag', 'open', 'model', 'close', 'token', 'label', 'input', 'text', 'password', 'hidden', 'email', 'tel', 'number', 'date', 'datetime', 'datetimeLocal', 'time', 'url', 'file', 'textarea', 'select', 'selectRange', 'selectYear', 'selectMonth', 'getSelectOption', 'checkbox', 'radio', 'reset', 'image', 'color', 'submit', 'button', 'old'];
24
25
    /**
26
     * Boot the application events.
27
     *
28
     * @return void
29
     */
30
    public function boot()
31
    {
32
        $this->publishes([__DIR__.'/../config/form.php' => config_path('form.php')], 'form-config');
33
        $this->publishes([__DIR__.'/../resources/dist/assets' => public_path('vendor/form/assets')], 'form-assets');
34
        $this->publishes([__DIR__.'/../resources/views' => resource_path('views/vendor/form')], 'form-view');
35
36
        $this->mergeConfigFrom(__DIR__.'/../config/form.php', 'form');
37
        $this->loadViewsFrom(__DIR__.'/../resources/views', 'form');
38
        $this->loadRoutesFrom(__DIR__.'/../routes/web.php');
39
    }
40
41
    /**
42
     * Register the service provider.
43
     *
44
     * @return void
45
     */
46
    public function register()
47
    {
48
        $this->app->singleton('form', function ($app) {
49
            $form = new FormBuilder($app['view'], $app['session.store']->token(), $app['url'], $app['request']);
50
51
            return $form->setSessionStore($app['session.store']);
52
        });
53
54
        $this->app->alias('form', FormBuilder::class);
55
56
        $this->app->register(LabelServiceProvider::class);
57
58
        $this->app->register(HorizontalFieldServiceProvider::class);
59
60
        $this->app->register(GroupFieldServiceProvider::class);
61
62
        $this->app->register(InlineFieldServiceProvider::class);
63
64
        $this->app->register(NormalFieldServiceProvider::class);
65
66
        $this->registerBladeDirectives();
67
    }
68
69
    /**
70
     * Register Blade directives.
71
     *
72
     * @return void
73
     */
74
    protected function registerBladeDirectives()
75
    {
76
        $this->app->afterResolving('blade.compiler', function (BladeCompiler $bladeCompiler) {
77
            $namespaces = [
78
                'Form' => get_class_methods(FormBuilder::class),
79
            ];
80
81
            foreach ($namespaces as $namespace => $methods) {
82
                foreach ($methods as $method) {
83
                    if (in_array($method, $this->directives)) {
84
                        $snakeMethod = Str::snake($method);
85
                        $directive = strtolower($namespace).'_'.$snakeMethod;
86
87
                        $bladeCompiler->directive($directive, function ($expression) use ($namespace, $method) {
88
                            return "<?php echo $namespace::$method($expression); ?>";
89
                        });
90
                    }
91
                }
92
            }
93
        });
94
    }
95
96
    /**
97
     * Get the services provided by the provider.
98
     *
99
     * @return array
100
     */
101
    public function provides(): array
102
    {
103
        return ['form', FormBuilder::class];
104
    }
105
}
106