【发布时间】:2016-01-02 19:29:18
【问题描述】:
我正在为 Laravel 5 创建一个自定义包,并且遇到了 Laravel 无法为此找到服务提供商的问题,但只能在特定服务器上。在本地,我使用 Homestead 框在 Vagrant 下运行它,它运行良好。使用 git 将其推送到 Dreamhost VPS(Ubuntu),它给了我一个错误,它不能类 Figoliquinn\Quickbooksconnect\QuickbooksconnectServiceProvider。对我来说,这感觉像是一个命名空间问题,因为它在不同环境中的工作方式不同,但我无法找到原因。
包的文件夹结构是(来自 laravel 根目录):
* packages
|--* figoliquinn
|--* quickbooksconnect
|--* src
|--* QuickbooksconnectServiceProvider.php
QuickbooksconnectServiceProvider.php
<?php namespace Figoliquinn\Quickbooksconnect;
use Figoliquinn\Quickbooksconnect;
use Illuminate\Support\ServiceProvider;
use Illuminate\Routing\Router;
class QuickbooksconnectServiceprovider extends ServiceProvider {
/**
* Indicates if loading of the provider is deferred.
*
* @var bool
*/
protected $defer = false;
/**
* Bootstrap the application events.
*
* @return void
*/
public function boot()
{
// Get the views we'll need
$this->loadViewsFrom(__DIR__ . '/views', 'quickbooksconnect');
// Register our controller and routes
$this->app->router->group(['namespace' => 'Figoliquinn\Quickbooksconnect\Controllers'],
function(){
require __DIR__.'/routes.php';
});
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
}
}
这是我的 composer.json 文件在 Laravel 根目录中的样子:
{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"type": "project",
"require": {
"php": ">=5.5.9",
"laravel/framework": "5.1.*",
"illuminate/html": "~5.0",
"guzzlehttp/guzzle": "~5.3|~6.0",
"doctrine/dbal": "~2.3"
},
"require-dev": {
"fzaninotto/faker": "~1.4",
"mockery/mockery": "0.9.*",
"phpspec/phpspec": "~2.1"
},
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\\": "app/",
"Figoliquinn\\Quickbooksconnect\\": "packages/figoliquinn/quickbooksconnect/src/"
}
},
"autoload-dev": {
"classmap": [
"tests/TestCase.php"
],
"files": [
"app/helpers.php"
]
},
"scripts": {
"post-install-cmd": [
"php artisan clear-compiled",
"php artisan optimize"
],
"post-update-cmd": [
"php artisan clear-compiled",
"php artisan optimize"
],
"post-root-package-install": [
"php -r \"copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
"php artisan key:generate"
]
},
"config": {
"preferred-install": "dist"
},
"minimum-stability": "dev",
"prefer-stable": true
}
然后在 config/app.php 中添加它时,看起来像(仅缩写为提供程序部分):
'providers' => [
/*
* Laravel Framework Service Providers...
*/
Illuminate\Foundation\Providers\ArtisanServiceProvider::class,
Illuminate\Auth\AuthServiceProvider::class,
Illuminate\Broadcasting\BroadcastServiceProvider::class,
Illuminate\Bus\BusServiceProvider::class,
Illuminate\Cache\CacheServiceProvider::class,
Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
Illuminate\Routing\ControllerServiceProvider::class,
Illuminate\Cookie\CookieServiceProvider::class,
Illuminate\Database\DatabaseServiceProvider::class,
Illuminate\Encryption\EncryptionServiceProvider::class,
Illuminate\Filesystem\FilesystemServiceProvider::class,
Illuminate\Foundation\Providers\FoundationServiceProvider::class,
Illuminate\Hashing\HashServiceProvider::class,
Illuminate\Mail\MailServiceProvider::class,
Illuminate\Pagination\PaginationServiceProvider::class,
Illuminate\Pipeline\PipelineServiceProvider::class,
Illuminate\Queue\QueueServiceProvider::class,
Illuminate\Redis\RedisServiceProvider::class,
Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
Illuminate\Session\SessionServiceProvider::class,
Illuminate\Translation\TranslationServiceProvider::class,
Illuminate\Validation\ValidationServiceProvider::class,
Illuminate\View\ViewServiceProvider::class,
'Illuminate\Html\HtmlServiceProvider',
'Figoliquinn\Quickbooksconnect\QuickbooksConnectServiceProvider',
/*
* Application Service Providers...
*/
App\Providers\AppServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
'App\Providers\MacrosServiceProvider',
'App\Providers\CurrentOrgServiceProvider',
],
有什么我可能忽略的建议吗?
【问题讨论】:
-
你扔掉你的自动装载机了吗?
-
是的。 Figoliquinn 命名空间也出现在 vendor/composer/autoload_psr4.php 中。
-
嗯。您是否也在生产端这样做?自动加载器通常位于自动添加到 .gitignore 的 vendor 文件夹中
-
是的,这就是为什么感觉很奇怪。在 laravel 目录的根目录下多次运行 composer dump-autoload。
标签: laravel namespaces packages