2016-07-26 2 views
3

Ich kann die Bibliothek nicht unter vendor/ setzen, da dieses Verzeichnis in .gitignore ignoriert wird. Ich habe es unter bing-ads/ und ich habeWo sollte ich eine Bibliothek in ein Yii-Projekt einfügen, die nicht über Composer verfügbar ist?

<?php 
namespace app\models; 

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

use \Yii; 
use BingAds\Proxy\ClientProxy; 

um darauf zuzugreifen. Es funktioniert für Konsolenbefehle/Aktionen, aber ich habe das Gefühl, dass es während eines Webaufrufs nicht funktioniert, da das Stammverzeichnis web/ lautet. Wo sollte ich diese Bibliothek platzieren und wie kann ich über Konsolenaktionen und Webaktionen darauf zugreifen?

Die Microsoft PHP library is located here.

+0

Haben Sie es versucht? Es sollte genauso funktionieren. –

+0

@JeffPuckettII Der Include-Pfad unterscheidet sich jedoch, wenn er vom Webserver ausgeführt wird. – Chloe

Antwort

-1

Am besten platzieren Sie die externe Bibliothek in das Verzeichnis extensions.

Und in Config tun

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

in Haupt- und in der Konsole configs.

+0

Das funktioniert nicht. Ich denke du meinst 'config/web.php'. Es gab einen Fehler: 'Unbekannte Eigenschaft - yii \ base \ UnknownPropertyException Einstellung unbekannte Eigenschaft: yii \ web \ Application :: import'. Es gibt keine "Import" -Eigenschaft: http://www.yiiframework.com/doc-2.0/guide-structure-applications.html – Chloe

-1

In der Regel stecke ich den Code einfach in einen Ordner components. Wenn Sie die Basisvorlage verwenden, kann sich dieser Ordner unter Ihrem Anwendungsstamm befinden. Wenn Sie die erweiterte Vorlage verwenden, kann sich dieser Ordner unter der erforderlichen App befinden: Frontend, Backend, Konsole oder allgemein. Ich empfehle es aus Gründen, die ich später erklären werde

unter Common setzen Yii 2 verwendet die ::setAlias Methode unter jeder App-Konfiguration, um verschiedene Aliase den Schlüsselordnern zuzuweisen. In der grundlegenden App-Vorlage bezieht sich @app auf den Anwendungsstamm. In der erweiterten Vorlage kann sich @app auf Backend, Frontend oder Konsole beziehen.

Wenn Ihre Bibliothek Code unter Backend ist, können Sie es wie so Zugang

namespace backend\controllers; 

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

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

Aber es gute Praxis Yü 2 im common Ordner gemeinsamen Bibliothekscode zu haben. Wenn dieser Bibliothekscode also für verschiedene Apps verwendet werden soll, schlage ich vor, dass Sie ihn in den Ordner common\components eingeben und backend durch common in der use Anweisung im obigen Code ersetzen.

ps: Justinas method funktioniert auch; es ist von Yii entlehnt 1. Aber das kann umständlich werden, weil dies Yii dazu auffordert, die Klasse zu laden, wenn die Anwendung startet. Wenn in dieser Datei ein erheblicher Aufwand besteht, kann sich dies nachteilig auf die Leistung der App auswirken.

+0

Ok Ich habe den Ordner nach 'components \ bing-ads' verschoben und den' include () 'Linien und fügte' component \ 'zu allen' use' Zeilen hinzu, aber es gab einen Fehler: 'PHP Fataler Fehler: Klassen 'Komponenten \ BingAds \ v10 \ CampaignManagement \ MatchType' nicht in/cygdrive/c/Users/Chloe gefunden /workspace/bestsales/models/BingAds.php in Zeile 413'. Wo sind die Dateien enthalten? Wie weiß PHP über die Klassen? – Chloe

+0

Und warum hätte der Dateipfad etwas mit dem verwendeten Namensraum zu tun? Warum sollte ich 'components \ 'zum Namespace hinzufügen, nur weil es in diesem Verzeichnis ist? – Chloe

+0

Yii 2 versucht, PSR-4-konform zu sein. Dies sind deine Namespaces und die Dateipfade sollten übereinstimmen. – iGbanam

2

Ich habe einen Weg gefunden, indem Sie die Dateipfade zum autoload Abschnitt von composer.json hinzufügen. Ich erinnerte mich, dass ich das auch für einige andere Bibliotheken tun musste, sogar für diejenigen, die über Composer verfügbar waren.

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

Dann lief ich

$ composer install 
... 
Generating autoload files 

Ich bin nicht sicher, dies obwohl der beste Weg ist.

+0

interessant. Ich habe nicht daran gedacht – iGbanam

1

Sie können sie speichern, wo immer Sie möchten, z. in einem Ordner namens "BingAds".

Fügen Sie einfach den Alias ​​als Beispiel in eine gemeinsame Basiskonfigurationsdatei /common/config/base.php ein, die sowohl in Ihrer Konsole als auch in Ihrer Webanwendung enthalten ist, z.für Ihre /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') 
); 

Innerhalb dieser common/config/base.php könnten Sie Ihre Einstellungen, Erweiterungen usw. hinzufügen, die sowohl für die Konsole und Ihre Web-Anwendung gültig ist

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

Ihr Clientproxy.php als Beispiel in dem Verzeichnis gespeichert /BingAds/Proxy/ .

Dann müssen Sie Ihre Dateien nicht jedes Mal hinzufügen, wenn Sie sie verwenden möchten und nur schreiben.

use BingAds\Proxy\ClientProxy; 

Ich habe Ihre verknüpften Zip-Datei entpackt und die Dateien des Verzeichnisses Bing Ads API in PHP\PHP\Bing Ads API in PHP mein Stammverzeichnis der Anwendung BingAds whith Aliase oben erwähnt gespeichert.

Ich habe es getestet, indem ich ein clientProxy-Objekt in einer Konsole und Web-Anwendung erstellt habe.

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

Beide Gedruckt aus

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 

I haven `t anderen Klassen getestet, aber ich denke, Sie bekommen, wie es funktioniert.

+0

Ich habe kein 'common /' Verzeichnis. Dies ist der Inhalt meiner 'web/index.php': http://pastebin.com/EW1UJnHb Sie können das Signal-Zeug ignorieren - ich habe etwas mit dem Recycling der Server getestet. – Chloe

+0

Ich hatte gerade ein "gemeinsames" Verzeichnis, um Sachen zu speichern, die sowohl für das Backend, das Frontend als auch die Konsole sind. Das kam von der erweiterten Vorlage. In meinem Beispiel sind die Konfigurationen dort gespeichert. Natürlich können Sie es sowohl zu Ihrer Konsole und Web-Konfiguration direkt hinzufügen. – BHoft

0

Fügen Sie diese auf Ihre 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" 
    } 
} 

Dann fügen Komponist autload.php Datei generiert, wenn Sie nicht bereits haben. Dann können Sie die BingAds \ Proxy \ ClientProxy() ohne Includes aufrufen.

Es gibt keinen besseren Weg :)

Verwandte Themen