我正在尝试在 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.json
中laravel/framework
所需的illuminate/support
版本相同的版本。
感谢@biscii注意,应该使用:
"illuminate/support": "4.1.x"
而不是
"illuminate/support": "4.x"