gpt4 book ai didi

php - 在 Laravel 4 上使用非 Laravel 包

转载 作者:IT王子 更新时间:2023-10-29 00:01:34 26 4
gpt4 key购买 nike

是否可以在框架中包含一个不是专门为 L4 设计的包?
如果是这样,它是如何完成的?我知道我需要将包裹添加到我的 composer.json将其添加到 vendor文件夹,但我可以在 providers 中以某种方式注册它吗?大批?还有其他必要的步骤吗?

我想使用 Google checkout package最初为 Yii 设计

最佳答案

在 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

Laravel 中的 PSR-0 标准跟随包(带有自动加载类映射)

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

https://packagist.org/packages/facebook/php-sdk

第一步:

在 composer.json 文件中包含该包。
"require": {
"laravel/framework": "4.0.*",
"facebook/php-sdk": "dev-master"
}

第 2 步:
run: composer update

第 3 步:

因为 facebook 包使用了一个开箱即用的类映射,所以您可以立即开始使用该包。 (下面的代码示例直接来自普通 View 。请让您的逻辑远离生产应用程序中的 View 。)
$facebook = new Facebook(array(
'appId' => 'secret',
'secret' => 'secret'
));
var_dump($facebook); // It works!

场景2

对于这个例子,我将使用来自 instagram php api 的包装器。这里需要进行一些调整才能加载包。试一试吧!
该包可以在这里找到:

https://packagist.org/packages/fishmarket/instaphp

第一步:

添加到 Composer .json
"require": {
"laravel/framework": "4.0.*",
"fishmarket/instaphp": "dev-master"
}

然后就可以正常更新了( Composer 更新)

接下来尝试像使用 facebook 包一样使用该包。同样,这只是 View 中的代码。
$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/ 文件夹,看看它是如何完成的。)

现在我们必须手动加载类。很简单,只需添加以下内容(在 Controller 、模型或 View 的顶部):
use Instaphp\Instaphp;

composer dump-autoload,它有效!

step2(可选)

另一种方法是(如果您不想使用“use”语句,您可以简单地告诉 Composer 直接从您的代码中查找文件。只需像这样更改实例:
// reference the name-spaced class straight in the code
$api = Instaphp\Instaphp::Instance(null, $instagramconfig);
var_dump($api); // It works

但是我建议使用 use声明以向其他开发人员(以及您 future 的自己)清楚说明程序中使用了哪些(外部)类/包。

场景3

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

又快又脏

如果你不关心设计模式和服务提供者,你可以像这样绑定(bind)一个类:
App::bind('Instaphp', function($app)
{
return new Instaphp\Instaphp;
});

然后你就这样解决了。
App::make('Instaphp');

又快又脏的结局

如果您正在处理一个更大的项目,并且您使用接口(interface),您可能应该进一步抽象绑定(bind)。

第一步:

在您的应用程序文件夹中创建一个文件夹,例如“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!

关于php - 在 Laravel 4 上使用非 Laravel 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15190772/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com