我应该在哪个库中放置一个无法通过Composer获得的Yii项目?

时间:2016-07-26 00:07:15

标签: php yii2

我无法将库放在vendor/下,因为.gitignore会忽略该目录。我把它放在bing-ads/下面,我有

<?php
namespace app\models;

include 'bing-ads\v10\bingads\ClientProxy.php';

use \Yii;
use BingAds\Proxy\ClientProxy;

访问它。它适用于控制台命令/操作,但我觉得它在Web调用期间不起作用,因为根目录将是web/。我应该把这个库放在哪里,如何通过控制台操作和Web操作来访问它?

Microsoft PHP library is located here

5 个答案:

答案 0 :(得分:2)

我找到了一种方法,将文件路径添加到autoload的{​​{1}}部分。我记得我必须为其他一些库做这些,甚至是通过Composer提供的库。

composer.json

然后我跑了

"autoload": {
  "classmap": [
    "vendor/googleads/googleads-php-lib/src/Google/Api/Ads/Common/Util",
    "vendor/googleads/googleads-php-lib/src/Google/Api/Ads/AdWords/Util/v201605",
    "bing-ads/v9/bingads/CustomerManagementClasses.php",
    "bing-ads/v10/bingads/v10/CampaignManagementClasses.php",
    "bing-ads/v10/bingads/v10/BulkClasses.php",
    "bing-ads/v10/bingads/ClientProxy.php"
  ]
}

我不确定这是最好的方法。

答案 1 :(得分:1)

您可以将它们存储在任何地方,例如:在名为“BingAds”的文件夹中。

只需将别名作为示例添加到公共基本配置文件/common/config/base.php中,该文件包含在您的控制台以及Web应用程序中,例如为您的/web/index.php

$config = \yii\helpers\ArrayHelper::merge(
    require(__DIR__ . '/../common/config/base.php'),
    require(__DIR__ . '/../common/config/web.php'),
    require(__DIR__ . '/../config/base.php'),
    require(__DIR__ . '/../config/web.php')
);

在此common/config/base.php中,您可以添加对控制台和Web应用程序都有效的设置,扩展程序等

<?php
$config = [
    ...
    'aliases' => [
        '@BingAds' => '@app/BingAds/v10',
        '@BingAds/Proxy' => '@app/BingAds/v10/bingads',
    ],
];

您的Clientproxy.php作为示例存储在目录/BingAds/Proxy/

然后,您不必在每次要使用文件时都包含文件,只需编写。

use BingAds\Proxy\ClientProxy;

我已解压缩您的链接zip文件并将目录Bing Ads API in PHP\PHP\Bing Ads API in PHP的文件存储到我的应用程序根目录BingAds,而不是上面提到的别名。

我已经通过在控制台和Web应用程序中创建clientProxy对象来测试它。

$test = new ClientProxy('test');
var_dump($test);

两个印刷

object(BingAds\Proxy\ClientProxy)[140]
  private 'authenticationToken' => null
  private 'username' => null
  private 'password' => null
  private 'developerToken' => null
  private 'wsdlUrl' => string 'test' (length=4)
  private 'accountId' => null
  private 'customerId' => null
  private 'service' => null
  private 'namespace' => null

我还没有测试过其他课程,但我想你知道它是如何运作的。

答案 2 :(得分:0)

将它添加到你的composer.json:

{
    "repositories": [
        {
            "type": "package",
            "package": {
                "name": "microsoft/bing-ads",
                "version": "9.0.0",
                "dist": {
                    "url": "https://code.msdn.microsoft.com/Bing-Ads-API-Version-9-in-fb27761f/file/159208/2/Bing%20Ads%20API%20in%20PHP.zip",
                    "type": "zip"
                },
                "autoload": {
                    "classmap": [
                        "PHP/Bing Ads API in PHP/v10/bingads/"
                    ]
                }
            }
        }
    ],


    "require": {
        "microsoft/bing-ads": "9.0.0"
    }
}

然后添加composer生成的autload.php文件(如果还没有)。 然后你可以调用BingAds \ Proxy \ ClientProxy()而不包含。

没有更好的方法:)

答案 3 :(得分:-1)

最好将外部库放到extensions目录。

在配置中

return [
    'import' => [
        'application.extensions.bing-ads.v10.bingads.ClientProxy',
    ],
    ...
];

在主配置和控制台配置中。

答案 4 :(得分:-1)

我通常只将代码放在components文件夹中。如果您使用的是基本模板,则此文件夹可以位于您的应用程序根目录下;如果您正在使用高级模板,则此文件夹可以位于必要的应用程序下:前端,后端,控制台或公共。我建议将其置于共同之处,原因我将在稍后解释

在每个应用配置下,Yii 2使用::setAlias方法为密钥文件夹分配不同的别名。在基本应用模板中,@app指的是应用程序根目录。在高级模板@app中,可以引用任何后端,前端或控制台。

如果您的库代码位于后端,您可以像这样访问它

namespace backend\controllers;

use yii\web\Controller;
use backend\components\MyLibCode;

class SiteController extends Controller
{
    public function actionIndex()
    {
        $mlb = new MyLibCode();
        // ...
    }
}

然而,在common文件夹中使用公共库代码是很好的Yii 2练习。因此,如果要在各个应用中使用此库代码,我建议您将其放入common\components文件夹,并将backend替换为上面代码中common语句中的use

p.s:Justinas method也有效;它是从Yii 1借用的。但这可能会变得很麻烦,因为这要求Yii在应用程序启动时加载类。如果该文件中存在一些繁重的内容,则可能对应用程序的性能有害。