Php 在laravel 4上使用非laravel软件包

Php 在laravel 4上使用非laravel软件包,php,laravel,package,laravel-4,Php,Laravel,Package,Laravel 4,是否可以在框架中包含一个不是专门为L4设计的包? 如果是,是如何做到的?我知道我需要将包添加到我的composer.json,这会将它添加到vendor文件夹中,但是我可以在providers数组中注册它吗?还有其他必要的步骤吗 我想使用最初为Yii设计的添加“tvr/googlecheckout”:“dev master”将此添加到您的composer.json 运行composer安装,然后可以使用IoC容器。在Laravel 4的官方文档中可以找到一些代码示例:使用Laravel 4的第三

是否可以在框架中包含一个不是专门为L4设计的包? 如果是,是如何做到的?我知道我需要将包添加到我的
composer.json
,这会将它添加到
vendor
文件夹中,但是我可以在
providers
数组中注册它吗?还有其他必要的步骤吗

我想使用最初为Yii设计的

添加
“tvr/googlecheckout”:“dev master”
将此添加到您的
composer.json


运行
composer安装
,然后可以使用IoC容器。在Laravel 4的官方文档中可以找到一些代码示例:

使用Laravel 4的第三方composer软件包

当开发人员创建composer包时,他们应该使用PSR-0或PSR-4标准映射自动加载。如果不是这样,则在Laravel应用程序中加载包时可能会出现问题。PSR-0标准是:

{
    "autoload": {
        "psr-0": { "Acme": "src/" }
    }
}
以及PSR-4标准:

{
    "autoload": {
         "psr-4": { "Acme\\": "src/" }
    }
}
基本上,上面是告诉composer在哪里查找名称间隔文件的标准。如果您不使用自己的名称空间,则不必配置任何其他内容

情景1

PSR-0标准以下是Laravel中的软件包(带有自动加载类映射)

这是一个简单的例子,我将使用facebook php sdk,可以找到:

第1步:

run: composer update
将包包括在composer.json文件中

"require": {
    "laravel/framework": "4.0.*",
    "facebook/php-sdk": "dev-master"
}
第二步:

run: composer update
第三步:

run: composer update
由于facebook软件包使用了一个类映射,因此您可以立即开始使用该软件包。(下面的代码示例直接来自普通视图。请在生产应用程序的视图中保留您的逻辑。)

场景2

对于本例,我将使用instagram php api中的包装器。这里需要做一些调整来加载包。让我们试一试吧! 该软件包可在以下位置找到:

第1步:

run: composer update
添加到composer.json

"require": {
    "laravel/framework": "4.0.*",
    "fishmarket/instaphp": "dev-master"
}
然后可以正常更新(编写器更新)

接下来,试着像使用facebook软件包一样使用该软件包。同样,这只是视图中的代码

$instagramconfig = array(
    'client_id' => 'secret',
    'client_secret'=> 'secret',
    'access_token' => 'secret'
);

$api = Instaphp::Instance(null, $instagramconfig);                
var_dump($api); // Epic fail!
如果您尝试上述示例,您将得到以下错误:

FatalErrorException: Error: Class 'Instaphp' not found in ...
所以我们需要解决这个问题。为此,我们可以检查instagram composer.json,它的自动加载功能与facebook php sdk不同

"autoload": {
         "psr-0": { "Instaphp": "." }
    }
与facebook composer.json相比:

"autoload": {
        "classmap": ["src"]
    }
(Composer处理不同类型的自动加载,从文件和类映射到PSR。请查看您的
vendor/Composer/
文件夹以了解其如何完成。)

现在我们必须手动加载该类。很简单,只需添加以下内容(位于控制器、模型或视图的顶部):

作曲家转储自动加载,它的作品

步骤2(可选)

