我整个晚上一直在努力解决这个问题。我正在实施一个系统,在这个系统中,用户请求的报告会排队并在以后发送。我正在使用本机Laravel解决方案,但每当我从同步移动到数据库时,我开始出错。我查看了laravel调试日志,并且可以看到由于某种原因,每当我使用数据库时,我都会得到"尝试获取非对象的属性"错误。
[2018-02-11 12:05:46] production.ERROR:ErrorException:试着搞定 非对象的属性 /var/www/appname/app/Libraries/InstagramEngine.php:143
堆栈追踪:
#0
/var/www/appname/app/Libraries/InstagramEngine.php(143):Illuminate \ Foundation \ Bootstrap \ HandleExceptions-> handleError(8, '试图获得...',' / var / www / app ...',143,数组)
#1
appname / app / Jobs / ProcessCollectionReport.php(81):App \ Libraries \ InstagramEngine :: getAccountMediaByUserId(Object(App \ Models \ Account), 1515715200,1518393599)
我的代码如下 - 我将从非常直接的控制器开始:
/**
* Builds excel report for collection
* @param $slug
* @param Request $request
*/
public function export(Request $request, $slug)
{
// get logged in user
$user = User::find(Auth::user()->id);
// get collection
$collection = Collection::where('slug', $slug)->firstOrFail();
// get start and end date
$start = $request->input('start', Carbon::now()->subDays(30)->startOfDay()->timestamp);
$end = $request->input('end', Carbon::now()->endOfDay()->timestamp);
// queue the job
ProcessCollectionReport::dispatch($user->id, $collection->id, $start, $end);
}
正如您所看到的,我的控制器实际上需要一些细节,并根据它创建了一个排队的项目。我甚至用Laravel中的ID序列化问题创建了这个项目(我原本以为这可能会导致我的问题,但他们甚至只使用这个代码库)
我的工作类位于
之下<?php
namespace App\Jobs;
use App\Notifications\CollectionReportGenerated;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use App\Models\User;
use App\Models\Collection;
use App\Libraries\InstagramEngine;
use App\Libraries\Profile;
use Excel;
class ProcessCollectionReport implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $userId;
protected $collectionId;
protected $start;
protected $end;
/**
* The number of times the job may be attempted.
*
* @var int
*/
public $tries = 5;
/**
* The number of seconds the job can run before timing out.
*
* @var int
*/
public $timeout = 210;
/**
* Create job instance
* ProcessCollectionReport constructor.
* @param User $userId
* @param Collection $collectionId
* @param $start
* @param $end
*/
public function __construct($userId, $collectionId, $start, $end)
{
// access arguments
$this->userId = $userId;
$this->collectionId = $collectionId;
$this->start = $start;
$this->end = $end;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
// set base profiles
$profiles = new \stdClass();
$profiles->ranges = dateRanges($this->start, $this->end);
$profiles->accounts = array();
// get collection
$collection = Collection::find($this->collectionId);
$user = User::find($this->userId);
// loop through accounts in collection
foreach($collection->accounts as $account)
{
// create new profile instance
$profile = new Profile($this->start, $this->end);
// gets media for account
$media = InstagramEngine::getAccountMediaByUserId($account, $this->start, $this->end);
}
}
}
现在你可以看到,在我的工作中,我对一个类+函数getAccountMediaByUserId
进行了外部调用 - 这个类接受了一个帐户模型的第一个参数,但是从上面的错误来看,它看起来像是传递包含所有模型的整个数组。该功能的代码如下:
/**
* Returns account media within specified range for Instagram Account by ID
* @param Account $account
* @param $start
* @param $end
* @return array
*/
public static function getAccountMediaByUserId(Account $account, $start, $end)
{
// set up unique cached key for API call
$cache_key = sha1($account->username.$start.$end);
// check if we have this API call cached
if(Cache::has($cache_key))
{
// return results
return Cache::get($cache_key);
}
// set up default response
$return = array();
// set breaker to false
$breaker = false;
$page = 1;
// set initial URL for API call
$url = 'https://api.instagram.com/v1/users/'.$account->instagram_id.'/media/recent/?count=30&access_token='.Auth::user()->primaryAccount->access_token;
}
让我感到困惑的是,如果设置缓存而不是代码工作很奇怪,因为如果我传递整个数组那么为什么$account->username
可以工作但不是$account->Instagram_id
我真的不明白为什么只有当我使用数据库不同步时才会发生这种情况。
非常感谢
答案 0 :(得分:0)
解决:
我在我的工作中使用auth :: user,当作为工作运行时不可用
由于
丹尼尔