【问题标题】:ErrorException: Trying to get property of non-object (Laravel Framework)ErrorException:试图获取非对象的属性(Laravel 框架)
【发布时间】:2017-02-25 18:36:25
【问题描述】:

Solr 工作正常时出现错误。我检查了使用 IP 和端口,并且 HTML 正在打开。由于我是 Laravel 的新手,而且 Solr 无法理解发生了什么。我刚刚将 WebApp 从一个 VM 迁移到另一个 VM。我开始面临这个问题。使用 Laravel 5.2 并在 CentOS7.2 上运行的应用程序

ErrorException: 试图获取非对象的属性 /srv/websites/webapp.com/app/webapp/Solr/Solr.php:248

这是来自 Laravel 日志的完整错误。

[2016-10-15 00:33:57] production.ERROR: ErrorException: Trying to get property of non-object in /srv/websites/webapp.com/app/webapp/Solr/Solr.php:248
Stack trace:
#0 /srv/websites/webapp.com/app/webapp/Solr/Solr.php(248): Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(8, 'Trying to get p...', '/srv/websites/r...', 248, Array)
#1 /srv/websites/webapp.com/app/Http/Controllers/SearchController.php(39): App\webapp\Solr\Solr->search(Array)
#2 [internal function]: App\Http\Controllers\SearchController->getSearchResponse()
#3 /srv/websites/webapp.com/bootstrap/cache/compiled.php(9424): call_user_func_array(Array, Array)
#4 /srv/websites/webapp.com/bootstrap/cache/compiled.php(9486): Illuminate\Routing\Controller->callAction('getSearchRespon...', Array)
#5 /srv/websites/webapp.com/bootstrap/cache/compiled.php(9466): Illuminate\Routing\ControllerDispatcher->call(Object(App\Http\Controllers\SearchController), Object(Illuminate\Routing\Route), 'getSearchRespon...')
#6 [internal function]: Illuminate\Routing\ControllerDispatcher->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#7 /srv/websites/webapp.com/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(52): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#8 [internal function]: Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#9 /srv/websites/webapp.com/bootstrap/cache/compiled.php(9948): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#10 /srv/websites/webapp.com/bootstrap/cache/compiled.php(9467): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#11 /srv/websites/webapp.com/bootstrap/cache/compiled.php(9454): Illuminate\Routing\ControllerDispatcher->callWithinStack(Object(App\Http\Controllers\SearchController), Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request), 'getSearchRespon...')
#12 /srv/websites/webapp.com/bootstrap/cache/compiled.php(8524): Illuminate\Routing\ControllerDispatcher->dispatch(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request), 'App\\Http\\Contro...', 'getSearchRespon...')
#13 /srv/websites/webapp.com/bootstrap/cache/compiled.php(8511): Illuminate\Routing\Route->runController(Object(Illuminate\Http\Request))
#14 /srv/websites/webapp.com/bootstrap/cache/compiled.php(8225): Illuminate\Routing\Route->run(Object(Illuminate\Http\Request))
#15 [internal function]: Illuminate\Routing\Router->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#16 /srv/websites/webapp.com/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(52): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#17 [internal function]: Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#18 /srv/websites/webapp.com/bootstrap/cache/compiled.php(9948): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#19 /srv/websites/webapp.com/bootstrap/cache/compiled.php(8226): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#20 /srv/websites/webapp.com/bootstrap/cache/compiled.php(8217): Illuminate\Routing\Router->runRouteWithinStack(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request))
#21 /srv/websites/webapp.com/bootstrap/cache/compiled.php(8207): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request))
#22 /srv/websites/webapp.com/bootstrap/cache/compiled.php(2419): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request))
#23 [internal function]: Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}(Object(Illuminate\Http\Request))
#24 /srv/websites/webapp.com/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(52): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#25 /srv/websites/webapp.com/app/Http/Middleware/Wizard.php(14): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#26 [internal function]: App\Http\Middleware\Wizard->handle(Object(Illuminate\Http\Request), Object(Closure))
#27 /srv/websites/webapp.com/bootstrap/cache/compiled.php(9963): call_user_func_array(Array, Array)
#28 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#29 /srv/websites/webapp.com/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#30 /srv/websites/webapp.com/app/Http/Middleware/LoginRedirect.php(15): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#31 [internal function]: App\Http\Middleware\LoginRedirect->handle(Object(Illuminate\Http\Request), Object(Closure))
#32 /srv/websites/webapp.com/bootstrap/cache/compiled.php(9963): call_user_func_array(Array, Array)
#33 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#34 /srv/websites/webapp.com/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#35 /srv/websites/webapp.com/app/Http/Middleware/Analytics.php(20): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#36 [internal function]: App\Http\Middleware\Analytics->handle(Object(Illuminate\Http\Request), Object(Closure))
#37 /srv/websites/webapp.com/bootstrap/cache/compiled.php(9963): call_user_func_array(Array, Array)
#38 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#39 /srv/websites/webapp.com/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#40 /srv/websites/webapp.com/app/Http/Middleware/ClientInit.php(23): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#41 [internal function]: App\Http\Middleware\ClientInit->handle(Object(Illuminate\Http\Request), Object(Closure))
#42 /srv/websites/webapp.com/bootstrap/cache/compiled.php(9963): call_user_func_array(Array, Array)
#43 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#44 /srv/websites/webapp.com/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#45 /srv/websites/webapp.com/bootstrap/cache/compiled.php(13474): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#46 [internal function]: Illuminate\View\Middleware\ShareErrorsFromSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#47 /srv/websites/webapp.com/bootstrap/cache/compiled.php(9963): call_user_func_array(Array, Array)
#48 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#49 /srv/websites/webapp.com/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#50 /srv/websites/webapp.com/bootstrap/cache/compiled.php(11964): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#51 [internal function]: Illuminate\Session\Middleware\StartSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#52 /srv/websites/webapp.com/bootstrap/cache/compiled.php(9963): call_user_func_array(Array, Array)
#53 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#54 /srv/websites/webapp.com/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#55 /srv/websites/webapp.com/bootstrap/cache/compiled.php(13213): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#56 [internal function]: Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle(Object(Illuminate\Http\Request), Object(Closure))
#57 /srv/websites/webapp.com/bootstrap/cache/compiled.php(9963): call_user_func_array(Array, Array)
#58 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#59 /srv/websites/webapp.com/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#60 /srv/websites/webapp.com/bootstrap/cache/compiled.php(13150): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#61 [internal function]: Illuminate\Cookie\Middleware\EncryptCookies->handle(Object(Illuminate\Http\Request), Object(Closure))
#62 /srv/websites/webapp.com/bootstrap/cache/compiled.php(9963): call_user_func_array(Array, Array)
#63 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#64 /srv/websites/webapp.com/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#65 /srv/websites/webapp.com/app/Http/Middleware/Debug.php(19): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#66 [internal function]: App\Http\Middleware\Debug->handle(Object(Illuminate\Http\Request), Object(Closure))
#67 /srv/websites/webapp.com/bootstrap/cache/compiled.php(9963): call_user_func_array(Array, Array)
#68 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#69 /srv/websites/webapp.com/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#70 [internal function]: Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#71 /srv/websites/webapp.com/bootstrap/cache/compiled.php(9948): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#72 /srv/websites/webapp.com/bootstrap/cache/compiled.php(2366): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#73 /srv/websites/webapp.com/bootstrap/cache/compiled.php(2350): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request))
#74 /srv/websites/webapp.com/public/index.php(53): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request))
#75 {main}  

