Php 在Laravel 5中创建新的ServiceProvider/Facade作为包 介绍
我以前从未使用过框架(Zend、CakePHP等),最后决定坐下来学习一个。我从Laravel开始,因为代码看起来很漂亮,而且与我尝试安装的其他一些框架不同,“Hello,World!”示例在第一次尝试时起作用 目标 目前,我希望我的应用程序能做一些非常简单的事情:Php 在Laravel 5中创建新的ServiceProvider/Facade作为包 介绍,php,laravel,package,composer-php,laravel-5,Php,Laravel,Package,Composer Php,Laravel 5,我以前从未使用过框架(Zend、CakePHP等),最后决定坐下来学习一个。我从Laravel开始,因为代码看起来很漂亮,而且与我尝试安装的其他一些框架不同,“Hello,World!”示例在第一次尝试时起作用 目标 目前,我希望我的应用程序能做一些非常简单的事情: 用户以以下形式提交请求:GET/dist/lat,lng 应用程序使用远程IP地址和MaxMind来确定$latitude1和$longitude1 此请求路径是针对$latitude2和$longitude2 使用这两个位置,我们
GET/dist/lat,lng
$latitude1
和$longitude1
$latitude2
和$longitude2
/app
目录中似乎是不对的。应用程序的两个可重用部分是:
routes.php
文件作为闭包中的一堆闭包:
Route::get('dist/{input}', function($input){
$input = explode( "," , $input );
return Distance::getDistance( GeoIP::getLocation(), $input );
});
我试过的
初步尝试
对于第一个服务提供商,我发现。它的安装没有它应该的那么容易(我必须手动将geoip.php
复制到/config
目录,手动更新/config/app.php
,并运行composer update
和php artisan optimize
),但是它起了作用:请求获取/测试
返回了我的所有信息
对于第二个服务提供者,我首先尝试模仿GeoIP服务提供者的目录结构和文件命名约定。我想,如果我有相同的命名约定,自动加载程序将能够找到我的类。因此,我创建了/vendor/stevendesu/worlddistance/src/stevendesu/worlddistance\WorldDistanceServiceProvider.php
:
<?php namespace Stevendesu\WorldDistance;
use Illuminate\Support\ServiceProvider;
class WorldDistanceServiceProvider extends ServiceProvider {
protected $defer = false;
public function register()
{
// Register providers.
$this->app['distance'] = $this->app->share(function($app)
{
return new WorldDistance();
});
}
public function provides()
{
return ['distance'];
}
}
'Stevendesu\WorldDistance\WorldDistanceServiceProvider',
此操作失败,并出现致命错误:
FatalErrorException in ProviderRepository.php line 150:
Class 'Stevendesu\WorldDistance\WorldDistanceServiceProvider' not found
FatalErrorException in ProviderRepository.php line 150:
Class 'Stevendesu\WorldDistance\WorldDistanceServiceProvider' not found
使用工作台
由于这完全失败了,我想肯定还有其他一些文件依赖关系:可能没有composer.json,或者没有自述文件,它就放弃了。我不知道。所以我开始研究包的创建。谷歌几次搜索“CreatePackageLaravel5”都没有结果。要么:
/config
中也没有“workbench.PHP”文件,所以我发现的任何与workbench相关的东西都一文不值。我开始在Workbench上做一些研究,发现了StackOverflow
经过长时间和一些实验,我成功地将laravel/workbench
放入我的composer.json、composer更新、composer安装中,手动构建workbench.php配置文件,最后使用php Artisan workbench命令生成一个新包:
php artisan workbench Stevendesu/WorldDistance --resources
这创建了一个目录:/workbench/stevendesu/world distance
,其中包含多个子目录和一个文件:/workbench/stevendesu/world distance/src/stevendesu/WorldDistance/WorldDistanceServiceProvider.php
这个服务提供者类看起来与我之前创建的文件基本相同,只是它位于/workbench
目录中,而不是/vendor
目录中。我尝试重新加载页面,但仍然出现致命错误:
FatalErrorException in ProviderRepository.php line 150:
Class 'Stevendesu\WorldDistance\WorldDistanceServiceProvider' not found
FatalErrorException in ProviderRepository.php line 150:
Class 'Stevendesu\WorldDistance\WorldDistanceServiceProvider' not found
我还尝试了php artisan供应商:publish
。我真的不知道这个命令是做什么的,而且描述也没有帮助,所以也许它会有帮助?没有
问题:
我如何创建一个新的服务提供商作为一个包,以便在未来的项目中,我可以简单地包括这个包并具有所有相同的功能?或者更确切地说,我做错了什么,以致于我创建的包无法工作?玩了两天之后,我设法找到了解决方案。我假设目录结构直接映射到它所检查的自动加载器的路径(例如,试图访问类
Stevendesu\WorldDistance\WorldDistanceServiceProvider
将查看供应商/Stevendesu/WorldDistanceServiceProvider
)。。。事实并非如此
通过阅读composer源代码,了解它实际上是如何加载文件的,它构建了一个“类映射”——本质上是一个巨大的数组,将类映射到它们各自的文件。此文件是在运行composer update
或composer install
时生成的,只有当composer知道您的软件包的详细信息时,才能正确生成此文件。也就是说,如果您的包包含在项目的composer.json文件中
我在我的应用程序之外创建了一个本地git存储库,然后将我的包添加到我的应用程序的composer.json文件中,然后运行composer update
——突然间,一切都很顺利
至于:
它没有像应该的那样容易安装
证券交易委员会