owenvoke / blade-fontawesome

A package to easily make use of Font Awesome in your Laravel Blade views.
https://packagist.org/packages/owenvoke/blade-fontawesome
MIT License
170 stars 30 forks source link

Unable to locate a class or view for component [fas-cloud] #6

Closed nguyentranchung closed 4 years ago

nguyentranchung commented 4 years ago

Description

I installed as instructed, but encountered an error

Facade\Ignition\Exceptions\ViewException Unable to locate a class or view for component [fas-cloud].

Environment

nguyentranchung commented 4 years ago

I debugged the result

image

fab-cloud not registered

I try edit code

        $this->callAfterResolving(Factory::class, function (Factory $factory) {
            $factory->add('fontawesome-brands', [
                'path' => __DIR__ . '/../resources/svg/brands',
                'prefix' => 'fab',
            ]);
            $factory->add('fontawesome-regular', [
                'path' => __DIR__ . '/../resources/svg/regular',
                'prefix' => 'far',
            ]);

            $factory->add('fontawesome-solid', [
                'path' => __DIR__ . '/../resources/svg/solid',
                'prefix' => 'fas',
            ]);

            $factory->registerComponents();
        });

See result:

image

driesvints commented 4 years ago

Please share how you're using the icons.

owenvoke commented 4 years ago

Hi @nguyentranchung, I haven't been able to replicate this issue. As @driesvints mentioned, could you share how you're using the icons?

I ran the following:

laravel new test && cd test
composer require owenvoke/blade-fontawesome

# add `{{ dd($this->compiler) }}` to `resources/views/welcome.blade.php`

Preview of resulting dd output

nguyentranchung commented 4 years ago

@driesvints @owenvoke I tried installing a new project so no problem happened.

But the current project has a problem, I don't understand where the problem is. image

image

I tried to register in blade-icons.php config.

<?php

return [
    'sets' => [
        'default' => [
            'path' => 'resources/svg',
            'prefix' => 'icon',
            'class' => '',
        ],
        'fontawesome-brands' => [
            'path' => 'vendor/owenvoke/blade-fontawesome/resources/svg/brands',
            'prefix' => 'fab',
            'class' => 'icon',
        ],
        'fontawesome-regular' => [
            'path' => 'vendor/owenvoke/blade-fontawesome/resources/svg/regular',
            'prefix' => 'far',
            'class' => 'icon',
        ],
        'fontawesome-solid' => [
            'path' => 'vendor/owenvoke/blade-fontawesome/resources/svg/solid',
            'prefix' => 'fas',
            'class' => 'icon',
        ],
    ],
    'class' => '',
];

throw CannotRegisterIconSet image

driesvints commented 4 years ago

I tried to register in blade-icons.php config.

You don't need to do that. The package does that for you.

You still haven't shared how you're using the icons. Please share the code and tell us where and how it's being used.

nguyentranchung commented 4 years ago

@driesvints in TestController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Blade;

class TestController extends Controller
{
    /**
     * Handle the incoming request.
     *
     * @param \Illuminate\Http\Request $request
     *
     * @return \Illuminate\Http\Response
     */
    public function __invoke(Request $request)
    {
        dump(\Blade::debug());
        return view('test');
    }
}

test.blade.php

<x-fas-cloud />

That's it

nguyentranchung commented 4 years ago

in vendor\owenvoke\blade-fontawesome\src\BladeFontAwesomeServiceProvider.php I add 1 line

<?php

declare(strict_types=1);

namespace OwenVoke\BladeFontAwesome;

use BladeUI\Icons\Factory;
use Illuminate\Support\ServiceProvider;

final class BladeFontAwesomeServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        $this->callAfterResolving(Factory::class, function (Factory $factory) {
            $factory->add('fontawesome-brands', [
                'path' => __DIR__ . '/../resources/svg/brands',
                'prefix' => 'fab',
            ]);

            $factory->add('fontawesome-regular', [
                'path' => __DIR__ . '/../resources/svg/regular',
                'prefix' => 'far',
            ]);

            $factory->add('fontawesome-solid', [
                'path' => __DIR__ . '/../resources/svg/solid',
                'prefix' => 'fas',
            ]);

            // ---------------------------------
            $factory->registerComponents();

        });

        if ($this->app->runningInConsole()) {
            $this->publishes([
                __DIR__ . '/../resources/svg' => public_path('vendor/blade-fontawesome'),
            ], 'blade-fontawesome');
        }
    }
}

image

It will be ok.

owenvoke commented 4 years ago

That method is already called in the main package, so I don't see why it would need to be called again. ๐Ÿค” Any thoughts @driesvints?

nguyentranchung commented 4 years ago

And then I comment out it, it's still ok. Because cache views image image image

nguyentranchung commented 4 years ago

After call

php artisan view:clear

image

nguyentranchung commented 4 years ago

This is my composer