这里是 Solr.php 文件包含

<?php

namespace App\webapp\Solr;

use Config;

class Solr
{
    public static $ROWS_PER_PAGE = 8;
    private $curl;
    private $collection;
    private $first = false;

    public function __construct()
    {
        $host = config('solr.host').':'.config('solr.port', 3000);
        $this->curl = \Curl::create($host);
        $this->curl->addQuery('wt', 'json');
        $this->collection = config('solr.collection');
    }

    public function select()
    {
        return new self();
    }

    public function analysis($id)
    {
        $this->curl->addQuery('q', "id:Analysis-$id");

        return $this;
    }

    public function piece()
    {
        $this->curl->addQuery('q', 'type_primary:research or type_primary:outlook or type_primary:media');

        return $this;
    }

    public function event($id)
    {
        $this->curl->addQuery('q', "id:CMS-Events-$id");

        return $this;
    }

    public function citation($id)
    {
        $this->curl->addQuery('q', "id:CMS-Citation-$id");

        return $this;
    }

    public function thought($id)
    {
        $this->curl->addQuery('q', "id:CMS-Thought-$id");

        return $this;
    }

    public function keyword($keyword)
    {
        $this->curl->addQuery('fq', "keywords:\"$keyword\"");

        return $this;
    }

    public function fq($fq)
    {
        $this->curl->addQuery('fq', $fq);

        return $this;
    }

