質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.32%

  • PHP

    15239questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Laravel 5

    941questions

    Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

  • Twitter

    447questions

    Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

  • Model

    64questions

    MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

PHP/Laravelでモデルをnewしてインスタンスを生成しても「Trying to get property of non-object」とエラーになる

解決済

回答 1

投稿 2017/07/15 11:21

  • 評価
  • クリップ 0
  • VIEW 194

takutyu2

score 1

前提・実現したいこと

PHP(Laravel)で、リツイート数ランキングを作成しています。

Streaming APIによりツイートを取得する部分までは上手く行ったのですが、
その後のDBへのツイートの格納がうまくいかず、1日ハマってしまったのでご質問させて頂きます。

具体的には、Phirehoseというライブラリを使用し、Streaming APIよりツイートを取得し、
DBに格納するという処理を実装しているのですが、
最後のDB格納部分でエラーが発生してしまいます。

tinkerで確認すると、モデルをnewしてインスタンスを生成し、all()で取得することはできました。
そのため、下記でも書きましたが指定しているパスが違うのでは?と思っていますが、どこが原因か分かっておりません。

発生している問題・エラーメッセージ

var_dumpで色々試しましたが、App/Tweet.phpというEloquentモデルを生成し、
別phpファイルにてuseしてモデルをnewしています。

すると、以下のようなエラーメッセージが出ます。
(オブジェクトが見つからない、とのことでモデルのパスが違うのでは?と思っているのですが、どこが問題なのか分かっておりません。。)

Trying to get property of non-object

該当のソースコード

関連するソースコードを全て記載いたします。

①Eloquentモデルクラス
・Tweet.php

②Migrationファイル
・tweetsテーブルのMigrationファイル

③実行用のCommandsファイル
・TwitterStreaming.php
・Karnel.php

④DB格納用のファイル
・filter-oauth.php

⑤.env

・Tweet.php (App/)

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Tweet extends Model
{
    //
}

・Migrationファイル

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateTweetsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tweets', function (Blueprint $table) {
            $table->increments('id');
            $table->string('user_id')->nullable();
            $table->string('user_name')->nullable();
            $table->string('screen_name')->nullable();
            $table->string('post_id')->unique()->nullable();
            $table->date('posted_date')->nullable();
            $table->string('url')->nullable();
            $table->string('image_url')->nullable();
            $table->string('image_w')->nullable();
            $table->string('image_h')->nullable();
            $table->string('comment')->nullable();
            $table->integer('retweet_count')->nullable();
            $table->integer('favorite_count')->nullable();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('tweets');
    }
}

・TwitterStreaming.php (App/Console/Commands/)

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

// phirehoseを読み込み
require_once(base_path() . '/vendor/phirehose/lib/Phirehose.php');
require_once(base_path() . '/vendor/phirehose/lib/OauthPhirehose.php');
require_once(base_path() . '/vendor/phirehose/filter-oauth.php');

class TwitterStreaming extends Command
{

    protected $signature = 'twstreaming';

    protected $description = 'Get Twitter Streaming Data';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        // 環境変数からアクセストークン系呼び出し
        define("TWITTER_CONSUMER_KEY", env('TWITTER_CONSUMER_KEY'));
        define("TWITTER_CONSUMER_SECRET", env('TWITTER_CONSUMER_SECRET'));
        define("OAUTH_TOKEN", env('OAUTH_TOKEN'));
        define("OAUTH_SECRET", env('OAUTH_SECRET'));

        \Log::debug("Twitterstreaming : ---起動---");

        // ストリーミング開始
        $sc = new \FilterTrackConsumer(OAUTH_TOKEN, OAUTH_SECRET, \Phirehose::METHOD_FILTER);
        $sc->setLang('ja'); // 日本語のみ取得
        $sc->setTrack(array('#ねこ'));
        $sc->consume();
    }
}

・Kernel.php (App/Console/)

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    protected $commands = [
        Commands\TwitterStreaming::class
    ];

    protected function schedule(Schedule $schedule)
    {
        $schedule->command('twstreaming')
                 ->hourly();
    }

    protected function commands()
    {
        require base_path('routes/console.php');
    }
}

