AttributesServiceProvider::boot()   B
last analyzed

Complexity

Conditions 7
Paths 16

Size

Total Lines 40

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 40
rs 8.3466
c 0
b 0
f 0
cc 7
nc 16
nop 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Cortex\Attributes\Providers;
6
7
use Illuminate\Routing\Router;
8
use Cortex\Attributes\Models\Attribute;
9
use Illuminate\Support\ServiceProvider;
10
use Rinvex\Support\Traits\ConsoleTools;
11
use Illuminate\View\Compilers\BladeCompiler;
12
use Cortex\Attributes\Console\Commands\SeedCommand;
13
use Illuminate\Database\Eloquent\Relations\Relation;
14
use Cortex\Attributes\Console\Commands\InstallCommand;
15
use Cortex\Attributes\Console\Commands\MigrateCommand;
16
use Cortex\Attributes\Console\Commands\PublishCommand;
17
use Cortex\Attributes\Console\Commands\RollbackCommand;
18
19
class AttributesServiceProvider extends ServiceProvider
20
{
21
    use ConsoleTools;
22
23
    /**
24
     * The commands to be registered.
25
     *
26
     * @var array
27
     */
28
    protected $commands = [
29
        SeedCommand::class => 'command.cortex.attributes.seed',
30
        InstallCommand::class => 'command.cortex.attributes.install',
31
        MigrateCommand::class => 'command.cortex.attributes.migrate',
32
        PublishCommand::class => 'command.cortex.attributes.publish',
33
        RollbackCommand::class => 'command.cortex.attributes.rollback',
34
    ];
35
36
    /**
37
     * Register any application services.
38
     *
39
     * This service provider is a great spot to register your various container
40
     * bindings with the application. As you can see, we are registering our
41
     * "Registrar" implementation here. You can add your own bindings too!
42
     *
43
     * @return void
44
     */
45
    public function register(): void
46
    {
47
        // Bind eloquent models to IoC container
48
        $this->app['config']['rinvex.attributes.models.attribute'] === Attribute::class
49
        || $this->app->alias('rinvex.attributes.attribute', Attribute::class);
50
51
        // Register console commands
52
        ! $this->app->runningInConsole() || $this->registerCommands();
53
    }
54
55
    /**
56
     * Bootstrap any application services.
57
     *
58
     * @return void
59
     */
60
    public function boot(Router $router): void
61
    {
62
        // Bind route models and constrains
63
        $router->pattern('attribute', '[a-zA-Z0-9-]+');
64
        $router->model('attribute', config('rinvex.attributes.models.attribute'));
65
66
        // Map relations
67
        Relation::morphMap([
68
            'attribute' => config('rinvex.attributes.models.attribute'),
69
        ]);
70
71
        // Load resources
72
        $this->loadRoutesFrom(__DIR__.'/../../routes/web/adminarea.php');
73
        $this->loadViewsFrom(__DIR__.'/../../resources/views', 'cortex/attributes');
74
        $this->loadTranslationsFrom(__DIR__.'/../../resources/lang', 'cortex/attributes');
75
        $this->app->runningInConsole() || $this->app->afterResolving('blade.compiler', function () {
76
            $accessarea = $this->app['request']->route('accessarea');
77
            ! file_exists($menus = __DIR__."/../../routes/menus/{$accessarea}.php") || require $menus;
78
            ! file_exists($breadcrumbs = __DIR__."/../../routes/breadcrumbs/{$accessarea}.php") || require $breadcrumbs;
79
        });
80
81
        // Add default attributes types
82
        Attribute::typeMap([
83
            'integer' => \Rinvex\Attributes\Models\Type\Integer::class,
84
            'boolean' => \Rinvex\Attributes\Models\Type\Boolean::class,
85
            'select' => \Rinvex\Attributes\Models\Type\Varchar::class,
86
            'textarea' => \Rinvex\Attributes\Models\Type\Text::class,
87
            'radio' => \Rinvex\Attributes\Models\Type\Varchar::class,
88
            'check' => \Rinvex\Attributes\Models\Type\Varchar::class,
89
            'text' => \Rinvex\Attributes\Models\Type\Varchar::class,
90
        ]);
91
92
        // Register blade extensions
93
        $this->registerBladeExtensions();
94
95
        // Publish Resources
96
        ! $this->app->runningInConsole() || $this->publishesLang('cortex/attributes', true);
97
        ! $this->app->runningInConsole() || $this->publishesViews('cortex/attributes', true);
98
        ! $this->app->runningInConsole() || $this->publishesMigrations('cortex/attributes', true);
99
    }
100
101
    /**
102
     * Register the blade extensions.
103
     *
104
     * @return void
105
     */
106
    protected function registerBladeExtensions(): void
107
    {
108
        $this->app->afterResolving('blade.compiler', function (BladeCompiler $bladeCompiler) {
109
            // @attributes($entity)
110
            $bladeCompiler->directive('attributes', function ($expression) {
111
                return "<?php echo {$expression}->getEntityAttributes()->map->render({$expression}, request()->route('accessarea'))->implode('') ?: view('cortex/attributes::".request()->route('accessarea').".partials.no-results'); ?>";
112
            });
113
        });
114
    }
115
}
116