未找到 Laravel 4 工作台类

2022-08-30 23:54:18

我正在尝试在 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

任何帮助赞赏

谢谢

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

[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);
}

我假设这与服务提供商加载程序找不到日历服务提供程序有关?


答案 1

我发现从工作台/[vendor]/[package]文件夹中运行 composer install 解决了这个问题。


答案 2

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

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

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

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

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


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


在它中连续获取定义的“提供程序”,并尝试加载每个提供程序:bootstrap/start.phpconfig/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霍尔特所说

我发现从工作台/[vendor]/[package]文件夹中运行 composer install 解决了这个问题。

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

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


推荐