0
votes

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.
2
What you call Nice URL is called URL slug, so you should better keep this terminologyYang
Also you're putting service namespaces in the model directory. You can do that, but it feels very wrong.David Barker

2 Answers

0
votes

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.

0
votes

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.