是否可以在框架中包含一个不是专门为L4设计的软件包?
如果是这样,它是如何完成的?我知道我需要将包添加到我的composer.json
,并将其添加到vendor
文件夹,但是我可以在providers
数组中以某种方式注册它吗?还有其他必要步骤吗?
我想使用最初为Yii设计的Google checkout package
答案 0 :(得分:100)
在Laravel 4中使用第三方作曲家包
当开发人员创建编写器包时,他们应该使用PSR-0或PSR-4标准映射自动加载。如果不是这种情况,则在Laravel应用程序中加载包时可能会出现问题。 PSR-0标准是:
{
"autoload": {
"psr-0": { "Acme": "src/" }
}
}
PSR-4标准:
{
"autoload": {
"psr-4": { "Acme\\": "src/" }
}
}
基本上上面是告诉作曲家在哪里寻找名称间隔文件的标准。如果您没有使用自己的名称空间,则不必配置其他任何名称。
SCENARIO 1
Laravel中的PSR-0标准后续软件包(包含自动加载类图)
这是一个简单的,例如我将使用facebook php sdk,可以找到:
https://packagist.org/packages/facebook/php-sdk
第1步:
将包包含在composer.json文件中。
"require": {
"laravel/framework": "4.0.*",
"facebook/php-sdk": "dev-master"
}
第2步:
run: composer update
第3步:
因为facebook软件包使用了一个开箱即用的类映射,所以您可以立即开始使用该软件包。 (下面的代码示例直接来自普通视图。请保持逻辑与生产应用程序中的视图不同。)
$facebook = new Facebook(array(
'appId' => 'secret',
'secret' => 'secret'
));
var_dump($facebook); // It works!
SCENARIO 2
对于这个例子,我将使用Instagram php api中的包装器。这里需要做一些调整来加载包。试一试吧! 包裹可以在这里找到:
https://packagist.org/packages/fishmarket/instaphp
第1步:
添加到作曲家.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/
文件夹,看看它是如何完成的。)
现在我们必须手动加载该类。它很简单,只需添加它(控制器顶部,模型或视图):
use Instaphp\Instaphp;
composer dump-autoload,它有效!
step2(可选)
另一种方法是(如果你不想使用“use”语句,你可以简单地告诉作曲家直接从你的代码中查找文件。只需像这样更改实例:
// 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;
});
你就这样解决了。
App::make('Instaphp');
快速而肮脏的结束
如果你正在开展一个更大的项目,并且你使用了接口,你应该进一步抽象出绑定。
第1步:
在app文件夹中创建一个文件夹,例如'providers'文件夹。
app/providers
确保Laravel自动加载该文件夹,您可以将一些额外的信息传递给composer.json,如下所示:
"autoload": {
"classmap": [
"app/commands",
"app/controllers",
"app/models",
"app/database/migrations",
"app/database/seeds",
"app/tests/TestCase.php",
"app/providers" // this was added
]
},
现在在名为Instagram.php的新文件夹中创建一个文件,并将其放在:
中 <?php
use Illuminate\Support\ServiceProvider;
class InstagramServiceProvider extends ServiceProvider {
public function register()
{
$this->app->bind('Instaphp', function()
{
return new Instaphp\Instaphp;
});
}
}
现在再次运行composer dump-autoload,您可以使用该包。请注意,instagram包具有final private function __construct()
,这意味着您不能在原始类之外使用该包而不将构造方法更改为public。我不是说这是一个很好的做法,我建议使用方案2,对于instagram软件包。
无论如何,在此之后你可以使用这样的包:
$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!
答案 1 :(得分:1)
将"tvr/googlecheckout": "dev-master"
添加到您的composer.json
。
运行composer install
,然后您可以使用IoC容器。一些代码示例可以在Laravel 4的官方文档中找到:http://four.laravel.com/docs/ioc#basic-usage