    public function first()
    {
        $this->first = true;

        return $this;
    }

    public function order($order)
    {
        $this->curl->addQuery('sort', $order);

        return $this;
    }

    public function skip($rows)
    {
        $this->curl->addQuery('start', $rows);

        return $this;
    }

    public function take($rows)
    {
        $this->curl->addQuery('rows', $rows);

        return $this;
    }

    public function retrieve()
    {
        $this->curl->addQuery('fl', implode(',', func_get_args()));

        return $this;
    }

    public function search($params, $debug = false)
    {

        # Loose query search using edismax query builder.
        $q = (isset($params['q']) && !empty($params['q'])) ? $params['q'] : '*:*';

        # If page is set
        $p = (isset($params['p']) && !empty($params['p'])) ? intval(abs($params['p'])) : 0;

        # Query filter weights for edismax
        $qf = [
            'authors^40',
            'keyword_primary^30',
            'keywords^20',
            'fulltext^10',
        ]; # = 100 Weight Total, Perfect Score

        # Boost Query
        $bq = [];
        if (isset($params['regions-geographic']) && is_array($params['regions-geographic'])) {
            foreach ($params['regions-geographic'] as $k => $v) {
                $bq[] = "keyword_primary:\"{$v}\"";
            }
        }
        if (isset($params['regions-economic']) && is_array($params['regions-economic'])) {
            foreach ($params['regions-economic'] as $k => $v) {
                $bq[] = "keyword_primary:\"{$v}\"";
            }
        }
        if (isset($params['topics']) && is_array($params['topics'])) {
            foreach ($params['topics'] as $k => $v) {
                $bq[] = "keyword_primary:\"{$v}\"";
            }
        }
        if (isset($params['authors']) && is_array($params['authors'])) {
            foreach ($params['authors'] as $k => $v) {
                $bq[] = "authors:\"{$v}\"";
            }
        }
        if (!empty($params['primary-keyword'])) {
            $bq[] = "(keyword_primary:\"{$params['primary-keyword']}\" OR authors:\"{$params['primary-keyword']}\")";
        }

        # Filter Query
        $fq1 = [];
        if (isset($params['regions-geographic']) && is_array($params['regions-geographic'])) {
            foreach ($params['regions-geographic'] as $k => $v) {
                $fq1[] = "keywords:\"{$v}\"";
            }
        }
        if (isset($params['regions-economic']) && is_array($params['regions-economic'])) {
            foreach ($params['regions-economic'] as $k => $v) {
                $fq1[] = "keywords:\"{$v}\"";
            }
        }
        if (isset($params['topics']) && is_array($params['topics'])) {
            foreach ($params['topics'] as $k => $v) {
                $fq1[] = "keywords:\"{$v}\"";
            }
        }
        if (isset($params['authors']) && is_array($params['authors'])) {
            foreach ($params['authors'] as $k => $v) {
                $fq1[] = "authors:\"{$v}\"";
            }
        }
        if (!empty($params['primary-keyword'])) {
            $fq1[] = "(keywords:\"{$params['primary-keyword']}\" OR authors:\"{$params['primary-keyword']}\")";
        }

        $fq2 = [];
        if (isset($params['content']) && is_array($params['content'])) {
            foreach ($params['content'] as $k => $v) {
                $fq2[] = "type_secondary:\"{$v}\"";
            }
        }

        # Content Template Filter
        $fq = '';
        if (!empty($fq1)):
            $fq .= '('.implode(' AND ', $fq1).')';
        if (!empty($fq2)) {
            $fq .= ' AND ';
        }
        endif;

        if (!empty($fq2)):
            $fq .= '('.implode(' OR ', $fq2).')';
        endif;

        # Minimum match required for return.
        $mm = 3;

        # Sort by score and then date created.
        //$sort="score desc, date_created desc";
        $sort = 'date_created desc';

        # List Filter for Objects
        $fl = 'page_title, url_absolute, date_created, date_unix_created, authors_primary, keyword_primary, keywords, type_primary, type_secondary';

        $this->curl->addQuery('defType', 'edismax');
        $this->curl->addQuery('q', $q);
        $this->curl->addQuery('qf', implode(' ', $qf));
        if (!empty($bq)) {
            $this->curl->addQuery('bq', implode(' OR ', $bq));
        }
        if (!empty($fq)) {
            $this->curl->addQuery('fq', $fq);
        }
        $this->curl->addQuery('mm', $mm);
        $this->curl->addQuery('sort', $sort);
        $this->curl->addQuery('start', $p * self::$ROWS_PER_PAGE);
        $this->curl->addQuery('rows', self::$ROWS_PER_PAGE);
        $this->curl->addQuery('fl', $fl);

        if ($debug) {
            echo "<pre style='word-wrap: break-word;'>";
            echo "Params:\n";
            var_dump($params);
            echo "Q:\n";
            var_dump($q);
            echo "QF:\n";
            var_dump($qf);
            echo "FQ:\n";
            var_dump($fq);
            echo "SORT:\n";
            var_dump($sort);
            echo "FL:\n";
            var_dump($fl);
            echo "Response:\n";
            var_dump($this->get(true, true));
            echo '</pre>';
            exit();
        }

        $response = $this->get(false, true);

        $r = [];
        $r['total'] = $response->response->numFound;
        $r['pages'] = ceil($response->response->numFound / self::$ROWS_PER_PAGE);
        $r['page'] = intval(abs($p));
        $r['rows'] = self::$ROWS_PER_PAGE;
        $r['docs'] = (isset($response->response->docs) && !empty($response->response->docs)) ? $response->response->docs : [];

        return $r;
    }

