Marcin Nabiałek
Marcin Nabiałek

Reputation: 111839

Provider class not found

I've created provider class and put it into app/models/Providers directory:

<?php

//app/models/Providers/NiceUrlServiceProvider.php

namespace Providers;

use Illuminate\Support\ServiceProvider;

class NiceUrlServiceProvider extends ServiceProvider {

    public function register()
    {
        $this->app->bind('niceurl', function()
            {
                return new \Utils\NiceUrl();
            });
    }    
}

and facade class in app/models/Facades directory:

<?php

// app/models/Facades/NiceUrl.php
namespace Facades;

use Illuminate\Support\Facades\Facade;

class NiceUrl extends Facade {

    protected static function getFacadeAccessor() { return 'niceurl'; }

}

I have also edited app/config/app.php and added this as provider:

'providers' => array(

    // default ones  
    'Providers\NiceUrlServiceProvider',    
),

and added alias to Facade:

'aliases' => array(

     // default ones
    'NiceUrl'         => 'Facades\NiceUrl',

),

When I try to run my app I get:

Class 'Providers\NiceUrlServiceProvider' not found

    *
* @param \Illuminate\Foundation\Application $app
* @param string $provider
* @return \Illuminate\Support\ServiceProvider
*/
public function createProvider(Application $app, $provider)
{
return new $provider($app); // this line marked as causing problem
}

However if I comment the line where I add my provider and in public/index.php put this code at the end of file:

$x = new \Providers\NiceUrlServiceProvider($app);
$x->register();
echo NiceUrl::create('some thing');

it works without a problem, so it does not seem to be a problem with autoloading.

Also if I register provider manually using:

$app->register('Providers\NiceUrlServiceProvider');

echo NiceUrl::create('some thing');

at the end of public/index.php it is working without a problem.

Questions:

  1. How to make it work?
  2. Where should I hold providers/facades files? Here I put them into model directory into separate folders.

Upvotes: 0

Views: 1885

Answers (2)

Marcin Nabiałek
Marcin Nabiałek

Reputation: 111839

The solution was quite simple but it was not obvious at all. After adding your provider you need to run:

composer dump-autoload

in your main project directory. It will generate new autoload_classmap.php file that will include your service provider. composer-update in this case also will work but it's not neccessary and it will take much more time. It's quite strange that it's necessary when you put provider into app/config/app.php and it's not necessary when you manually register provider but this is how it works.

Upvotes: 1

Alireza Rahmani Khalili
Alireza Rahmani Khalili

Reputation: 2954

The solution was quite simple but it was not obvious at all. After adding your provider you need to run:

composer dump-autoload

when you add some folder or other classes which is not in your composer.json autoload you would add it then run the above command.

Upvotes: 0

Related Questions