Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Laravel 5中创建新的ServiceProvider/Facade作为包 介绍_Php_Laravel_Package_Composer Php_Laravel 5 - Fatal编程技术网

Php 在Laravel 5中创建新的ServiceProvider/Facade作为包 介绍

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 使用这两个位置,我们

我以前从未使用过框架(Zend、CakePHP等),最后决定坐下来学习一个。我从Laravel开始,因为代码看起来很漂亮,而且与我尝试安装的其他一些框架不同,“Hello,World!”示例在第一次尝试时起作用

目标 目前,我希望我的应用程序能做一些非常简单的事情:

  • 用户以以下形式提交请求:
    GET/dist/lat,lng

  • 应用程序使用远程IP地址和MaxMind来确定
    $latitude1
    $longitude1

  • 此请求路径是针对
    $latitude2
    $longitude2

  • 使用这两个位置,我们计算它们之间的距离。要做到这一点,我正在使用

  • 由于我计划在以后的项目中重新使用这个函数,所以将所有代码都放到
    /app
    目录中似乎是不对的。应用程序的两个可重用部分是:

  • 连接到MaxMind并返回纬度和经度的服务提供商
  • 在地球仪上获取两点并返回距离的服务提供商
  • 如果我正确构建facades,那么我可以简单地编写以下代码,而不是将
    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”都没有结果。要么:

  • 他们使用的是Laravel4.2,在这种情况下,建议是“运行php artisan workbench供应商/包——资源”
  • 他们使用的是Laravel 5,在这种情况下
  • 官方的Laravel 5文档提供了大量示例代码,其中包括:

    您所需要做的就是告诉Laravel给定名称空间的视图位于何处。例如,如果您的包名为“courier”,则可以将以下内容添加到服务提供商的引导方法中:

    这就假设您有一个服务提供商将引导方法放入

    文档中没有任何内容说明如何创建一个服务提供商,以使它实际上由Laravel加载

    我还发现了所有这些假设,假设你有一个存储库,你只想把它包含在你的应用程序中,或者假设你有一个“工作台”。完全从零开始创建一个新的包

    PHP Artisan甚至没有“workbench”命令,在
    /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
    ——突然间,一切都很顺利

    至于:

    它没有像应该的那样容易安装

    证券交易委员会