2016-09-29 1 views
1

내 laravel 앱에 quickbooks를 통합하려고합니다. 나는이 오류가 발생했습니다 통합 한 후, 여기에 Laravel 5.3에서 Quickbook 라이브러리를 가져 오는 중 오류가 발생했습니다.

PHP Warning: require_once(../QuickBooks.php): failed to open stream: No such file or directory in /home/vipin/projects/development/Quickbook/config/app.php on line 2 PHP Fatal error: require_once(): Failed opening required '../QuickBooks.php' (include_path='.:/usr/share/php:/home/ubuntu/projects/development/Quickbook/vendor/consolibyte/quickbooks') in /home/ubuntu/projects/development/Quickbook/config/app.php on line 2

대신 자동 로더의 require가 사용

namespace App\Http\Controllers; 

use Illuminate\Http\Request; 
// require_once '../QuickBooks.php'; 

use App\Http\Requests; 

class QuickBooksController extends Controller 
{ 
private $IntuitAnywhere; 
private $context; 
private $realm; 

public function __construct(){ 
    if (!\QuickBooks_Utilities::initialized(env('QBO_DSN'))) { 
     // Initialize creates the neccessary database schema for queueing up requests and logging 
     \QuickBooks_Utilities::initialize(env('QBO_DSN')); 
    } 
    $this->IntuitAnywhere = new \QuickBooks_IPP_IntuitAnywhere(env('QBO_DSN'), env('QBO_ENCRYPTION_KEY'), env('QBO_OAUTH_CONSUMER_KEY'), env('QBO_CONSUMER_SECRET'), env('QBO_OAUTH_URL'), env('QBO_SUCCESS_URL')); 
} 

public function qboConnect(){ 
    if ($this->IntuitAnywhere->check(env('QBO_USERNAME'), env('QBO_TENANT')) && $this->IntuitAnywhere->test(env('QBO_USERNAME'), env('QBO_TENANT'))) { 
     // Set up the IPP instance 
     $IPP = new \QuickBooks_IPP(env('QBO_DSN')); 
     // Get our OAuth credentials from the database 
     $creds = $this->IntuitAnywhere->load(env('QBO_USERNAME'), env('QBO_TENANT')); 
     // Tell the framework to load some data from the OAuth store 
     $IPP->authMode(
      \QuickBooks_IPP::AUTHMODE_OAUTH, 
      env('QBO_USERNAME'), 
      $creds); 

     if (env('QBO_SANDBOX')) { 
      // Turn on sandbox mode/URLs 
      $IPP->sandbox(true); 
     } 
     // This is our current realm 
     $this->realm = $creds['qb_realm']; 
     // Load the OAuth information from the database 
     $this->context = $IPP->context(); 

     return true; 
    } else { 
     return false; 
    } 
} 

public function qboOauth(){ 
    if ($this->IntuitAnywhere->handle(env('QBO_USERNAME'), env('QBO_TENANT'))) 
    { 
     ; // The user has been connected, and will be redirected to QBO_SUCCESS_URL automatically. 
    } 
    else 
    { 
     // If this happens, something went wrong with the OAuth handshake 
     die('Oh no, something bad happened: ' . $this->IntuitAnywhere->errorNumber() . ': ' . $this->IntuitAnywhere->errorMessage()); 
    } 
} 

public function qboSuccess(){ 
    return view('qbo_success'); 
} 

public function qboDisconnect(){ 
    $this->IntuitAnywhere->disconnect(env('QBO_USERNAME'), env('QBO_TENANT'),true); 
    return redirect()->intended("/yourpath");// afer disconnect redirect where you want 

} 

public function createCustomer(){ 

    $CustomerService = new \QuickBooks_IPP_Service_Customer(); 

    $Customer = new \QuickBooks_IPP_Object_Customer(); 
    $Customer->setTitle('Ms'); 
$Customer->setGivenName('Shannon'); 
$Customer->setMiddleName('B'); 
$Customer->setFamilyName('Palmer'); 
$Customer->setDisplayName('Shannon B Palmer ' . mt_rand(0, 1000)); 
    // Terms (e.g. Net 30, etc.) 
    $Customer->setSalesTermRef(4); 

    // Phone # 
    $PrimaryPhone = new \QuickBooks_IPP_Object_PrimaryPhone(); 
    $PrimaryPhone->setFreeFormNumber('860-532-0089'); 
$Customer->setPrimaryPhone($PrimaryPhone); 

    // Mobile # 
    $Mobile = new \QuickBooks_IPP_Object_Mobile(); 
    $Mobile->setFreeFormNumber('860-532-0089'); 
$Customer->setMobile($Mobile); 

    // Fax # 
    $Fax = new \QuickBooks_IPP_Object_Fax(); 
    $Fax->setFreeFormNumber('860-532-0089'); 
$Customer->setFax($Fax); 

    // Bill address 
    $BillAddr = new \QuickBooks_IPP_Object_BillAddr(); 
    $BillAddr->setLine1('72 E Blue Grass Road'); 
$BillAddr->setLine2('Suite D'); 
$BillAddr->setCity('Mt Pleasant'); 
$BillAddr->setCountrySubDivisionCode('MI'); 
$BillAddr->setPostalCode('48858'); 
$Customer->setBillAddr($BillAddr); 

    // Email 
    $PrimaryEmailAddr = new \QuickBooks_IPP_Object_PrimaryEmailAddr(); 
    $PrimaryEmailAddr->setAddress('[email protected]'); 
    $Customer->setPrimaryEmailAddr($PrimaryEmailAddr); 

    if ($resp = $CustomerService->add($this->context, $this->realm, $Customer)) 
    { 
     //print('Our new customer ID is: [' . $resp . '] (name "' . $Customer->getDisplayName() . '")'); 
     //return $resp; 
     //echo $resp;exit; 
     //$resp = str_replace('{','',$resp); 
     //$resp = str_replace('}','',$resp); 
     //$resp = abs($resp); 
     return $this->getId($resp); 
    } 
    else 
    { 
     //echo 'Not Added qbo'; 
     print($CustomerService->lastError($this->context)); 
    } 
} 

public function addItem(){ 
    $ItemService = new \QuickBooks_IPP_Service_Item(); 

    $Item = new \QuickBooks_IPP_Object_Item(); 

    $Item->setName('My Item'); 
$Item->setType('Inventory'); 
$Item->setIncomeAccountRef('53'); 

    if ($resp = $ItemService->add($this->context, $this->realm, $Item)) 
    { 
     return $this->getId($resp); 
    } 
    else 
    { 
     print($ItemService->lastError($this->context)); 
    } 
} 

public function addInvoice($invoiceArray,$itemArray,$customerRef){ 

    $InvoiceService = new \QuickBooks_IPP_Service_Invoice(); 

    $Invoice = new \QuickBooks_IPP_Object_Invoice(); 

    $Invoice = new QuickBooks_IPP_Object_Invoice(); 

$Invoice->setDocNumber('WEB' . mt_rand(0, 10000)); 
$Invoice->setTxnDate('2013-10-11'); 

$Line = new QuickBooks_IPP_Object_Line(); 
$Line->setDetailType('SalesItemLineDetail'); 
$Line->setAmount(12.95 * 2); 
$Line->setDescription('Test description goes here.'); 

$SalesItemLineDetail = new QuickBooks_IPP_Object_SalesItemLineDetail(); 
$SalesItemLineDetail->setItemRef('8'); 
$SalesItemLineDetail->setUnitPrice(12.95); 
$SalesItemLineDetail->setQty(2); 

$Line->addSalesItemLineDetail($SalesItemLineDetail); 

$Invoice->addLine($Line); 

$Invoice->setCustomerRef('67'); 


    if ($resp = $InvoiceService->add($this->context, $this->realm, $Invoice)) 
    { 
     return $this->getId($resp); 
    } 
    else 
    { 
     print($InvoiceService->lastError()); 
    } 
} 

public function getId($resp){ 
    $resp = str_replace('{','',$resp); 
    $resp = str_replace('}','',$resp); 
    $resp = abs($resp); 
    return $resp; 
} 

} 

