找不到 Laravel 4 工作台类


Laravel 4 workbench class not found

我正在尝试在 laravel 4 中开发一个包 - 我第一次尝试使用包。我找到了几个我试图遵循的教程:

http://jasonlewis.me/article/laravel-4-develop-packages-using-the-workbench

http://culttt.com/2013/06/24/creating-a-laravel-4-package/

当然还有官方文档中。

我遵循了基本结构来创建框架。但是在加载应用程序时,我收到一个找不到类的错误。这与我放置在应用程序.php文件中的服务提供商直接相关。

这是我在提供程序数组中的条目:

'Longestdrive'Calendar'CalendarServiceProvider'

我的文件夹结构是:

 laravel/workbench/longestdrive/calendar/src/Longestdrive/Calendar

我的服务提供商有以下条目:

<?php namespace Longestdrive'Calendar;
use Illuminate'Support'ServiceProvider;
class CalendarServiceProvider extends ServiceProvider {
    /**
     * Indicates if loading of the provider is deferred.
     *
     * @var bool
     */
    protected $defer = false;
    /**
     * Bootstrap the application events.
     *
     * @return void
     */
    public function boot()
    {
        $this->package('longestdrive/calendar');
    }
    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
    /**
     * Get the services provided by the provider.
     *
     * @return array
     */
    public function provides()
    {
        return array();
    }
}

我已经仔细检查了拼写,并从项目的根目录和包的根目录运行了作曲家转储自动加载。

我已经没有解决班级的想法了

,没有找到任何我出错的想法?

产生错误的行是这样的:

C:'wamp'www'googleapi'laravel'vendor'laravel'framework'src'Illuminate'Foundation'ProviderRepository.php

任何帮助表示赞赏

谢谢

更新:我按照工作台/包文件夹中的建议运行了作曲家更新,响应没有更新。然后我在项目的根目录下运行 compator,并产生了一个错误:

[RuntimeException]
  Error Output: PHP Fatal error:  Class 'Longestdrive'Calendar'CalendarServiceProvider' not found
   in C:'wamp'www'googleapi'laravel'vendor'laravel'framework'src'Illuminate'Foundation'ProviderRe
  pository.php on line 123

我之前可能发布了错误的错误行。完整的异常响应为:

Class 'Longestdrive'Calendar'CalendarServiceProvider' not found

错误提取:

* @param 'Illuminate'Foundation'Application $app
* @param string $provider
* @return 'Illuminate'Support'ServiceProvider
*/
public function createProvider(Application $app, $provider)
{
return new $provider($app);
}

我认为这与服务提供商加载器找不到日历服务提供商有关?

我发现从工作台/[供应商]/[包]文件夹中运行作曲家安装解决了这个问题。

我遇到了同样的错误,所以我更深入地了解了它的流程,以了解会发生什么。

所以基本上剖析一下,在引导阶段,当加载bootstrap/autoload.php时,它会在最后运行:

if (is_dir($workbench = __DIR__.'/../workbench'))
{
    Illuminate'Workbench'Starter::start($workbench);
}

这需要他找到的每一个workbench/vendor/package/**/**/**/autoload.php(通过使用Symfony Finder组件(

$finder->in($path)->files()->name('autoload.php')->depth('<= 3');

这很重要,因为它期望找到workbench/vendor/package/vendor/autoload.php

bootstrap/start.php中,它依次获取config/app.php中定义的"提供程序",并尝试加载每个提供程序:

$providers = $config['providers'];
$app->getProviderRepository()->load($app, $providers);

然后在ProviderRepository.php

foreach ($providers as $provider)
{
    $instance = $this->createProvider($app, $provider);

所以我们最终会得到:

public function createProvider(Application $app, $provider)
{
    return new $provider($app); 

它尝试创建类实例的位置并没有真正自动加载。所以这就是抛出异常的原因!

总之...

  • 正如@Ray所说,通过从'providers' => array(中删除他的服务,不会引发任何错误return new $myServiceDeclaredInProviderArray($app);因为该服务永远不会触发。

  • 正如霍尔特@Andrew所说

我发现从工作台/[供应商]/[包]文件夹中运行作曲家安装解决了这个问题。

他是绝对正确的,因为这会创建自动加载供应商目录和文件,并且一切都按照我们的预期工作,因为它可以找到自动加载文件:

$finder->in($path)->files()->name('autoload.php')->depth('<= 3');
  • 如果从提供程序数组中删除服务,php artisan dump-autoload也可以正常工作

除了@ilpaijin@Andrew Holt的答案之外,有时还需要(当有新版本的Laravel时(在workbench/vendor/package文件夹中运行composer update

此外,如此处所述,包中的composer.json必须需要与项目根目录composer.jsonlaravel/framework所需的illuminate/support版本相同的版本。

感谢@biscii注意,应该使用:

"illuminate/support": "4.1.x"

而不是

"illuminate/support": "4.x"