monteecristoo’s blog

https://twitter.com/irakaarozo

cloud9上のLaravelアプリケーション内のnode server(今回はredis)とsocket.ioでLaravelアプリケーション内のVueJSからwebsocket通信をするとき

node_server側

プロジェクト直下にmkdir node_server

npm init → entry point は server.js

npm install redis express socket.io

@/node_server/server.js

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var redis = require('redis');

server.listen(8081);
io.on('connection', function(socket) {
console.log('New client connected');
});

 

node_serverの動作確認は...

@node_server terminalから

>>> node server.js

errorが来なければOK.

 

Vuejs側

npm install vue-socket.io --save

@app.js

import VueSocketio from 'vue-socket.io';

Vue.use(VueSocketio, 'cloud9のaddress:8081'));

@hoge.vue

<template>
<div>
<h1>SOckeIo</h1>
</div>
</template>

<script>
export default {
sockets: {

}
}
</script>

 

ここでmake:authをしているとsocket通信がmiddleware->'auth'ではじかれるのでその場合は、middleware->'auth'がかからないルーティングをweb.phpに作って...

Vue.use(VueSocketio, 'cloud9のaddress/test:8890')); とする。

ここで Corsエラー

XMLHttpRequest cannot load /socket.io/?EIO=3&transport=polling&t=LliUlhx. Redirect from 'socket.io/?EIO=3&transport=polling&t=LliUlhx' to '/socket.io?EIO=3&transport=polling&t=LliUlhx' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin '' is therefore not allowed access.

ドメインのトップはauthから外さなきゃダメ???

---------------------------------------------------------------------------------------------------------

親ページがhttpsだとsocketはMixed ContentでVueで実装したcomponentが全てブロックされる。SSL/TLS通信に対応さえる必要がある。

→ トップページにmiddleware->('auth')をかませるとVueのコンテンツがhttpsで読み込まれる。

locslhost上のlaravelならそのままwebsocket通信でMix Contentsに引っかからない???

bladeTemplate内でのscriptの読み込みは...

{{ secure_asset('path') }} ですること。{{ asset('path') }} だとhttpになりはじかれる。

-----------------------------------------------------------------------------------------------------

server.jsでnode_serverのcloud9接続portを指定するときの注意

port番号は8081,8082にすること。これらがデフォルトで解放されているポート(8080はメインアプリ用)

参考:

https://socket.io/get-started/chat/docs.c9.io

https://socket.io/get-started/chat/

 

 server.jsの動作確認用

server.listen(8081, function(){
console.log('Listening on Port 8081');
});

app.get('/', function(req, res){
res.send('<h1>Hello world</h1>');
});

ドメイン:8081でHello worldが表示される

io.on('connection', function(socket) {
console.log('New client connected');
});

 

-------------------------------------------------------------------Amitav 25#9Vue2&Laravel5.3

Laravel Socialite + php artisan make:auth integration

scotch.io

$table->string('provider')->nullable();
$table->string('provider_id')->unique()->nullable();

 

Laravel tinker Basic Usage

テスト用データベースを作成

php artisan make:model Test -m

php artisan migrate

(phpmyadmin-ctl install)

tinkerを起動

php artisan tinker

tinker console内で...

$test = App\Test::create();

=> App\Test {#715
updated_at: "2017-05-08 05:43:30",
created_at: "2017-05-08 05:43:30",
id: 1,
}

データベースにデータが作成される

 

