是否有可能包括没有为L4的框架专门设计一个包? 如果是这样,它怎么办? 我知道我需要将包添加到我的composer.json
它增加了vendor
文件夹,但我可以在某种程度上在它注册providers
阵列? 是否有任何其他必要步骤?
我想使用谷歌结帐包最初设计的Yii
是否有可能包括没有为L4的框架专门设计一个包? 如果是这样,它怎么办? 我知道我需要将包添加到我的composer.json
它增加了vendor
文件夹,但我可以在某种程度上在它注册providers
阵列? 是否有任何其他必要步骤?
我想使用谷歌结帐包最初设计的Yii
使用第三方作曲家封装,Laravel 4
当开发人员创建作曲家包,他们应该映射使用PSR-0或PSR-4标准的自动加载。 如果不是这种情况下,有可能在你的Laravel应用程序加载包的问题。 的PSR-0标准是:
{
"autoload": {
"psr-0": { "Acme": "src/" }
}
}
而PSR-4标准:
{
"autoload": {
"psr-4": { "Acme\\": "src/" }
}
}
基本上,上面是告诉作曲家哪里寻找命名空间的文件的标准。 如果你不使用你自己的命名空间你没有配置任何东西。
场景1
PSR-0在Laravel标准以下包(带自动加载类映射)
这是一个简单的,并且例如,我将使用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!
方案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"]
}
(作曲处理不同类型的自动加载的,所有文件和类映射到PSR。看看你的vendor/composer/
文件夹以查看其如何完成的。)
现在,我们将不得不加载类,手动。 它很容易,只需添加这(控制器,模型或视图的顶部):
use Instaphp\Instaphp;
作曲家转储自动加载,和它的作品!
步骤2(可选)
另一种方法是(如果你不想使用“使用”的语句,你可以简单地告诉作曲家查找文件直接从您的代码只是改变实例,像这样:
// reference the name-spaced class straight in the code
$api = Instaphp\Instaphp::Instance(null, $instagramconfig);
var_dump($api); // It works
不过我建议使用use
的语句要清楚什么(外部)类/包在程序中使用其他开发人员(和你的未来的自己)。
场景3
这里我们使用内置的IOC容器的Laravels注册服务商。 请注意,有些软件包可能不适合这种方法。 我将使用相同的Instagram的包在方案2中。
快速和肮脏
如果你不关心设计模式和服务提供商可以绑定像这样一类:
App::bind('Instaphp', function($app)
{
return new Instaphp\Instaphp;
});
你解决这个问题是这样的。
App::make('Instaphp');
快速和肮脏的结束
如果你工作在一个更大的项目,您使用的接口,你或许应该抽象的绑定进一步。
步骤1:
创建您的app文件夹中的文件夹,例如“供应商”文件夹。
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;
});
}
}
现在再次运行作曲家转储自动加载,并且您可以使用该程序包。 需要注意的是,Instagram的包有一个final private function __construct()
这意味着你不能使用包的原班外不改变结构的方法来公开。 我并不是说这是一个很好的做法,我建议使用场景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!
添加"tvr/googlecheckout": "dev-master"
给你的composer.json
。
运行composer install
,那么你可以使用IoC容器。 一些代码示例可以在官方文档中找到Laravel 4: http://four.laravel.com/docs/ioc#basic-usage