2016-07-26 69 views
3

我无法将该库置于vendor/之下,因为该目录在.gitignore中被忽略。我把它放在bing-ads/,我有我应该在哪里将一个库放入Yii项目中,而这个项目通过Composer不可用?

<?php 
namespace app\models; 

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

use \Yii; 
use BingAds\Proxy\ClientProxy; 

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

The Microsoft PHP library is located here

+0

你试过了吗?它应该工作一样。 –

+0

@JeffPuckettII但是当它从Web服务器运行时,包含路径会有所不同。 – Chloe

回答

-1

这是最好的外部库的地方extensions目录。

而且在配置做

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

在主控制台CONFIGS。

+0

这不起作用。我想你的意思是'config/web.php'。它给出了一个错误:'未知属性 - yii \ base \ UnknownPropertyException 设置未知属性:yii \ web \ Application :: import'。没有'import'属性:http://www.yiiframework.com/doc-2.0/guide-structure-applications.html – Chloe

-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(); 
     // ... 
    } 
} 

然而,它是很好的Yii 2做法有在common文件夹公共库代码。所以,如果这个库中的代码是跨应用程序使用,我建议你把它放入common\components文件夹,替换backendcommonuse声明在上面的代码。

P.S:Justinas method也适用;它是从Yii 1借来的。但是这可能会变得很麻烦,因为这要求Yii在应用程序启动时加载类。如果该文件中有一些重要的东西,它可能会对应用程序的性能造成不利影响。

+0

好吧,我把文件夹移到'components \ bing-ads'并注释掉了include( )'行并将'component'添加到所有'use'行,但它给出了一个错误:在/ cygdrive/c/Users/Chloe中找不到'PHP致命错误:类'组件\ BingAds \ v10 \ CampaignManagement \ MatchType' 413行上的/workspace/bestsales/models/BingAds.php。包含哪些文件? PHP如何知道类? – Chloe

+0

为什么文件路径与使用的命名空间有关?为什么我需要将'components \'添加到名称空间,只是因为它在该目录中? – Chloe

+0

Yii 2试图符合PSR-4标准。这是你的命名空间和文件路径应该对应的。 – iGbanam

2

我通过将文件路径的composer.jsonautoload部发现了一种方法。我记得我也必须为其他一些图书馆做到这一点,甚至可以通过Composer使用。

"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" 
    ] 
} 

然后我跑

$ composer install 
... 
Generating autoload files 

我不知道这是虽然最佳途径。

+0

有趣。我没有想到这 – iGbanam

1

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

只需添加别名作为例子,其中包括在您的控制台,以及在你的web应用例如一个共同的基础配置文件/common/config/base.php/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 

我haven`t测试了其他类,但我猜你得到它是如何工作的。

+0

我没有'common /'目录。这是我的'web/index.php'的内容:http://pastebin.com/EW1UJnHb你可以忽略信号的东西 - 我正在测试一些回收服务器的东西。 – Chloe

+0

我刚刚有一个“common”目录来存储用于后端,前端和控制台的东西,这是来自高级模板。在我的例子中,配置存储在那里。 当然,您可以直接将它添加到控制台和网络配置中。 – BHoft

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" 
    } 
} 

然后加入作曲家产生autload.php文件,如果你还没有准备好。 然后,您可以在不包含的情况下调用BingAds \ Proxy \ ClientProxy()。

没有更好的办法:)

相关问题