16

我正在尝试在 laravel 4 中开发一个包——我第一次尝试一个包。我发现了一些我尝试过的教程:

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

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

当然在官方文档中。

我已经按照基本结构来创建框架。然而,在加载应用程序时,我得到一个找不到类的错误。这与我放置在 app.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();
    }

}

我已经仔细检查了拼写,并从项目的根目录和包的根目录运行了 composer dump-autoload。

我已经没有解决课程的想法没有找到我出错的任何想法?

产生错误的行是这一行:

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

我认为这与服务提供程序加载程序没有找到 CalendarServiceProvider 有关?

4

3 回答 3

45

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

于 2013-09-02T13:49:06.870 回答
21

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

所以基本上解剖一点,在引导阶段,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 Holt 所说

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

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

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

于 2013-11-22T11:23:15.763 回答
1

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

此外,正如这里所指出的,composer.json包内的 必须与项目根目录中illuminate/support所需的版本相同。laravel/frameworkcomposer.json

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

"illuminate/support": "4.1.x"

代替

"illuminate/support": "4.x"
于 2014-02-24T16:11:19.117 回答