・filter-oauth.php (vendor/phirehose/)

<?php
// require_once(base_path() . '/vendor/phirehose/lib/Phirehose.php');
// require_once(base_path() . '/vendor/phirehose/lib/OauthPhirehose.php');
// require_once(app_path() . '/Tweet.php');

use App\Tweet;

class FilterTrackConsumer extends OauthPhirehose
{

  public function enqueueStatus($status)
  {
    // jsonをデコード
    $tweets = json_decode($status);

    // ツイートのIDが存在する かつ 文字列に"RT"を含まないツイートのみDBに格納
    if (isset($tweets->id) && strpos($tweets->text, 'RT') === false) {

      // ツイート毎にDBに格納
      foreach ($tweets as $tweet) {

        // DBに保存
        // Tweetモデルのインスタンス$tweet_dataを作成
        $tweet_data = new Tweet;

        // DBのカラムに$tweetの中身を全部格納
        $tweet_data->user_id        = $tweet->user->id;
        $tweet_data->user_name      = $tweet->user->name;
        $tweet_data->screen_name    = $tweet->user->screen_name;        
        $tweet_data->post_id        = $tweet->id;
        $tweet_data->posted_date    = date('Y-m-d H:i:s', strtotime($tweet->created_at));
        $tweet_data->url            = 'https://twitter.com/' . $tweet->user->screen_name . '/status/' . $tweet->id;
        $tweet_data->image_url      = $tweet->entities->media->media_url_https;
        $tweet_data->image_w        = $tweet->entities->media->sizes->large->w;
        $tweet_data->image_h        = $tweet->entities->media->sizes->large->h;
        $tweet_data->comment        = trim(str_replace($tweet->entities->media->url, '', $tweet->text));
        $tweet_data->retweet_count  = $tweet->retweet_count;
        $tweet_data->favorite_count = $tweet->favorite_count;
        $tweet_data->save();
      }
    }
  }
}

・.env(関係しそうなところのみ抜粋)

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=socialnavi
DB_USERNAME=root
DB_PASSWORD=

試したこと

mysqlにてtweetsテーブルは存在し、テスト用にクエリも入れています。

php artisan tinkerにて、以下のようにモデルをnewして取得ができています。
tinkerを実施したディレクトリはこのアプリケーションのrootディレクトリ直下です。

>>> $tweet = new App\Tweet;
=> App\Tweet {#706}
>>> $tweet = App\Tweet::all();
=> Illuminate\Database\Eloquent\Collection {#717
     all: [
       App\Tweet {#719
         id: 1,
         user_id: "1",
         user_name: "taku",
         screen_name: "Taku",
         post_id: "1",
         posted_date: null,
         url: null,
         image_url: null,
         image_w: null,
         image_h: null,
         comment: null,
         retweet_count: null,
         favorite_count: null,
         created_at: null,
         updated_at: null,
       },
     ],
   }

補足情報(言語/FW/ツール等のバージョンなど)

PHP 7.0.20
Laravel 5.3

長文で恐れ入りますが、何卒宜しくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

色々と間違えすぎてるようなのでこれを使ってみてください。
https://github.com/spatie/laravel-twitter-streaming-api

・TwitterStreaming.php (App/Console/Commands/)
Laravel内からrequire_once使うことはほぼありません。

・filter-oauth.php (vendor/phirehose/)
Laravel下ではないのでuse App\Tweetしても使えません。

投稿 2017/07/15 14:09

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/17 21:01

    vendor配下ではmodelをuseしても使えないのですね。
    頂いたstreaming apiのサンプルを導入して、実装し直してみます。

    有難う御座います!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.32%

関連した質問

同じタグがついた質問を見る

  • PHP

    15239questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Laravel 5

    941questions

    Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

  • Twitter

    447questions

    Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

  • Model

    64questions

    MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

  • トップ
  • PHPに関する質問
  • PHP/Laravelでモデルをnewしてインスタンスを生成しても「Trying to get property of non-object」とエラーになる