另一种方法是(如果你不想使用“use”语句,你可以简单地告诉composer直接从你的代码中查找文件

// reference the name-spaced class straight in the code
$api = Instaphp\Instaphp::Instance(null, $instagramconfig); 
var_dump($api); // It works
但是,我建议使用
use
语句向其他开发人员(以及您未来的自己)说明程序中使用了哪些(外部)类/包

场景3

在这里,我们使用内置于IOC容器中的Laravels注册服务提供商。请注意,某些软件包可能不适合此方法。我将使用与场景2中相同的Instagram软件包

又快又脏

如果您不关心设计模式和服务提供者,您可以像这样绑定一个类:

App::bind('Instaphp', function($app)
{
    return new Instaphp\Instaphp;
});
"autoload": {

    "classmap": [
        "app/commands",
        "app/controllers",
        "app/models",
        "app/database/migrations",
        "app/database/seeds",
        "app/tests/TestCase.php",
        "app/providers" // this was added
    ]

},
$instagramInstance = App::make('Instaphp');

$instagramconfig = array(
    'client_id' => 'secret',
    'client_secret'=> 'secret',
    'access_token' => 'secret'
 );

$instagram = new $instagramInstance();
$userfeed = $instagram->Users->feed($instagramconfig);

var_dump($userfeed); // It works!
你就这样解决它

App::make('Instaphp');
快而脏的结尾

如果您正在处理一个更大的项目,并且使用了接口,那么您可能应该进一步抽象绑定

第1步:

run: composer update
在应用程序文件夹中创建文件夹,例如“提供商”文件夹

app/providers
确保Laravel自动加载该文件夹,您可以将一些附加信息传递到composer.json,如下所示:

App::bind('Instaphp', function($app)
{
    return new Instaphp\Instaphp;
});
"autoload": {

    "classmap": [
        "app/commands",
        "app/controllers",
        "app/models",
        "app/database/migrations",
        "app/database/seeds",
        "app/tests/TestCase.php",
        "app/providers" // this was added
    ]

},
$instagramInstance = App::make('Instaphp');

$instagramconfig = array(
    'client_id' => 'secret',
    'client_secret'=> 'secret',
    'access_token' => 'secret'
 );

$instagram = new $instagramInstance();
$userfeed = $instagram->Users->feed($instagramconfig);

var_dump($userfeed); // It works!
现在,在名为Instagram.php的新文件夹中创建一个文件,并将其放入:

 <?php

    use Illuminate\Support\ServiceProvider;

    class InstagramServiceProvider extends ServiceProvider {

    public function register()
    {
        $this->app->bind('Instaphp', function()
        {
            return new Instaphp\Instaphp;
        });

    }

}

谢谢。我对IoC容器和DI做了一些研究,但是我仍然不知道如何加载一个不遵循Laravel服务提供商路线的类/库。如果我只是从我的Payments controller构造函数调用它,我会得到一个类not found错误。我希望能提供一个我正在寻找的示例。Thx!这仍然不是单击正在为我安装。我正在尝试安装FireHP软件包。在将其添加到composer.json并运行composer后,安装文件将显示在vendor/FirePHP中。我已尝试创建提供程序文件夹并创建FirehpServiceProvider文件,但我无法找到正确注册它的热点。我也不了解与ve的关系ndor/firephp/firephp-core/lib/FirePHPCore/firephp.Class.php文件。我缺少什么?我应该开始一个新问题吗?检查composer.lock文件,文件中的所有内容都正确加载了吗?firephp使用lib,因此路径应该是“classmap”:[“lib/FirePHPCore/firephp.Class.php”,“lib/FirePHPCore/fb.php”]关系就在类所在的位置,通常它们保存在src或lib文件夹中。只需尝试安装并转储实例,以检查laravel是否正在加载它。好的,我让它工作了。在我的register语句中,我只需将$this->app->bind('fireph',function(){return new fireph;})放入;虽然它在工作,但我想了解IoC容器如何知道“FireHP”与“lib/Firehpcore/Firehpp.class.php”和“lib/Firehpcore/fb.php”相关。它如何知道我的要求?我觉得如果我做了$this->app->bind('Firehpp.class.php'),或者如果我添加了use,它会更有意义“lib/FirePHPCore/FirePHP.class.php”,并在我创建的用于向IoC注册的FirePHP文件顶部使用“lib/FirePHPCore/fb.php”