- 投稿日:2019-07-24T23:38:17+09:00
LaravelのControllerで生成・加工したデータをVue.jsのテンプレートファイルで利用する方法
はじめに
LaravelとVue.jsでちょっとしたアプリを作っていた時に、LaravelのControllerで生成・加工したデータをVue.jsのテンプレートファイルに渡して使用するには下記の手順でデータを渡す必要がありましたので今後必要になった時に直ぐに思い出せる様にまとめたいと思います。
Controller→View(Bladeファイル)→Vue(Vue.jsテンプレート)前提とするデータ構成
とある店舗情報を格納するデータをDB等から取得して下記の多次元配列としてControllerで整形したと想定します。
*Controllerでの細かいデータの取得・加工処理については本記事では割愛します。array(5){ 0 => array(5) 1 => array(5) 2 => array(5) 3 => array(5) 4 => array(5) }valueである各配列の中身は下記の様な形式のデータとします。
array(5){ 'shopId' => "testId1", 'shopName' => "testShop1", 'price' => "1000", 'shopTel' => "1234-5678-90", 'shopMessage' => array('short' => "test shot message", 'long' => "test long message" ), 'shopImage' => array('url1' => "https://example.com/sample1.jpg", 'url2' => "https://example.com/sample2.jpg" ) }Controller
順を追って、まずはControllerから流れを見て行きます。
上記の店舗情報データを$sampleDataとします。
この$sampleDataをVueファイルで配列の様に扱うにはjsonエンコーディングを行いオブジェクト化する必要があります。
$shopData = json_encode($sampleData);viewを指定する箇所を含めると下記の様な具合になります。
app/Http/Controllers/SampleController.php
public function index() { /*** データの加工処理は省略 ***/ // 配列のjsonエンコード化 $shopData = json_encode($sampleData); // viewファイルに$shopDataを渡す return view('index')->with('shopData', $shopData); }View
次はViewファイルを見て行きます。
bodyタグ内を下記の通り記述して行きます。
resources/views/index.blade.php
<main id="app"> <shop-page v-bind:shop-data="{{ $shopData }}"></shop-page> </main>shop-pageタグがVueテンプレートの内容を反映する箇所です。
このshop-pageタグにControllerから受け取ったデータをバインド(結びつける)します。
「v-bind」属性(ディレクティブ)でバインドを行います。
v-bindで指定した「shop-data」がVueテンプレート内にてControllerから来た$shopDataのデータを受け持つことになります。
Vueテンプレート内ではキャルメルケースのshopDataと言う名前でデータが利用されることになります。Vueテンプレート
Vueテンプレートの中身は下記の通りです。
resources/components/ShopPage.vue
<template> <div class="card text-white bg-dark mb-3" v-for="shop in shopData"> <div class="row no-gutters"> <img class="card-img" :src="shop.shopImage.url1" alt="no image"> <div class="card-body"> <h3 class="card-title">{{ shop.shopName }}</h3> <p class="card-text">{{ shop.shopMessage.short }}</p> </div> </div> </div> </template> <script> export default { props: { shopData: { type: Object }, }, name:'shop-page' } </script>scriptタグ内のprops(プロパティ)に記載されているshopDataがbladeファイル内での$shopDataになります。
型にObject型を指定する必要があります。データの利用例として、templateタグ内で店舗情報をBootstrapのcardで表示するコードを記載しています。
for文の要領で店舗情報ごとにcardを作成するには一番外側のcardクラスが指定されたdivタグ内でv-forディレクティブを設定する方法があります。
下記の通りに指定することでforeach文の様に各店舗情報のオブジェクトを抽出することが出来ます。v-for="shop in shopData"今回のデータ構成ではkeyの値を参照する必要の無い作りになっている為「v-for」ディレクティブでkeyの値を取得していませんが、もし必要な場合は下記の通りに記載する必要があります。
v-for="(shop, key) in shopData"「shop」はControllerで生成したの店舗ごとの情報をまとめたデータです。
このshopの値は「v-for」ディレクティブが指定されたタグ内で記載されている全てのタグ内で各データに沿ったkeyを指定することで利用出来ます。shop{ 'shopId' : "testId1", 'shopName' : "testShop1", 'price' : "1000", 'shopTel' : "1234-5678-90", 'shopMessage' : { 'short' : "test shot message", 'long' : "test long message" }, 'shopImage' : { 'url1' : "https://example.com/sample1.jpg", 'url2' : "https://example.com/sample2.jpg" } }h1タグやpタグにて文字列を出力する場合は下記の通り二重括弧を使って値を指定します。
<h1 class="card-title">{{ shop.shopName }}</h1> <p class="card-text">{{ shop.shopMessage.short }}</p>画像を表示させる場合は少し書き方が異なります。
src属性に画像データのパスやURLを指定しますが、「src」の直前に「:」(コロン)を指定する必要がある。<img class="card-img" :src="shop.shopImage.url1" alt="no image">店舗情報をボタンクリックイベント後の関数で利用したい場合は下記の様に「v-on:click」ディレクティブに関数名を指定してパラメータとして店舗情報を指定すると良いです。
関数定義内の各詳細のデータの指定の仕方は同様です。<a v-on:click="testFunc(shop)" href="javascript::void(0)" class="btn btn-primary">detail</a>ちなみに
bladeファイル上で配列のkey指定をして数値や文字列など単体のデータを渡す場合はControllerでjsonエンコードを行う必要はありません。
配列のままbladeファイルでkey指定することによって単体のデータを渡すことが出来ます。app/Http/Controllers/SampleController.php
$singleValue = array('key1' => 1, 'key2' => 2, 'key3' => 3);resources/views/index.blade.php
<shop-page v-bind:shop-data="{{ $shopData }}" v-bind:single-value="{{ $singleValue['key1'] }}" ></shop-page>この場合はVueファイル内ではpropsでNumber型やString型を指定する必要があります。
以上です。
LaravelをやるとVue.jsに触れる機会が出てくる為この辺りの理解も深める必要があるなと感じました!
- 投稿日:2019-07-24T22:55:25+09:00
codeigniterでthird_party内のcontrollerを使う
codeigniterのthird partyは便利です。色々なものをモジュール化して分けておける。configとかも、ある程度だいたいできちゃう。
けれどもコントローラーだけはだめ。なぜならコントローラーからthird partyを始めとした大体のクラスを読んじゃっているから。
けれどもthird partyにコントローラーとかを含めちゃって使い回せるようにしたい!!
というわけでやりましょう。
事前にファイルをrequireする
まあ、単純です。controllerファイルの先頭でthird party内のコントローラーを読み込んで、それをextendsするだけ。
まず、third party内に読み込むためのコントローラーを作ります。
application/third_party/test/controllers/Welcome_preset.phpdefined('BASEPATH') OR exit('No direct script access allowed'); class Welcome_preset extends CI_Controller{ public function index(){ $this->load->view('welcome_message'); } }次に、実際に参照されるコントローラー。
application/controllers/Welcome.phpdefined('BASEPATH') OR exit('No direct script access allowed'); require_once APPPATH . "third_party/test/controllers/Welcome_preset.php"; class Welcome extends Welcome_preset{ public function __construct(){ parent::__construct(); } }これで、Welcomeコントローラーに接続される時に実行されるのは継承元のWelcome_presetクラスのものとなります。
そのプロジェクトだけで利用したい関数とかを作りたかったら、参照先のWelcomeに書けばいいし、汎用的なのはpresetに、と取り回ししやすい形で運用できます。いえいいえい。
考え方はシンプルで、
接続
↓
Welcome.php
↓
Welcome_preset.php呼び出し
↓
Welcome_presetを継承したWelcomeクラス実行という感じ。
ソーシャルログイン系とか、自分の中で作り方が決まっててもうコントローラーまるまるコピペっとしてるやつとか、ちょっとした改変でOKとかってなってるものをこれで一括管理できます。楽ちんまるです。
さらに、Welcome_presetでMY_Contollerを継承するようにしておけば、
MY_Controller → Welcome_preset → Welcomeと、呼び出せるのでこれまた便利です。
- 投稿日:2019-07-24T21:26:42+09:00
Google Cloud Platformのタイムゾーン設定
GCPのAppEngine上でphpサーバーを動かして、Cloud SQLでMySQLを使っているのですが、
タイムゾーン設定がどちらもデフォルトでUTCになっており、JTCへの設定変更に詰まったのでメモに残します。Cloud SQLの設定
ダッシュボードの設定 > 設定の編集 から
default_time_zoneフラグに+09:00を追加する。
これでMySQLの接続して確認できたらOK
mysql> show variables like '%time_zone%'; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | UTC | | time_zone | +09:00 | +------------------+--------+AppEngineの設定
デプロイ時にapp.yamlと同じ場所にphp.iniを配置する。
php.iniの中には、
php.inidate.timezone = "Asia/Tokyo"以上です。
AppEngineが一番ハマったのに文量ほぼなかった。
- 投稿日:2019-07-24T19:44:37+09:00
Composerで特定パッケージのみを更新
ComposerでPHPのパッケージ管理を行っているとき、
composer updateコマンドを使用することで、パッケージの更新をまとめて行うことができます。ですが、テストの都合などで特定パッケージのみバージョンアップしたい場合もあります。
以下の方法を使えば、特定のパッケージのみを更新することができます。
※間違った点などあればご教授いただければ幸いです。
特定パッケージのみ更新する
composer updateコマンドの後にパッケージ名を指定すれば、composer.jsonに記載された特定のパッケージとその依存のみを最新バージョンに更新できます。$ composer update aws/aws-sdk-php特定ベンダーの全パッケージを一括で更新する
ワイルドカードを使用することで、
composer.jsonに記載された特定のベンダーの全てのパッケージとその依存を最新バージョンに更新できます。$ composer update aws/*依存パッケージの更新がないか事前に確認する
ただ、いくらパッケージを指定したとしても、依存パッケージが同時に更新されてしまう可能性があります。
そうした場合、
--dry-runオプションを付けて実行することで、実際に更新することなく何が更新されるかを事前にチェックすることができます。念の為、パッケージを最新にする前に挙動を確認しておくとよいです。
$ composer update --dry-run aws/aws-sdk-php参考
- 投稿日:2019-07-24T19:35:33+09:00
php-master-changes 2019-07-23
今日はストリームの読み書きでエラーを通知するようにする修正、pdo_oci の不要コードの削除、PDO で、"?" をエスケープできるようにする修正、ドキュメントの更新、テスト中に残っていた E_STRICT を削除する修正があった!
2019-07-23
nikic: Report errors from stream read and write operations
- https://github.com/php/php-src/commit/d59aac58b3e7da7ad01a194fe9840d89725ea229
- [7.4~]
- ストリームの読み書きでエラーを通知するよう修正
- php_stream_read() and php_stream_write() が ssize_t を返すようになり、負値は失敗扱いで、fread() とか fwrite() が false を返す
- EWOULDBLOCK と EAGAIN はノンブロッキングストリームではエラー扱いではなく、読み書きサイズ 0 の成功扱い
- EINTR はなんか扱い決まってなくてふわっとしてる
- ユーザになんかこの変更でまずい影響出たら挙動は調整しそう、一旦入れてるという感じ
- #73535 の対応で、ストリーム API いじるなら今じゃねえの、みたいな感じのもよう
- #4433 あたりから話の流れたどれるけど気合要りそう
nikic: Also report errors from Zend stream reader operation
- https://github.com/php/php-src/commit/5664035ffef093a200d220330f3b17ee9b601fb2
- [7.4~]
- zend_stream の読み込みでも↑と同様にエラーを通知するよう修正
nikic: Add upgrading entries
- https://github.com/php/php-src/commit/845d07b3431e1e5901f609120360bf907fc7c08f
- [7.4~]
- UPGRADING、UPGRADING.INTERNALS に↑のストリーム API の修正について追記
petk: Remove HAVE_OCILOBISTEMPORARY and HAVE_OCICOLLASSIGN
- https://github.com/php/php-src/commit/5d827c89cf0aa14f51e57cbe4d4e1e90475899b6
- [7.4~]
- ext/pdo_oci で、使われていない HAVE_OCILOBISTEMPORARY と HAVE_OCICOLLASSIGN の削除
- ocijdbc8 のライブラリチェックも外してる
- ぶっちゃけもう Oracle8 のサポートしてないので、ext/oci8 って ext/oci でいいよねみたいな話もあったりするもよう
mbeccati: Fix FR #71885 (Allow escaping question mark placeholders)
- https://github.com/php/php-src/commit/b19fdc18a974929394c734d8b710d7a9ca3c9d3a
- [7.4~]
- ext/pdo で、"?" をエスケープできるよう修正
- "??" のように重ねると "?" で SQL がサーバに送られる
- PostgreSQL 等で "?" を使う演算子があるみたい
- PHP RFC: Escape PDO "?" parameter placeholder
petk: Update NEWS
- https://github.com/php/php-src/commit/8f384bea93dbc0de73fa66d58b70f63c03547606
- [7.2~]
- NEWS で、sapi/litespeed の更新を追記
derickr: Update NEWS for PHP 7.4.0beta1
- https://github.com/php/php-src/commit/2b540b2f520f77b738961071b1fc49815f1de6ae
- [7.4~]
- NEWS で、PHP 7.4.0beta1 のリリース日を 7/25 に更新
derickr: Update NEWS for 7.4.0beta2
- https://github.com/php/php-src/commit/a07e85f93fe446975f84948cfe905e2ec1c4db4a
- [7.4~]
- NEWS で、7.4 系の開発バージョンを PHP 7.4.0beta2 に引き上げ
Girgias: Cleanup of remaining E_STRICT in tests
- https://github.com/php/php-src/commit/6d6d954d0d28f488f743e6c9d0cd9ab01e1c4e41
- [7.4~]
- テスト中に残っていた E_STRICT の削除
- 投稿日:2019-07-24T17:03:41+09:00
PHPで数字を0埋めする
PHPで数字を0埋めするにはsprintf関数を使用します。
sprintf('%02d', 1); // 01 sprintf('%03d', 1); // 001
- 投稿日:2019-07-24T13:59:50+09:00
php-master-changes 2019-07-22
この日は システムの libgd 利用時の gd 拡張のビルド修正、fpm が SEGV で死ぬ問題の修正、reflection でクラス変数アクセスコードにクラススコープを適用するようにする修正、zend_update_class_constants() の実装への静的メンバーテーブルの初期化処理の追加、CI でこけるテストの修正、7.4 での大量の諸々の非推奨化、不要コードの削除、ドキュメントの更新、ReflectionReference において rc=1 の自己参照配列を特別扱いするようにする修正があった!
2019-07-22
remicollet: improve temporary fix for system libgd
- https://github.com/php/php-src/commit/fff6b18657c26d18a4154d974908101770c7b66d
- [7.4~]
- ext/gd で、config.m4 に PHP_GD_PNG、PHP_GD_JPEG を追加
- 先日の修正に関連、コメントで要るんじゃない?という話になった奴
plmnikulin: Prevent use after free in fpm_event_epoll_wait
- https://github.com/php/php-src/commit/bdf24f8d6d9d495ece354d6fd2dd6ed169198a2e
- [7.3~]
- sapi/fpm で、fpm_event_epoll_wait() の use after free の修正
- #77185
- これが原因で fpm が SEGV で死んだりしてた
dstogov: Evaluate constant in class scope
- https://github.com/php/php-src/commit/2f51764e5d91da11d47a99ba444cd00185298e23
- [7.4~]
- ext/reflection で、クラス変数アクセスコードにクラススコープを適用するよう修正
dstogov: Initialize static_members_table
- https://github.com/php/php-src/commit/60dca2295d4eb87873e85bed24880a948a4049cc
- [7.4~]
- Zend API zend_update_class_constants() の実装で、静的メンバーテーブルの初期化処理を追加
nikic: Reduce number of workers in test
- https://github.com/php/php-src/commit/5e4dbce5864811122110b49298e8b3eeb8b9d4b0
- [7.3~]
- sapi/fpm で、あるテストで使うワーカー数を 10 から 4 に減らした
- CI で 10 だとなんか具合悪かったもよう
nikic: Deprecate get_magic_quotes_gpc() and get_magic_quotes_runtime()
- https://github.com/php/php-src/commit/b2ea507beab862a0167af6b99f44fe9c695ca4f0
- [7.4~]
- get_magic_quotes_gpc() と get_magic_quotes_runtime() の非推奨化
- PHP RFC: Deprecations for PHP 7.4
nikic: Deprecate array_key_exists() on objects
- https://github.com/php/php-src/commit/0ba7c3eadf2683e4581079ea04b5b3019a5b6cce
- [7.4~]
- array_key_exists() の非推奨化
- PHP RFC: Deprecations for PHP 7.4
nikic: Deprecate Reflection export() methods
- https://github.com/php/php-src/commit/3121b7174f4cb077b1165bf4feed1ec889472f1e
- [7.4~]
- Reflection の export() の非推奨化
- PHP RFC: Deprecations for PHP 7.4
nikic: Deprecate encoding as 3rd param to mb_strrpos()
- https://github.com/php/php-src/commit/39e756e7fe7b08092b4a75cf253442cba826e910
- [7.4~]
- mb_strrpos() の第三引数へエンコーディングを渡すのを非推奨化
- PHP RFC: Deprecations for PHP 7.4
nikic: Deprecate ezmlm_hash()
- https://github.com/php/php-src/commit/e9e2fa4ad4983961bb6e0c495cb0d94a5445714c
- [7.4~]
- ezmlm_hash() の非推奨化
- PHP RFC: Deprecations for PHP 7.4
nikic: Deprecate hebrevc()
- https://github.com/php/php-src/commit/4e4d8a4a6c96e2dd6376d512d31bdc26d5b355ba
- [7.4~]
- hebrevc() の非推奨化
- PHP RFC: Deprecations for PHP 7.4
nikic: Deprecate money_format()
- https://github.com/php/php-src/commit/b1cdf06673789cf5c379e7af88c5af98bd06735c
- [7.4~]
- money_format() の非推奨化
- PHP RFC: Deprecations for PHP 7.4
nikic: Deprecate is_real() function
- https://github.com/php/php-src/commit/4e190691e2d6a07dd79f3555d4d8d1f26e9f0a11
- [7.4~]
- is_real() の非推奨化
- PHP RFC: Deprecations for PHP 7.4
nikic: Deprecate FILTER_SANITIZE_MAGIC_QUOTES
- https://github.com/php/php-src/commit/cd2f2cd7d005fb6f23552b815892f7a885489976
- [7.4~]
- FILTER_SANITIZE_MAGIC_QUOTES の非推奨化
- PHP RFC: Deprecations for PHP 7.4
nikic: Deprecate implode() with swapped parameter order
- https://github.com/php/php-src/commit/46b982409a2448e860666e3e25eef320a3c5bf07
- [7.4~]
- implode() の引数順序を逆にしても動くのを非推奨化
- PHP RFC: Deprecations for PHP 7.4
nikic: Deprecate (real) cast
- https://github.com/php/php-src/commit/e41b7f6db42472158fd44bb502ee1b8e51dca610
- [7.4~]
- (real) での浮動小数点数キャストを非推奨化
- PHP RFC: Deprecations for PHP 7.4
nikic: Deprecate convert_cyr_string()
- https://github.com/php/php-src/commit/b3668aabf7d9bf1444edbbd13fe20de5d89e008e
- [7.4~]
- convert_cyr_string() の非推奨化
- PHP RFC: Deprecations for PHP 7.4
nikic: Deprecate restore_include_path()
- https://github.com/php/php-src/commit/964de035a7c9c78d262a7369a0b7a5eb747719ae
- [7.4~]
- restore_include_path() の非推奨化
- PHP RFC: Deprecations for PHP 7.4
nikic: Deprecate allow_url_include
- https://github.com/php/php-src/commit/b3f74b0b7d89ee8efe6897b9ed6397d8b80a15e0
- [7.4~]
- allow_url_include の非推奨化
- PHP RFC: Deprecations for PHP 7.4
nikic: Deprecate unbinding $this from non-static closure
- https://github.com/php/php-src/commit/28cf080701082cbb1848d511d38cc1ecd060a752
- [7.4~]
- 非スタティックのクロージャでの $this のアンバインドを非推奨化
- PHP RFC: Deprecations for PHP 7.4
nikic: Add deprecations to UPGRADING
- https://github.com/php/php-src/commit/23bb9f4e2ff1d8bae716631cfcd7f27d93f7266f
- [7.4~]
- UPGRADING で、諸々の非推奨化を追記
cmb69: Drop superfluous ENABLE_GD_TTF
- https://github.com/php/php-src/commit/d3d3404db7e8b82e171bfb119c69dc6770502ae4
- [7.4~]
- ext/gd で、不要な ENABLE_GD_TTF を削除
nikic: Remove test for bug #77185
- https://github.com/php/php-src/commit/b59a9381b989c5c434b30482b1c1b8493f3ceb27
- [7.3~]
- sapi/fpm で、CI でうまいこと動かないテストの削除
cmb69: Remove superfluous HAVE_GD_BUNDLED checks
- https://github.com/php/php-src/commit/f8202b5513455054464b9388793fa1c7093bfc1d
- [7.4~]
- ext/gd で、不要な HAVE_GD_BUNDLED の削除
petk: Remove HAVE_DSA_DEFAULT_METHOD
- https://github.com/php/php-src/commit/4b03e102c58f56cbf5f794f21face56abd662e90
- ビルドシステムで、不要な HAVE_DSA_DEFAULT_METHOD の削除
petk: Fix internals upgrading log
- https://github.com/php/php-src/commit/9b8bf13b3a7483df83d43eb4bb204be218f3bc97
- [7.4~]
- UPGRADING.INTERNALS で、消していないものが消したことになっていたのを修正
petk: Remove HAVE_PQPUTCOPYEND
- https://github.com/php/php-src/commit/a2b758dab5b5707e8d3efe18d7489349f8a60a1d
- [7.4~]
- ext/pgsql で、HAVE_PQPUTCOPYEND の削除
remicollet: cleanup gd build with system libgd - drop need to use libpng with system libgd - drop need to use libjpeg with system libgd - drop need to use libXpm with system libgd - drop need to use libfreetype with system libgd - improve configure comments
- https://github.com/php/php-src/commit/31d85b84178d81f64437aec185099231767f3a31
- [7.4~]
- ext/gd で、システムの libgd 利用時のビルドを修正
- libpng / libjpeg / libXpm / libfreetype はバンドル版の libgd 利用時のみ必要となった
nikic: Revert "Add ReflectionReference::getRefcount()"
- https://github.com/php/php-src/commit/19588a8f3be1dc223dfb15067eef35e1908a8ba7
- [7.4~]
- ext/reflection で、先日の修正をリバート
- かわりに↓の修正が入った
nikic: Special-case rc=1 self-referential arrays in ReflectionReference
- https://github.com/php/php-src/commit/c817b8020c8a835946681ca94b9257e78e64dad3
- [7.4~]
- ext/reflection で、ReflectionReference において rc=1 の自己参照配列を特別扱いするよう修正
- #78263 の対応のやり直し
- 投稿日:2019-07-24T13:38:50+09:00
Laravelでいいね機能
環境
PHP 7.3
Laravel 5.8Laravelにいいね機能を実装しようと思い、調べていたらLaravel-LoveというライブラリがLaravel Newsで紹介されていました。
準備
今回は
UserモデルでPostモデルにいいねします。インストール
$ composer require cybercog/laravel-love
Likeタイプを生成$ php artisan love:reaction-type-add Like 1Reactarebl(いいねするモデル)の準備
app/User.php<?php namespace App; use Cog\Contracts\Love\Reacterable\Models\Reacterable as ReacterableContract; use Cog\Laravel\Love\Reacterable\Models\Traits\Reacterable; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable implements ReacterableContract { use Reacterable; }$ php artisan love:setup-reacterable --model="App\User" --nullableReactable(いいねされるモデル)準備
app\Post.php<?php namespace App; use Cog\Contracts\Love\Reactable\Models\Reactable as ReactableContract; use Cog\Laravel\Love\Reactable\Models\Traits\Reactable; use Illuminate\Database\Eloquent\Model; class Post extends Model implements ReactableContract { use Reactable; }$ php artisan love:setup-reactable --model="App\Post" --nullable実際にいいねする
<?php use App\User; use App\Post; use Cog\Laravel\Love\ReactionType\Models\ReactionType; $user1 = User::find(1); $post1 = Post::find(1); $likeType = ReactionType::fromName('Like'); //リアクター、リアクタントとして登録。 //すでに登録してある場合、例外が投げられます。 if ($user1->isNotRegisteredAsLoveReacter()) { $user1->registerAsLoveReacter(); } if ($post1->isNotRegisteredAsLoveReactant()) { $post1->registerAsLoveReactant(); } $reacter = $user1->getLoveReacter(); $reactant = $post1->getLoveReactant(); //$user1が$post1をいいねしていないことを確認 if ($reacter->isNotReactedToWithType($reactant, $likeType)) { //$user1で$post1をいいね $reacter->reactTo($reactant, $likeType); } //$user1がいいねしたPostが入ったCollectionを取得 $posts = Post::query() ->whereReactedByWithType($reacter, $likeType) ->get(); //$post1をいいねしたUserが入ったCollectionを取得 $likeReactions = $post1 ->getLoveReactant() ->reactions() ->where('reaction_type_id', ReactionType::fromName('Like')->getId()) ->get(); $likeUsers = []; foreach ($likeReactions as $likeReaction) { $likeUsers[] = User::where('love_reacter_id', $likeReaction->getReacter()->id)->first(); } //$post1をいいねした数を取得 count($likeUsers); //いいね解除 if ($reacter->isReactedToWithType($reactant, $likeType)) { $reacter->unreactTo($reactant, $likeType); }参考
- 投稿日:2019-07-24T12:47:33+09:00
phpのsys_get_temp_dir()関数がmacのデフォルトだと変な位置になっててしかもpermissin errorという罠
php で一時ファイルを一時ファイルディレクトリに作成して配置したいのにできない
ファイルを一時的に保存すべくphpの関数sys_get_temp_dirから取得したディレクトリにファイルをtouchしたらPermission denied
出力してもたら以下の場所でした。
Macでは見かけないフォルダなんですけどここにアクセス権を与えればいいんですが、/tmpという有名なテンポラリを使ったほうが消し忘れも防げるしいいとおもうんです。/var/folders/49/w16_lxpn2qj_jp3fh1bjqxx00000gp/Tそこで、php.iniで設定できないか調べたら、設定項目が存在しません。
でも、ありました。sys_temp_dir
sys_temp_dir = /tmpこれをphp.iniに追加して再起動。これでOKです。
- 投稿日:2019-07-24T01:40:34+09:00
秘密鍵を使ったSSHでPDO接続
はじめに
業務で踏み台経由でDBへ接続する必要があった時やったこと。
PDOはSSH接続する方法はないっぽいので、SSHトンネルをバックグランドで実行しといて、
それ宛にPDOで接続する。バックグランド実行の方法はこちら
環境
- Mac
- PHP5.1
[クライアント] ---- [ 踏み台サーバー] ---- [データベース] ・Mac ・ユーザー ・アクセスは踏み台からのみ許可 ・PHP ・パスワード ・秘密鍵コード
バックグラウンドでSSHトンネリングの実行
-N 指定してリモートでコマンド実行できないようにしています。
停止のときに使うため、変数に格納しています。php$cmd = "ssh -f -N -L 13306:dbhost:3306 sshuser@sshhost -i key/id_rsa"; exec($cmd);[クライラント] -> [このトンネルへ13306で接続] -> [sshuser@sshhostとしてデータベースの3306へ転送] -> [データベース]PDO接続
SSHトンネリングを実行した状態で。
php//ローカルの13306へ向けて $dsn = 'mysql:dbname=db;host=127.0.0.1;port=13306'; $user = 'root'; $password = 'root'; try { $dbh = new PDO($dsn, $user, $password); echo "接続成功\n"; } catch (PDOException $e) { echo "接続失敗: " . $e->getMessage() . "\n"; exit(); }SSHトンネリングの停止
php//開始時に使ったコマンドを元に調べる $_cmd = "ps aux | grep '[0-9] ".$cmd."' | awk '{print $2}'"; exec( $_cmd ,$output ,$return_var ); //$ouput[0]にPID入っているのでkill exec('kill '.$output[0]);実装
DB設定やらポート設定はかくじで。
SSHTunneling.phpclass SSHTunneling{ private static $pids = array(); private static $cmd; public static function start(){ self::$cmd = 'ssh -f -N -L '.$tunnel_port.':'.DBConfig::$host_name.':'.DBConfig::$port.' '.$ssh_user.'@'.$ssh_host.' -i '.$private_key; echo self::$cmd.PHP_EOL; echo "SSHトンネリングを開始します。".PHP_EOL; exec( self::$cmd ,$output ,$return_var ); if( $return_var != 0) throw new Exception( $output[0] ); self::set_pid(); } private function set_pid(){ $_cmd = "ps aux | grep '[0-9] ".self::$cmd."' | awk '{print $2}'"; exec( $_cmd ,$outputs ,$return_var ); if( $return_var != 0) throw new Exception( $outputs[0] ); foreach ((array)$outputs as $output) { echo "SSH PID : ".$output.PHP_EOL; self::$pids[] = $output; } } public static function stop(){ echo "SSHトンネリングを終了します".PHP_EOL; foreach (self::$pids as $pid) { $_cmd = 'kill '.$pid; echo $_cmd.PHP_EOL; exec( $_cmd ,$output ,$return_var ); if( $return_var != 0) throw new Exception( $output[0] ); } } }php$dsn = 'mysql:dbname=db;host=127.0.0.1;port='.$tunnel_port; $db_user = 'root'; $db_password = 'root'; try { SSHTunneling::start(); $dbh = new PDO($dsn, $db_user , $db_password); echo "接続成功\n"; SSHTunneling::stop(); } catch (PDOException $e) { echo "接続失敗: " . $e->getMessage() . "\n"; SSHTunneling::stop(); exit(); }
- 投稿日:2019-07-24T00:56:04+09:00
PHPからSSHをバックグラウンドで実行、停止
はじめに
PHPで踏み台通してMySQLに接続する際にやったこと。
PECLだと専用関数あるらしいが、ない環境だったためシェルつかってバックグラウンドでやることに。バックグラウンド実行
変数に格納しているのは、停止のときに使うためです。
php$cmd = "ssh -f -i /tmp/key.txt ssh_user@host_name"; exec($cmd);オプション
- [ -f ] バックグランドで実行する
- [ -i ] 秘密鍵を使用する
バックグラウンドの停止
さっきのコマンドを元にPIDを取得して、killする。
php//開始時に使ったコマンドを元に調べる $_cmd = "ps aux | grep '[0-9] ".$cmd."' | awk '{print $2}'"; exec( $_cmd ,$output ,$return_var ); //$ouput[0]にPID入っているのでkill exec('kill '.$output[0]);
- 投稿日:2019-07-24T00:56:04+09:00
PHPでSSHをバックグラウンドで実行、停止
はじめに
PHPで踏み台通してMySQLに接続する際にやったこと。
PECLだと専用関数あるらしいが、ない環境だったためシェルつかってバックグラウンドでやることに。バックグラウンド実行
変数に格納しているのは、停止のときに使うためです。
php$cmd = "ssh -f -i /tmp/key.txt ssh_user@host_name"; exec($cmd);オプション
- [ -f ] バックグランドで実行する
- [ -i ] 秘密鍵を使用する
バックグラウンドの停止
さっきのコマンドを元にPIDを取得して、killする。
php//開始時に使ったコマンドを元に調べる $_cmd = "ps aux | grep '[0-9] ".$cmd."' | awk '{print $2}'"; exec( $_cmd ,$output ,$return_var ); //$ouput[0]にPID入っているのでkill exec('kill '.$output[0]);

