【问题标题】:Error while importing Quickbook library in Laravel 5.3在 Laravel 5.3 中导入 Quickbook 库时出错
【发布时间】:2016-09-29 05:26:05
【问题描述】:

我正在将 quickbooks 与我的 laravel 应用程序集成。集成后出现此错误,

PHP 警告:require_once(../QuickBooks.php):无法打开流: 在......中没有该文件或目录 /home/vipin/projects/development/Quickbook/config/app.php 在第 2 行 PHP 致命错误:require_once():无法打开所需的“../QuickBooks.php” (include_path='.:/usr/share/php:/home/ubuntu/projects/development/Quickbook/vendor/consolibyte/quickbooks') 在 /home/ubuntu/projects/development/Quickbook/config/app.php 上线 2

这是我的控制器Quickbook.php

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('support@consolibyte.com');
  $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'),

【问题讨论】:

  • " 如果在 include_path 中找不到该文件,则 include 最终会在失败之前检查调用脚本自己的目录和当前工作目录。"没什么好回答的
  • 我已经检查 QuickBooks.php 是否存在于我的位置 Quickbook/vendor/consolibyte/quickbooks/QuickBooks.php
  • 该路径看起来与您尝试要求的路径完全不同。您尝试包含的Config.app.phpQuickBooks.php 文件的确切 完整路径是什么?
  • @cske 这并不完全正确。包含路径必须包含 . 才能发生这种情况
  • @Phil 这是来自php.net/manual/en/function.include.php 的引述,所以如果这不成立,请在那里报告

标签: php laravel quickbooks


【解决方案1】:

使用给定的代码和方法,这里有几个方面需要改进。

  1. 作为Anton correctly points out,您不应该直接要求任何快速书库文件。如果您已经通过 Composer 加载了它,那么它们将自动加载,因为 Composer 自动加载器将从供应商处加载 QuickBooks 文件。这对于 Laravel 以及基于 Composer 的一般应用程序都是正确的 - 与 Laravel 的唯一区别是没有为此 SDK 编写的特定 Laravel 包 ServiceProvider,但这并不重要。
  2. QuickBooks 库会尝试自动加载以“QuickBooks”开头的任何类,因此您最好为控制器类创建一个QuickBooks 文件夹。这更像是一个“陷阱”,一直是pointed out in the repo issues
  3. 您收到Driver/.php 错误的原因是您没有指定您的QBO_DSN,或者没有正确指定 - 您传递给初始化的这个 DSN 环境变量正在通过parse_url() 运行在 SDK 代码中,出现 falsenull 并打破自动加载器进行初始化。如果将其设置为正确的连接字符串(例如mysqli://username:password@host:port/database 并注意port 必须 是数字,否则将被视为格式错误),它将正确处理 DSN 并继续加载页面。请注意,初始化将尝试解析和获取主机的网络地址,因此您不能只在其中放置一个虚拟值并期望它工作 - 这需要首先存在。
  4. 您正在混合环境变量和应用程序配置,而没有正确使用其中任何一个。如果您希望您的数据库连接字符串(又名QBO_DSN)以特定方式构建到应用程序配置设置qbo_mysql_connection,那么在尝试初始化/加载/等时您应该是using the configuration setting。而不是使用env('QBO_DSN'),您应该使用config('app.qbo_mysql_connection') 从您的应用设置中加载构建的版本。通常情况下,您根本不会将这么多环境变量加载到控制器中 - 这应该由应用程序处理,然后控制器调用应用程序配置,因此它不知道它们是如何定义的。
  5. 您也不应该需要在应用配置文件中 require 任何内容 - 该文件仅用于设置配置变量。
  6. 由于 QuickBooks SDK 没有正确命名空间 (yet),没有很好的 PSR-4 加载(和 use-ing)类的方法,但使用 @987654342 仍然是一个好习惯文件顶部的@ 子句(例如use QuickBooks_Utilities;),这样您就可以使用这些类而不必担心忘记前面的反斜杠(即不再使用\QuickBooks_Utilities,只使用QuickBooks_Utilities) - 在给定的代码已经忘记了这一点,并且由于 Laravel 应用程序是命名空间的,并且将在 App\Http\Controllers 命名空间中查找这些类(例如“找不到类 App\Http\Controllers\QuickBooks_Utilities”之类的错误),因此将无法工作。
  7. 缩进 - 选择一种样式(例如制表符、2-空格、PSR-2 等),然后坚持下去。在提交到存储库或发布到 SO 之前,对所有代码运行 phpcs 或其他一些清理工具 - 可读性很重要!

【讨论】:

  • 对于任何对此投反对票的人,如果您能留下评论并说明为什么您对此回复投反对票,我将不胜感激,以便我可以解决它并在可能的情况下更新答案。跨度>
【解决方案2】:

使用require 代替自动加载器在现代框架中(通常在现代 PHP 中)是一种不好的做法。我强烈建议使用包管理器(例如 composer)将模块正确地添加到项目中。

例如,要使用 composer 将 quickbooks 库添加到项目中,您只需运行一个命令:

composer require consolibyte/quickbooks

【讨论】:

  • 我已经这样做了,但是没有与 laravel (publisher) 正确集成。
【解决方案3】:

Config/app.php页脚中添加这一行

require_once '../QuickBooks.php';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 2015-10-24
    相关资源
    最近更新 更多