未找到Laravel 4工作台类

Ray*_*Ray 16 php laravel laravel-4

我正试图在laravel 4中开发一个包 - 我第一次尝试一个包.我发现了一些我试图遵循的教程:

http://jasonlewis.me/article/laravel-4-develop-packages-using-the-workbench
Run Code Online (Sandbox Code Playgroud)

http://culttt.com/2013/06/24/creating-a-laravel-4-package/
Run Code Online (Sandbox Code Playgroud)

当然还有官方文件.

我已经按照基本结构来创建框架.但是在加载应用程序时,我得到一个类未找到错误.这与我放在app.php文件中的serviceprovider直接相关.

这是我在providers数组中的条目:

'Longestdrive\Calendar\CalendarServiceProvider'
Run Code Online (Sandbox Code Playgroud)

我的文件夹结构是:

 laravel/workbench/longestdrive/calendar/src/Longestdrive/Calendar
Run Code Online (Sandbox Code Playgroud)

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

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

}
Run Code Online (Sandbox Code Playgroud)

我已经双重检查拼写并从项目的根目录和程序包的根目录运行了一个composer dump-autoload.

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

产生错误的行是这样的:

C:\wamp\www\googleapi\laravel\vendor\laravel\framework\src\Illuminate\Foundation\ProviderRepository.php
Run Code Online (Sandbox Code Playgroud)

任何帮助赞赏

谢谢

更新:我按照workbench/package文件夹中的建议运行了一个作曲家更新,其响应没有更新.然后,我在项目的根目录中运行了作曲家,并产生了错误:

[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
Run Code Online (Sandbox Code Playgroud)

我可能早先发布了错误的错误行.完整的异常响应是:

Class 'Longestdrive\Calendar\CalendarServiceProvider' not found
Run Code Online (Sandbox Code Playgroud)

错误提取:

* @param \Illuminate\Foundation\Application $app
* @param string $provider
* @return \Illuminate\Support\ServiceProvider
*/
public function createProvider(Application $app, $provider)
{
return new $provider($app);
}
Run Code Online (Sandbox Code Playgroud)

我假设与服务提供者加载器没有找到CalendarServiceProvider有关?

小智 45

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


ilp*_*jin 21

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

所以基本上解剖一点,在bootstrap阶段,bootstrap/autoload.php加载时它会在最后运行:

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

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

$finder->in($path)->files()->name('autoload.php')->depth('<= 3');
Run Code Online (Sandbox Code Playgroud)


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


接下来在bootstrap/start.php其中定义"提供者" config/app.php并尝试加载它们中的每一个:

$providers = $config['providers'];
$app->getProviderRepository()->load($app, $providers);
Run Code Online (Sandbox Code Playgroud)

然后在 ProviderRepository.php

foreach ($providers as $provider)
{
    $instance = $this->createProvider($app, $provider);
Run Code Online (Sandbox Code Playgroud)

所以我们最终得到:

public function createProvider(Application $app, $provider)
{
    return new $provider($app); 
Run Code Online (Sandbox Code Playgroud)

它试图创建一个类的实例并没有真正自动加载.这就是抛出异常的原因!


结论...

  • 正如@Ray所说,通过删除他的服务从'providers' => array(没有错误抛出因为return new $myServiceDeclaredInProviderArray($app);永远不会为该服务激发.

  • 正如@Andrew Holt所说

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

他是绝对正确的,因为这创建了自动加载供应商目录和文件,一切正常,因为它找到自动加载文件:

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