找不到提供程序类

时间:2014-08-21 08:05:02

标签: php laravel laravel-4

我已经创建了提供程序类并将其放入app/models/Providers目录:

<?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();
            });
    }    
}

app/models/Facades目录中的facade类:

<?php

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

use Illuminate\Support\Facades\Facade;

class NiceUrl extends Facade {

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

}

我还编辑了app / config / app.php并将其添加为提供者:

'providers' => array(

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

并为Facade添加了别名:

'aliases' => array(

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

),

当我尝试运行我的应用时,我得到:

  

找不到类'Providers \ NiceUrlServiceProvider'

    *
* @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
}

但是,如果我评论我添加提供程序的行,并在public/index.php中将此代码放在文件末尾:

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

它没有问题,所以它似乎不是自动加载的问题。

此外,如果我使用以下方式手动注册提供商:

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

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

public/index.php结尾处它没有问题。

问题:

  1. 如何让它发挥作用?
  2. 我应该在哪里提供提供者/外观文件?在这里,我将它们放入model目录中的单独文件夹中。

2 个答案:

答案 0 :(得分:0)

解决方案很简单,但根本不明显。添加提供商后,您需要运行:

composer dump-autoload

在主项目目录中。它将生成包含您的服务提供商的新autoload_classmap.php文件。在这种情况下,composer-update也可以工作,但这不是必要的,而且需要更多的时间。很奇怪,当你将提供者放入app/config/app.php时这是必要的,而当你手动注册提供者时则没有必要,但这就是它的工作原理。

答案 1 :(得分:0)

解决方案很简单,但根本不明显。添加提供商后,您需要运行:

  

composer dump-autoload

当你添加一些不在你的composer.json自动加载中的文件夹或其他类时,你会添加它然后运行上面的命令。