rinvex/cortex-attributes

View on GitHub
src/Providers/AttributesServiceProvider.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

declare(strict_types=1);

namespace Cortex\Attributes\Providers;

use Illuminate\Routing\Router;
use Cortex\Attributes\Models\Attribute;
use Illuminate\Support\ServiceProvider;
use Rinvex\Support\Traits\ConsoleTools;
use Illuminate\Contracts\Events\Dispatcher;
use Illuminate\View\Compilers\BladeCompiler;
use Cortex\Attributes\Console\Commands\SeedCommand;
use Illuminate\Database\Eloquent\Relations\Relation;
use Cortex\Attributes\Console\Commands\InstallCommand;
use Cortex\Attributes\Console\Commands\MigrateCommand;
use Cortex\Attributes\Console\Commands\PublishCommand;
use Cortex\Attributes\Console\Commands\RollbackCommand;

class AttributesServiceProvider extends ServiceProvider
{
    use ConsoleTools;

    /**
     * The commands to be registered.
     *
     * @var array
     */
    protected $commands = [
        SeedCommand::class => 'command.cortex.attributes.seed',
        InstallCommand::class => 'command.cortex.attributes.install',
        MigrateCommand::class => 'command.cortex.attributes.migrate',
        PublishCommand::class => 'command.cortex.attributes.publish',
        RollbackCommand::class => 'command.cortex.attributes.rollback',
    ];

    /**
     * Register any application services.
     *
     * This service provider is a great spot to register your various container
     * bindings with the application. As you can see, we are registering our
     * "Registrar" implementation here. You can add your own bindings too!
     *
     * @return void
     */
    public function register(): void
    {
        // Bind eloquent models to IoC container
        $this->app['config']['rinvex.attributes.models.attribute'] === Attribute::class
        || $this->app->alias('rinvex.attributes.attribute', Attribute::class);

        // Register console commands
        $this->registerCommands($this->commands);
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot(Router $router, Dispatcher $dispatcher): void
    {
        // Bind route models and constrains
        $router->pattern('attribute', '[a-zA-Z0-9-_]+');
        $router->model('attribute', config('rinvex.attributes.models.attribute'));

        // Map relations
        Relation::morphMap([
            'attribute' => config('rinvex.attributes.models.attribute'),
        ]);

        // Add default attributes types
        Attribute::typeMap([
            'integer' => \Rinvex\Attributes\Models\Type\Integer::class,
            'boolean' => \Rinvex\Attributes\Models\Type\Boolean::class,
            'select' => \Rinvex\Attributes\Models\Type\Varchar::class,
            'textarea' => \Rinvex\Attributes\Models\Type\Text::class,
            'radio' => \Rinvex\Attributes\Models\Type\Varchar::class,
            'check' => \Rinvex\Attributes\Models\Type\Varchar::class,
            'text' => \Rinvex\Attributes\Models\Type\Varchar::class,
        ]);

        // Register blade extensions
        $this->registerBladeExtensions();
    }

    /**
     * Register the blade extensions.
     *
     * @return void
     */
    protected function registerBladeExtensions(): void
    {
        $this->app->afterResolving('blade.compiler', function (BladeCompiler $bladeCompiler) {
            // @attributes($entity)
            $bladeCompiler->directive('attributes', function ($expression) {
                return "<?php echo {$expression}->getEntityAttributes()->map->render({$expression}, app('request.accessarea'))->implode('') ?: view('cortex/attributes::".app('request.accessarea').".partials.no-results'); ?>";
            });
        });
    }
}