$user = new App\User

  > App\User {#678}
>>> $user->name = "tinker_test"
  => "tinker_test"
>>> $user
  => App\User {#678
  name: "tinker_test",
  }
>>> $user->save()

オブジェクトを作成してデータをセーブしていく方法もある。

-------------------------------------------------------------------------------------------

コマンド

$test = App\Test::find(1);

$test = App\Test::where('id', 1)->first();

$test = App\Test::whereId(1)->first(); (上に同じ)

$test->id=2;

一時データのidが2にupdate

$test->save();

データベースに反映される

$test->delete();

即データベースから削除される。soft_deleteが有効ならdeleted_atに値が入る。

soft-deleteを有効にしたいならmigrationファイルに別途カラム$table->softDeletes();を追記→カラムdeleted_atが付加される。

<<<< soft-delete時 >>>

$test->delete();

$test = App\Test::onlyTrashed()

soft-deleteされたオブジェクトへ

$test->forceDelete();

soft-deleteを完全に削除

-----------------------------------------------------------------------------------------------------------------

Eloquent ORM relationships を設定したDBの場合、例えば....

App\User

.....    public function messages ()

        {

              return $this->hasMany(Message::class);

        }

App\Message

......   public function user ()

         {

              return $this->belongsTo(User::class);

         }

と設定。tinkerからの操作は...

$user=App\User:::find(1)->messages()->create(['message' => 'from tinker'])

    => App\Message {#687
    message: "from tinker",
    user_id: 9,
    updated_at: "2017-05-08 11:21:02",
    created_at: "2017-05-08 11:21:02",
    id: 1,
    }

$user=App\User::find(1)->messages

    => Illuminate\Database\Eloquent\Collection {#704
    all: [
    App\Message {#694
    id: 1,
    created_at: "2017-05-08 11:21:02",
    updated_at: "2017-05-08 11:21:02",
    message: "from tinker",
    user_id: 9,
   },
    ],
    }

 

ダミーユーザーの作成

Userモデル、テーブルが作成済みの状態で

php artisan tinker

factory('App\User', 6)->create();

ダミーユーザー6人分が作成される
              

 

 

*error

laravel make:auth と socialite のintegration error

provider と provider_id を nullableまたはmake:auth経由のデフォルトの値を設定

auth後http通信に切り替わる(cloud9が共有SSLだから???)

参考:

qiita.com

cloud9 redis start up

cloud9にはredisがプリインストールされているので起動するだけ

  • sudo service redis-server start 

redisにアクセス

 

jenssegers/laravel-mongodb installation PHP7.1 on cloud9 未解決

*エラーでworkspaceにアクセスできなくなることがあるのでworkspaceをクローンして実行

mongodbのsetup

  • $ sudo pecl install mongodb
→ error
Warning: Invalid argument supplied for foreach() in Command.php on line 249

Warning: Invalid argument supplied for foreach() in /usr/share/php/PEAR/Command.php on line 249
solution:

sudo apt-get install php-pear

sudo apt-get install pkg-config

sudo apt-get install libbson-1.0

sudo apt-get install libmongoc-1.0-0


sudo apt-get install php7.1-xml

Add the following line to your php.ini file:

extension=mongodb.so

 

参考:

askubuntu.com

www.digitalocean.com

  • $ sudo pecl install mongodb
  • composer require jenssegers/mongodb
→ error:
  Problem 1
    - jenssegers/mongodb v3.0.0 requires mongodb/mongodb ^1.0.0 -> satisfiable by mongodb/mongodb[1.0.0, 1.0.1, 1.0.2].
    - jenssegers/mongodb v3.0.1 requires mongodb/mongodb ^1.0.0 -> satisfiable by mongodb/mongodb[1.0.0, 1.0.1, 1.0.2].
    - jenssegers/mongodb v3.0.2 requires mongodb/mongodb ^1.0.0 -> satisfiable by mongodb/mongodb[1.0.0, 1.0.1, 1.0.2].
    - mongodb/mongodb 1.0.2 requires ext-mongodb ^1.1.0 -> the requested PHP extension mongodb is missing from your system.
    - mongodb/mongodb 1.0.1 requires ext-mongodb ^1.1.0 -> the requested PHP extension mongodb is missing from your system.
    - mongodb/mongodb 1.0.0 requires ext-mongodb ^1.1.0 -> the requested PHP extension mongodb is missing from your system.
    - Installation request for jenssegers/mongodb ^3.0 -> satisfiable by jenssegers/mongodb[v3.0.0, v3.0.1, v3.0.2].

  To enable extensions, verify that they are enabled in those .ini files:
    - /etc/php5/cli/php.ini
    - /etc/php5/cli/conf.d/05-opcache.ini
    - /etc/php5/cli/conf.d/10-mysqlnd.ini
    - /etc/php5/cli/conf.d/10-pdo.ini
    - /etc/php5/cli/conf.d/20-curl.ini
    - /etc/php5/cli/conf.d/20-gd.ini
    - /etc/php5/cli/conf.d/20-json.ini
    - /etc/php5/cli/conf.d/20-mcrypt.ini
    - /etc/php5/cli/conf.d/20-mongo.ini
    - /etc/php5/cli/conf.d/20-mysql.ini
    - /etc/php5/cli/conf.d/20-mysqli.ini
    - /etc/php5/cli/conf.d/20-pdo_mysql.ini
    - /etc/php5/cli/conf.d/20-pdo_pgsql.ini
    - /etc/php5/cli/conf.d/20-pgsql.ini
    - /etc/php5/cli/conf.d/20-readline.ini
  You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.
solution: sudo apt-get install php-mongodb
参考:

github.com

 
  • composer require jenssegers/mongodb
succesfully installed!
composer.jsonに記載されてもcodeがインストールされない(未解決)

cloud9に特有のmongoDBのインストール
sudo apt-get install -y mongodb-org
$ mkdir data
$ echo
'mongod --bind_ip=$IP --dbpath=data --nojournal --rest "$@"' > mongod
$ chmod a+x mongod

$ ./mongod
→ インストール、起動できたもののcloud9のワークスペースにアクセス出来なくなるエラーが発生(原因不明)。
参考:

community.c9.io