Php 在laravel 4上使用非laravel软件包
是否可以在框架中包含一个不是专门为L4设计的包? 如果是,是如何做到的?我知道我需要将包添加到我的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的第三
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”