在 Laravel 4 上使用非 laravel 包

2022-08-30 11:28:43

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

我想使用最初为 Yii 设计的 Google 结账套餐


答案 1

将第三方作曲家软件包与 Laravel 4 配合使用

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

{
    "autoload": {
        "psr-0": { "Acme": "src/" }
    }
}

而PSR-4标准:

{
    "autoload": {
         "psr-4": { "Acme\\": "src/" }
    }
}

基本上,以上是告诉作曲家在何处查找名称间隔文件的标准。如果不使用自己的命名空间,则无需配置任何其他内容。

方案 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!

方案 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;

作曲家转储自动加载,它的工作原理!

步骤 2(可选)

另一种方法是(如果您不想使用“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

确保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 包有一个 ,这意味着如果不将构造方法更改为 public,则无法在原始类之外使用该包。我并不是说这是一个很好的做法,我建议在instagram包的情况下使用场景2。final private function __construct()

无论如何,在此之后,您可以像这样使用该软件包:

$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!

答案 2

将其添加到您的 ."tvr/googlecheckout": "dev-master"composer.json

运行 ,然后可以使用 IoC 容器。一些代码示例可以在Laravel 4的官方文档中找到:http://four.laravel.com/docs/ioc#basic-usagecomposer install


推荐