구성/app.php

<?php 
require_once '../QuickBooks.php'; 

return [ 


    'qbo_token' => env('QUICKBOOK_TOKEN'), 
    'qbo_consumer_key' => env('QBO_OAUTH_CONSUMER_KEY'), 
    'qbo_consumer_secret' => env('QBO_CONSUMER_SECRET'), 
    'qbo_sandbox' => env('QBO_SANDBOX'), 
    'qbo_encryption_key' => env('QBO_ENCRYPTION_KEY'), 
    'qbo_username' => env('QBO_USERNAME'), 
    'qbo_tenant' => env('QBO_TENANT'), 
    'qbo_auth_url' => 'http://app.localhost:8000/qbo/oauth', 
    'qbo_success_url' => 'http://app.localhost:8000/qbo/success', 
    'qbo_mysql_connection' => 'mysqli://'. env('DB_USERNAME') .':'. env('DB_PASSWORD') .'@'. env('DB_HOST') .'/'. env('DB_DATABASE'), 
+1

"include_path에 파일이 없으면 include는 호출 스크립트의 자체 디렉토리와 실패 이전의 작업 디렉토리를 마지막으로 체크인합니다." 대답 할 게 없다. – cske

+0

나는 이미 QuickBooks.php가 내 위치 Quickbook/vendor/consolibyte/quickbooks/QuickBooks.php에 존재하는지 확인한다. – vipin

+0

그 경로는 당신이 필요로하는 것과 비슷하게 보이지 않는다. . 정확히 ** ** Config.app.php'와 포함시키고 자하는'QuickBooks.php' 파일의 ** 전체 경로 **는 무엇입니까? – Phil

답변

0

여기에 주어진 코드 & 접근 방식에 대한 개선하기 위해 여러 분야가 있습니다 : 예를 들어

가, 작곡가를 사용하여 프로젝트에 QuickBooks에 라이브러리를 추가, 당신은 하나의 명령을 실행해야합니다.

  1. Anton correctly points out으로, quickbooks 라이브러리 파일을 직접 요구하지 않아야합니다. Composer를 통해로드 한 경우 Composer 자동 로더가 QuickBooks 파일을 공급 업체에서로드하므로 자동으로로드됩니다. 이것은 일반 작곡가 기반 응용 프로그램뿐 아니라 Laravel에도 맞습니다. Laravel과의 유일한 차이점은이 SDK 용으로 작성된 특정 Laravel 패키지 ServiceProvider이 없지만 상관 없습니다.
  2. QuickBooks 라이브러리는 'QuickBooks'로 시작하는 클래스를 자동로드하는 것 위로 뛰어 오르기 때문에 컨트롤러 클래스에 QuickBooks폴더을 만드는 것이 좋습니다. 이것은 '잡았다'의 이상이고 pointed out in the repo issues되었습니다.
  3. QBO_DSN을 지정하지 않았거나 잘못 입력했기 때문에 Driver/.php 오류가 발생하는 이유는 초기화로 전달되는이 DSN 환경 변수가 SDK 코드의 parse_url()을 통해 실행되고 있기 때문입니다 false 또는 null 및 초기화를 위해 자동 로더를 분리하십시오. 이 번호가 올바른 연결 문자열 (예 : mysqli://username:[email protected]:port/database)으로 설정되어 있고 port이 숫자 여야합니다. 그렇지 않으면 형식이 잘못된 것으로 간주되므로 올바르게 DSN을 처리하고 페이지를 계속로드합니다. 초기화 작업은 호스트의 네트워크 주소를 구문 분석하고 가져 오려고 시도하기 때문에 더미 값을 넣고 작동 할 것으로 기대할 수는 없습니다. 먼저이를 수행해야합니다.
  4. 둘 중 하나를 사용하지 않고 환경 변수와 응용 프로그램 구성을 혼합하고 있습니다. DB 연결 문자열 (a.k.a. QBO_DSN)을 응용 프로그램 구성 설정 qbo_mysql_connection에 특수하게 구성하려면/etc/loader를 초기화 /로드 할 때 using the configuration setting이어야합니다. env('QBO_DSN')을 사용하는 대신 config('app.qbo_mysql_connection')을 사용하여 앱 설정에서 생성 된 버전을로드해야합니다. 일반적으로 컨트롤러에 많은 환경 변수를로드하지는 않을 것입니다. 즉, 응용 프로그램이 처리해야하는 컨트롤러와 응용 프로그램 구성을 호출하는 컨트롤러가 정의 된 방식에 대해 불가지론합니다.
  5. require은 앱 구성 파일 내부에서 아무것도 필요하지 않습니다.이 파일은 구성 변수 설정 용입니다.
  6. QuickBooks SDK의 네임 스페이스가 올바르지 않아 (yet) PSR-4를로드하는 데 좋은 방법이 없지만 (use -ing) 맨 위의 use 절을 사용하는 것이 좋습니다. (예 : use QuickBooks_Utilities;) 앞의 백 슬래시를 잊어 버릴 염려없이 클래스를 사용할 수 있습니다 (예 : \QuickBooks_Utilities, 사용량이 QuickBooks_Utilities) -이 코드를 잊어 버린 곳에서 작동하지 않는 코드가 여러 개있는 경우가 있습니다 Laravel 응용 프로그램이 네임 스페이스이므로 App\Http\Controllers 네임 스페이스 (예 : "App\Http\Controllers\QuickBooks_Utilities 클래스를 찾을 수 없음"오류)에서 해당 클래스를 찾습니다.
  7. 들여 쓰기 - 스타일 (예 : 탭, 2 공백, PSR-2 등)을 선택한 다음 붙이십시오. phpcs 또는 일부 다른 정리 도구를 저장소에 커밋하거나 SO에 게시하기 전에 모든 코드에 대해 실행하십시오 - 가독성이 중요합니다!
+0

이 질문에 유감을 표명 한 사람이라면 _why_와 의견을 남길 수 있다면 감사하겠습니다. 가능한 한 답변을 드릴 수 있도록 답장을 내려 주셨습니다. – Leith

0

Quickbook.php 내 컨트롤러 입니다 현대 프레임 워크 (및 근대 PHP에서 일반적으로)의 나쁜 습관. 프로젝트에 모듈을 제대로 추가하려면 패키지 관리자 (예 : 작곡가)를 사용하는 것이 좋습니다.

composer require consolibyte/quickbooks 
+0

이미이 작업을 수행했지만 laravel (게시자)과의 통합이 적절하지 않습니다. – vipin

관련 문제