{
"require": {
        "php": "^7.2.5",
        "artesaos/seotools": "^0.17.2",
        "calebporzio/sushi": "^2.0",
        "davejamesmiller/laravel-breadcrumbs": "^5.3",
        "fideloper/proxy": "^4.2",
        "fruitcake/laravel-cors": "^2.0",
        "glorand/laravel-model-settings": "^3.6",
        "guzzlehttp/guzzle": "^6.3",
        "jenssegers/agent": "^2.6",
        "kalnoy/nestedset": "^5.0",
        "kub-at/php-simple-html-dom-parser": "^1.9",
        "laracasts/flash": "^3.1",
        "laravel/framework": "^7.0",
        "laravel/scout": "^8.0",
        "laravel/socialite": "^4.4",
        "laravel/tinker": "^2.0",
        "nwidart/laravel-modules": "^7.1",
        "owenvoke/blade-fontawesome": "^1.1",
        "spatie/enum": "^2.3",
        "spatie/laravel-html": "^2.26",
        "spatie/laravel-medialibrary": "^7.19",
        "spatie/laravel-menu": "^3.5",
        "spatie/laravel-permission": "^3.13",
        "spatie/laravel-query-builder": "^2.8",
        "spatie/laravel-sitemap": "^5.7",
        "spatie/laravel-sluggable": "^2.2",
        "spatie/laravel-tags": "^2.6",
        "spatie/schema-org": "^2.14",
        "spatie/valuestore": "^1.2"
    },
    "require-dev": {
        "barryvdh/laravel-debugbar": "^3.3",
        "barryvdh/laravel-ide-helper": "^2.7",
        "beyondcode/laravel-query-detector": "^1.3",
        "facade/ignition": "^2.0",
        "fzaninotto/faker": "^1.9.1",
        "laravel/telescope": "^3.5",
        "laravel/ui": "^2.0",
        "mockery/mockery": "^1.3.1",
        "nunomaduro/collision": "^4.1",
        "phpunit/phpunit": "^8.5",
        "predis/predis": "^1.1"
    }
}

Is there any possibility of a conflict with another package?

nguyentranchung commented 4 years ago

@driesvints @owenvoke

image

The problem occurs because provider BladeIconsServiceProvider runs before BladeFontAwesomeServiceProvider

nguyentranchung commented 4 years ago

But in a completely new project, I got the opposite result

image

nguyentranchung commented 4 years ago

@driesvints @owenvoke I found the cause, this error will appear when you install the https://github.com/jeroennoten/Laravel-AdminLTE package.

owenvoke commented 4 years ago

@nguyentranchung, thanks for your thorough debugging of this. ๐Ÿค”

~Just trying to create a reproducible repository for testing, but the almasaeed2010/adminlte package isn't downloading from dist or source. ๐Ÿ˜~

I've created a reproducible example in the following repository: https://github.com/owenvoke/blade-fontawesome-adminlte-example


I'll have a look into this, not sure what would be causing this. ๐Ÿค” @driesvints, any thoughts? I haven't experienced this with any other packages I've used.

driesvints commented 4 years ago

Erhm, can anyone walk me through what the adminlte package does and how it affects icons?

nguyentranchung commented 4 years ago

@driesvints @owenvoke https://github.com/jeroennoten/Laravel-AdminLTE/blob/f860d992548048836d554bfca170fde19f1c3089/src/AdminLteServiceProvider.php#L43

Because function boot injects view factory, so view is not resolved.

driesvints commented 4 years ago

I'm guessing this would probably be solved if we bound Illuminate\Contracts\View\Factory instead. Can anyone try replacing

    private function bootComponents(): void
    {
        $this->callAfterResolving('view', function ($view, Application $app) {
            $app->make(Factory::class)->registerComponents();
        });
    }

with

    private function bootComponents(): void
    {
        $this->callAfterResolving(\Illuminate\Contracts\View\Factory::class, function ($view, Application $app) {
            $app->make(Factory::class)->registerComponents();
        });
    }

locally instead to see if that solved the problem?

owenvoke commented 4 years ago

@driesvints, just tested that and it doesn't seem to resolve the issue. ๐Ÿค”

I'm assuming you were meaning to try changing that in the Blade Icons service provider?

driesvints commented 4 years ago

yeah that's what I meant

owenvoke commented 4 years ago

Yeah, it still throws the same error about the component not being found. ๐Ÿ˜ฌ

driesvints commented 4 years ago

I think I know where the problem lies. Can you try moving

    private function bootComponents(): void
    {
        $this->callAfterResolving(\Illuminate\Contracts\View\Factory::class, function ($view, Application $app) {
            $app->make(Factory::class)->registerComponents();
        });
    }

To the register method instead?

owenvoke commented 4 years ago

I've moved it into the register method however it still seems to throw the error. ๐Ÿคจ Apologies for taking up so much of your time.

driesvints commented 4 years ago

No worries. I'll try it out myself when I find some free time. Appreciating any help until then.

driesvints commented 4 years ago

I've found the issue. The problem is indeed boot of Admin LTE getting executed before boot of blade-fontawesome. All callAfterResolving belong in register actually. I didn't thought this through enough. I'll pr a fix and patch up blade-icons as well.

driesvints commented 4 years ago

Sent in https://github.com/owenvoke/blade-fontawesome/pull/9 which solves this.

ahmeddabak commented 4 years ago

Just upgraded my laravel installation to V8.x. i am getting the same error when running php artisan optimize, it happens when laravel tries to cache the views.

Unable to locate a class or view for component [fas-eye].

on \src\Illuminate\View\Compilers\ComponentTagCompiler.php:274

The wierd thing is that i do not get any errors when running php artisan view:cache on its own.

so i added

dd($this->aliases);

at vendor/laravel/framework/src/Illuminate/View/Compilers/ComponentTagCompiler.php:249

when i ran php artisan view:cache i get a long list of components, but when i ran php artisan optimize i only got

array:1 [ "dynamic-component" => "Illuminate\View\DynamicComponent" ]

I will try to find out what is happening, i am using:

blade-ui-kit/blade-icons 0.4.5 owenvoke/blade-fontawesome v1.5.0

driesvints commented 4 years ago

@ahmeddabak we have the same issue on heroicons (and probably every blade icons library). I'm puzzled at what's causing this and appreciating any help.

https://github.com/blade-ui-kit/blade-heroicons/issues/9