    public function get($debug = false, $raw = false)
    {
        $this->curl->setUri('solr', $this->collection, 'select');
        $response = $this->curl->get(array(
            'dataType' => \App\webapp\Curl\Curl::TYPE_JSON,
        ));

        if ($debug) {
            echo "\n<strong>".urldecode($this->curl->lastUrl())."</strong>\n";
        }
        if (!isset($response->response)) {
            return [];
        }

        $this->convertDatesToCarbon($response);

        if ($raw) {
            return $response;
        }

        return $this->first ? reset($response->response->docs) : $response->response->docs;
    }

    private function convertDatesToCarbon(&$response)
    {
        foreach ($response->response->docs as $doc) {
            if (isset($doc->created)) {
                $doc->created = new \Carbon\Carbon($doc->created);
            }
            if (isset($doc->modified)) {
                $doc->modified = new \Carbon\Carbon($doc->modified);
            }
        }
    }
}

【问题讨论】:

  • 第 248 行是....
  • 如果您打开 curl 请求的实际 URL - 响应是什么? Solr 中的日志是否显示任何有用的信息(即错误或显示正在发出请求)?
  • 第 248 行是 $r['total'] = $response->response->numFound; @德文
  • 如何打开请求的实际 URL。你能告诉我更多吗?我安装在 VM 上,但尚未配置。 @MatsLindh
  • @vikaskumawat80 所以错误意味着$response-&gt;response 不是一个对象。转储出$response,看看它是什么,然后调试。

标签: php database laravel exception solr


【解决方案1】:

也许只有问题是

$response->response->numFound

测试

$response->numFound

您可以添加这个以防止错误:“尝试获取非对象的属性”

$r['total'] = (property_exists($response), 'numFound') ? $response->numFound : null;

【讨论】:

    猜你喜欢
    • 2017-08-02
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 2021-07-19
    • 2016-11-30
    • 1970-01-01
    相关资源
    最近更新 更多