- 投稿日:2021-01-16T22:29:46+09:00
TwitterOAuthでCa-Bundleが見つからないエラー
概要
PHPでTwitterOAuthを使おうとしたのだが、次のようなエラーが出てしまった。
Fatal error: Uncaught Error: Class 'Composer\CaBundle\CaBundle' not found
Ca-Bundleもautoloadするようにしたところ解決した。エラーの内容
まず、TwitterOAuthをComposerでインストールするために、
php compsoer.phar require abraham/twitteroauth
とコマンドを実行した。これはtwitteroauthのインストール方法を参考にしている。これを実行すると、カレントディレクトリに
abraham
というフォルダが作成され、この中にtwitteruoauthのライブラリが入っている。
このフォルダを、phpファイルと同じディレクトリに置いた。次のようなコードで、twitteroauthをphp内でrequireする。
twitter_api._sample.phprequire_once __DIR__ . '/abraham/twitteroauth/autoload.php';すると、このようなエラーが出てきてTwitterAPIを実行できなかった。
Fatal error: Uncaught Error: Class 'Composer\CaBundle\CaBundle' not found
同様のエラー報告
TwitterOAuthのGitHubのissue(https://github.com/abraham/twitteroauth/issues/892 )には同様のエラーが報告されている。ただ、状況の説明がされておらず、再現ができなさそうだった。
解決方法
abraham/twitteroauth/autoload.php
を実行してライブラリを呼び出すと、Composerの新しいライブラリであるCaBundle
をロードできないのが原因だった。
そこで、次のようにca-bundleとtwitteroauthをautoloadできるようにする。1. compsoer.jsonを次のように書く
composer.json{ "require": { "abraham/twitteroauth": "^2.0", "composer/ca-bundle": "^1.2" } }2.
php composer.phar install
をcomposer.json
のあるディレクトリで実行する
3.vender
というフォルダが作成されるので、このフォルダをphpファイルと同じディレクトリに置く
4. phpファイルで次のようにrequireするtwitter_api._sample.phprequire_once __DIR__ . '/vender/autoload.php';これで、ca-bundleとtwitteroauthをロードすることができる。twitterAPIも使えるようになる。
TwitterOAuthの公式ドキュメントhttps://packagist.org/packages/abraham/twitteroauth によると、バージョン1.2.0以降でca-bundleをrequireするようになっている。これ以降のバージョンではca-bundleがないとエラーが出る。これは2020年9月のリリースなので、エラーとしてはあまり報告されていない。
まとめ
Ca-Bundleがなくて怒られるエラーが出た場合、twitteroauth内のautoload.phpを実行していることがある。その際は、composer.jsonで作成したautoload.phpを読み込む必要がある。
それでもうまくいかない場合は、twitteroauthのバージョンを1.1.0に下げて試すこともした方がいい。
https://github.com/abraham/twitteroauth/issues/892#issuecomment-760157284 でこの件を報告したので、解決しなかったらこちらにコメントください。
- 投稿日:2021-01-16T15:14:06+09:00
Docker × Laravel ローカル環境でHTTPS(SSL)通信する
ローカル環境でもHTTPS通信したいという要望があり、ちょうど最近仕事でやる機会があったのでQiitaにもまとめたいと思います。
Laravel環境構築
$ git clone git@github.com:ucan-lab/docker-laravel.git $ cd docker-laravel $ make create-project認証局、鍵の準備
mkcert, nssのインストール
- https://github.com/FiloSottile/mkcert
- ローカルで信頼できる開発証明書を作成するためのツール
- https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS
- Network Security Services
- FirefoxでlocalhostのSSLを有効化するために必要
$ brew install mkcert nssローカル認証局(CA: Certification Authority)の作成
$ mkcert -installChromeのSSL警告をlocalhostの時だけ表示しないようにする。
chrome://flags/#allow-insecure-localhost
アドレスバーに入力する。
DISABLED
=>ENABLED
に変更してブラウザを再起動する。秘密鍵、公開鍵の作成
コマンドの実行は
docker-laravel
ディレクトリルートで行ってください。$ mkcert -cert-file ./infra/docker/nginx/localhost.pem -key-file ./infra/docker/nginx/localhost-key.pem localhostDockerのコード書き換え
docker-compose.yml
公開ポートを
80
から443
へ変更する。
HTTPSは、ウェルノウンポート番号として443
が使われるのが一般的です。docker-compose.ymlservices: web: ports: - ${WEB_PORT:-443}:443infra/docker/nginx/default.conf
下記のコードを追記する。
infra/docker/nginx/default.confserver { # listen 80; listen 443 ssl; server_name localhost; ssl_certificate /etc/nginx/conf.d/localhost.pem; ssl_certificate_key /etc/nginx/conf.d/localhost-key.pem; # ... 省略 }infra/docker/nginx/Dockerfile
下記のコードを追記する。
infra/docker/nginx/DockerfileCOPY ./*.pem /etc/nginx/conf.d/
- 秘密鍵、公開鍵をコピーしてます。
Dockerイメージの作成、コンテナ再生成
コマンドの実行は
docker-laravel
ディレクトリルートで行ってください。$ docker-compose build web $ make restartこのようにSSL証明書が有効化されていればokです。
- 投稿日:2021-01-16T12:29:24+09:00
PhpStormのコードフォーマッタをWordPressのコーディングスタイルにする
WordPressのコーディングスタイルが普段使っているフレームワークのと異なり不便だったのでPhpStormに助けてもらったので設定方法をメモ。(Mac前提)
Preference を開いて
① Editor > Code Style > PHP を開く
② プロジェクト毎かPhpStorm自体の設定とするか選択
③ WordPressのスタイルを選択で、OKで閉じる。
設定後はソースコード開いて(キー設定変えてなければ) option + command + l (エル)のショートカットキーでフォーマッタを適用できる。
以上!
- 投稿日:2021-01-16T11:45:53+09:00
【PHP】array_filterの色々な書き方
array_filterとは
array_filter(array $array, callable|null $callback = null, int $mode = 0): array(PHP 4 >= 4.0.6, PHP 5, PHP 7)
array_filter
コールバック関数を使用して、配列の要素をフィルタリングする
公式より配列を非破壊的にフィルターするPHPの組み込み関数です
パターン 1 (コールバック関数)
$arr = ['a', 'b']; $res = array_filter($arr, function($val) { return $val === 'a'; }); // ['a']【メリット】
・一番王道(多分)
・読みやすい
・関数名が考えなくてよい【デメリット】
・条件式を再利用することができないパターン 2 (クロージャ)
$arr = ['a', 'b']; $func = function($val) { return $val === 'a'; }; $res = array_filter($arr, $func); // ['a']【メリット】
・関数($func)のスコープを狭めることができる【デメリット】
・見慣れていない人にとっては読みにくい
・func内で、スコープ外の変数を扱う時に必要
(useは変数が定義された時の値となるため)パターン 3 (関数)
$arr = ['a', 'b']; function func($val) { return $val === 'a'; } $res = array_filter($arr, 'func'); // ['a']【メリット】
・同じ条件でフィルターしたい時、関数を再利用することができる【デメリット】
・関数をグローバルに定義している、汚染しないような工夫が必要パターン 4 (クラスのメリット)
class Filter { public function func($val) { return $val === 'a'; } } $arr = ['a', 'b']; $obj = new Filter; $res = array_filter($arr, [$obj, 'func']); // or $res = array_filter($arr, [new Filter, 'func']); // ['a']【メリット】
・フィルター用のクラス(関数群)を用意することができる【デメリット】
・呼び出し元でnewが必要
・クラスの中身を見ないと、条件式が見れないパターン 5 (クラスの静的メソッド)
class Filter { public static function func($val) { return $val === 'a'; } } $arr = ['a', 'b']; $res = array_filter($arr, 'Filter::func'); // or $res = array_filter($arr, ['Filter', 'func']); // ['a']【メリット】
・フィルター用のクラス(関数群)を用意することができる【デメリット】
・クラスの中を見ないと、条件式が見れないパターン 6 (マジックメソッド __invoke())
class Filter { public function __invoke($val) { return $val === 'a'; } } $arr = ['a', 'b']; $res = array_filter($arr, new Filter); // ['a']【メリット】
・呼び出し元での、コード量が少ない【デメリット】
・フィルター用に1つクラスを用意することになるパターン 7 (アロー関数)
$arr = ['a', 'b']; $res = array_filter($arr, fn ($val) => $val === 'a'); // ['a']【メリット】
・コード量が少ない
・JavaScriptを書いている人にとっては、読みやすいかも?【デメリット】
・php 7.4以上でないと使えない
・コールバック関数(パターン1)より遅いらしいパターン おまけ(null)
$arr = ['a', '']; $res = array_filter($arr); // ['a']空を取り除いてくれます。内部的には
empty()
を行っています。おわりに
調べてみたら奥が深かったです。
よほどのことがない限り、パターン1,2かなと思っています。
新しい記法見つけたら、追記していきます。参考
- 投稿日:2021-01-16T11:45:53+09:00
【PHP】 array_filterの色々な書き方
array_filterとは
array_filter(array $array, callable|null $callback = null, int $mode = 0): array(PHP 4 >= 4.0.6, PHP 5, PHP 7)
array_filter
コールバック関数を使用して、配列の要素をフィルタリングする
公式より配列を非破壊的にフィルターするPHPの内部関数です
パターン 1 (コールバック関数)
$arr = ['a', 'b']; $res = array_filter($arr, function($val) { return $val === 'a'; }); // ['a']【メリット】
・一番王道(多分)
・読みやすい
・関数名を考えなくてよい【デメリット】
・条件式を再利用することができないパターン 2 (クロージャ)
$arr = ['a', 'b']; $func = function($val) { return $val === 'a'; }; $res = array_filter($arr, $func); // ['a']【メリット】
・関数($func)のスコープを狭めることができる【デメリット】
・見慣れていない人にとっては読みにくい
・func内で、スコープ外の変数を扱う時に必要
(useは変数が定義された時の値となるため)パターン 3 (関数)
$arr = ['a', 'b']; function func($val) { return $val === 'a'; } $res = array_filter($arr, 'func'); // ['a']【メリット】
・同じ条件でフィルターしたい時、関数を再利用することができる【デメリット】
・関数をグローバルに定義している、汚染しないような工夫が必要パターン 4 (クラスのメリット)
class Filter { public function func($val) { return $val === 'a'; } } $arr = ['a', 'b']; $obj = new Filter; $res = array_filter($arr, [$obj, 'func']); // or $res = array_filter($arr, [new Filter, 'func']); // ['a']【メリット】
・フィルター用のクラス(関数群)を用意することができる【デメリット】
・呼び出し元でnewが必要
・クラスの中身を見ないと、条件式が見れないパターン 5 (クラスの静的メソッド)
class Filter { public static function func($val) { return $val === 'a'; } } $arr = ['a', 'b']; $res = array_filter($arr, 'Filter::func'); // or $res = array_filter($arr, ['Filter', 'func']); // ['a']【メリット】
・フィルター用のクラス(関数群)を用意することができる【デメリット】
・クラスの中を見ないと、条件式が見れないパターン 6 (マジックメソッド __invoke())
class Filter { public function __invoke($val) { return $val === 'a'; } } $arr = ['a', 'b']; $res = array_filter($arr, new Filter); // ['a']【メリット】
・呼び出し元での、コード量が少ない【デメリット】
・フィルター用に1つクラスを用意することになるパターン 7 (アロー関数)
$arr = ['a', 'b']; $res = array_filter($arr, fn ($val) => $val === 'a'); // ['a']【メリット】
・コード量が少ない
・JavaScriptを書いている人にとっては、読みやすいかも?【デメリット】
・php 7.4以上でないと使えない
・コールバック関数(パターン1)より遅いらしい
※コメントにも書きましたが、早い時と遅い時があるようですパターン おまけ(null)
$arr = ['a', '']; $res = array_filter($arr); // ['a']空を取り除いてくれます。内部的には
empty()
を行っています。おわりに
調べてみたら奥が深かったです。
よほどのことがない限り、パターン1,2かなと思っています。
新しい記法見つけたら、追記していきます。参考
- 投稿日:2021-01-16T11:45:09+09:00
wordpressで画像加工
はじめに
wordpressでは画像をアップロードするとサムネイル画像が自動生成される。
サムネイル画像が生成されるということは、画像をリサイズする関数やクラスが用意されているということ。
あまり紹介するページを見かけないが、結構便利なのでその関数やクラスを紹介する。WP_Image_Editor クラス
wrodpressで画像を加工する場合は
WP_Image_Editor
クラスを使う。WP_Image_Editorの使用例
$image = wp_get_image_editor( 'cool_image.jpg' ); if ( ! is_wp_error( $image ) ) { $image->rotate( 90 ); $image->resize( 300, 300, true ); $image->save( 'new_image.jpg' ); }WP_Image_Editorのメソッド
supports_mime_type( $mime_type )
エディターが指定されたMIMEタイプをサポートしているかどうかを確認する。
save( $destfilename = null, $mime_type = null )
画像をファイルに保存する。
$destfilename
の指定がなければ既存ファイルを上書きする。
resize( $max_w, $max_h, $crop = false )
画像をリサイズする。
$crop
をtrue
にするとトリミングされる。デフォルトはfalse
。
$crop
にはトリミング位置を指定する配列を指定することも可能。
配列の指定方法について詳しくは トリミングの配列の仕様 を参照。
multi_resize( $sizes )
現在のイメージを処理し、単一のソースから複数のサイズをディスクに保存する。
使用例
$sizes_array = array( // #1 - 100x100 矩形にリサイズ, はみ出した部分は切り抜く array ('width' => 100, 'height' => 100, 'crop' => true), // #2 - 横のmax 200, 縦のmax 100, 切り抜かない array ('width' => 200, 'height' => 100, 'crop' => false), // #3 - 縦 200 にリサイズ, 切り抜かない array ('width' => 9999, 'height' => 200, 'crop' => false), // #3 - 100x100 矩形にリサイズ, 左上を起点にしてはみ出した部分は切り抜く array ('width' => 450, 'height' => 450, 'crop' => array( 'left', 'top' )) ); $resize = $img->multi_resize( $sizes_array );ちなみに戻り値はリサイズされた画像たちのメタデータの配列。
crop( $src_x, $src_y, $src_w, $src_h, $dst_w = null, $dst_h = null, $src_abs = false )
画像をトリミングする。詳しくは wp_crop_image 関数 を参照。
rotate( $angle )
画像を反時計回りに
$angle
度回転する。
flip( $horz, $vert )
画像を水平軸または垂直軸で反転する。
stream( $mime_type = null )
画像をブラウザにストリーミングする。
get_size()
画像の幅(width)と高さ(height)を持つ配列情報を取得する。
update_size( $width = null, $height = null )
画像サイズを設定する。
set_quality( $quality )
画像圧縮品質を1〜100%のスケールで設定する。単位の%は不要で整数(1〜100)で指定する。WP_Image_Editor クラスで定義されているデフォルトの品質は90。
get_output_format( $filename = null, $mime_type = null )
指定されたファイルの拡張子とMIME、または現在のファイルの拡張子とMIMEに基づいて、優先されるMIMEタイプと拡張子を返す。
リクエストがサポートされていない場合、デフォルトで$this->default_mime_type
になる。
ファイル名が指定されている場合にのみ、修正されたファイル名を提供する。
generate_filename( $suffix = null, $dest_path = null, $extension = null )
現在のファイルに基づいて出力ファイル名を作成し、適切なサフィックスを追加する。
get_suffix()
高さと幅に基づいてファイルの適切なサフィックスを作成して返す。
make_image( $filename, $function, $arguments )
エディターの保存関数を呼び出すか、ファイルをストリームとして処理する。
get_mime_type( $extension = null )
wp_get_mime_types()
からマップされた、拡張子から最初に一致したMIMEタイプを返す。
get_extension( $mime_type = null )
wp_get_mime_types()
からマップされた、Mimeタイプから最初に一致した拡張子を返す。wp_crop_image 関数
wordpressで画像のトリミングをする場合は
wp_crop_image
関数が用意されている。書式
wp_crop_image( $src, $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h, $src_abs = false, $dst_file = false )引数
- $src
- (string | int) (必須) ソースファイルまたは添付ファイルID。
- $src_x
- (int) (必須) 切り抜きの開始x位置。
- $src_y
- (int) (必須) 切り抜きの開始y位置。
- $src_w
- (int) (必須) トリミングする幅。
- $src_h
- (int) (必須) トリミングする高さ。
- $dst_w
- (int) (必須) 宛先の幅。
- $dst_h
- (int) (必須) 宛先の高さ。
- $src_abs
- (int) (オプション) ソースクロップポイントが絶対的な場合。 デフォルト値:false
- $dst_file
- (文字列) (オプション) 書き込む宛先ファイル。 デフォルト値:false
戻り値
- (string | WP_Error)成功した場合は新しいファイルパス、失敗した場合はWP_Error。
add_image_size 関数
wordpressのサムネイル画像はデフォルトでは 'thumbnail'、'medium'、'large' の3つのサイズがある。
キーワード デフォルトのサイズ thumbnail 150 x 150 medium 300 x 300 large 1024 x 1024 いずれも管理画面から変更できる。
この他にもサムネイル画像のサイズのバリエーションを
add_image_size
関数で追加できる。書式
add_image_size( $name, $width, $height, $crop );
$crop
をtrue
にするとトリミングされる。デフォルトはfalse
。
$crop
にはトリミング位置を指定する配列を指定することも可能。
配列の指定方法について詳しくは トリミングの配列の仕様 を参照。使用例
// 縦横比固定で縦か横の最大値が300pxになる。 add_image_size( 'fixed_ratio_thumb', 300, 300 ); // 辺が300pxの正方形の画像を生成。縦横の短い方を300pxに縮小し、長い方はセンター寄せにして300pxを超える部分をカットする。 add_image_size( 'center_crop_thumb', 300, 300, true ); // 画像の縦は上から300pxをはみ出た部分をカットする。 add_image_size( 'top_crop_thumb', 300, 300, array('center','top') );ただし、サムネイル画像が生成されるのはアップロード時なので、
あとからこの関数でサイズを追加してもそのサイズのサムネイル画像は生成されない。
あとから追加したい場合は Regenerate Thumbnails などのプラグインで再生成する。トリミングの配列の仕様
配列の指定方法は
array( x_crop_position, y_crop_position )
で、デフォルトはarray( 'center', 'center' )
。
x_crop_position
はleft
,center
,right
が利用でき、
y_crop_position
はtop
,center
,bottom
が利用できる。
- 投稿日:2021-01-16T06:40:43+09:00
MeCab
http://taku910.github.io/mecab/
ここから、ダウンロードさせて頂いた MeCab 本体 mecab-0.996.tar.gz と
MeCab 用の辞書 mecab-ipadic-2.7.0-20070801.tar.gz を使用する。% tar zxfv mecab-0.996.tar.gz % cd mecab-0.996 % ./configure % make % make check % su % make install% tar zxfv mecab-ipadic-2.7.0-20070801.tar.gz % cd mecab-ipadic-2.7.0-20070801 % ./configure % make % su % make installこの時僕の環境では以下のエラーが発生した。
error while loading shared libraries: libmecab.so.2: cannot open shared object file: No such file or directory
ライブラリが認識されていなかったので以下を実行して再度トライ
% sudo ldconfig
これで無事完了
- 投稿日:2021-01-16T03:11:00+09:00
LaraveのhasOneとbelongsToの違い
参照先 or 参照される側 or 外部キーがある側は、belongsTo
参照元 or 参照する側 or 外部キーがない側は、hasOneUsersMedel.php[id,name] //だとする public function profile() { return $this->hasOne(Profiles::class, 'user_id', 'id'); }ProfilesMedel.php[id,memo,address,user_id] //だとする public function profile() { return $this->belongsTo(Users::class, 'user_id', 'id'); }
- 投稿日:2021-01-16T01:30:43+09:00
【3行で説明】プログラミングスクールの技術記事を検索結果に表示させない方法
※単純に初歩的すぎる記事を見る必要がなくなった時に使う方法です。他意はありません。
1.Chromeでこの拡張機能(uBlacklist)を入れる。
2.表示してほしくないサイトに行く、または調べる
3.拡張機能のボタン(ブラウザ右上のパズルのようなマーク)から選択して、ブロックを押す。
- 投稿日:2021-01-16T00:59:45+09:00
PHPによる型の比較について
概要
以下の記載によるとPHPは比較対象の型は異なっていてもTRUEになってしまうらしい。
https://www.php.net/manual/ja/migration80.incompatible.php
0 == "0" はTRUEになるから、型の一致まで検証するなら 0 === "0" にする必要があるようです。実践(PHP)
PHPで簡単な処理を書いてみました。
本当に0 == "0"はtrueになるみたいです。<?php if (0 == "0") { echo "true"; } else echo "false"; ?>実行結果 % php test.php true次は以下のコードで実行してみます。
変更点は「if (0 == "0")」が「if (0 === "0")」に変わっただけです。<?php // 比較対象の型も検証する if (0 === "0") { echo "true"; } else echo "false"; ?>実行結果 % php test.php false型の検証まで行うとfalseになることを確認できました。
実践(Ruby)
Rubyだと「0 == "0"」は数値と文字列は比較不能なのでfalseになりました。
これは想定通りです。if 0 == "0" then puts "true" else puts "false" end実行結果 % ruby test.rb false実践(Python)
Pythonでも「0 == "0"」は型が違うのでfalseになりました。
これも想定通りです。if 0 == "0": print("true") else: print("false")% python test.py falseまとめ
PHPはRubyやPythonと設計思想が違うようです。
PHPは比較対象の内容が合ってればいい、ということで数値の0も文字列の0もtrueになっちゃうみたいですね。
- 投稿日:2021-01-16T00:44:07+09:00
【Laravel】投稿機能をていねいに。
投稿機能を実装
投稿機能のビュー、コントローラー、モデルの実装をしたので自分用にメモ。
作っているアプリ:日本酒のレビュー投稿アプリを作成中以下3つのファイルを編集しました。
①review.blade.php(ビュー)
②ReviewsController.php(コントローラー)
③Review.php(モデル)フォーム自体はこちら↓。
※画像投稿、保存に関しては後日機能を追加する予定なので今回は省きます。まず最初に!
・HTMLタグのnameとvalueはサーバーサイド側で処理を行う上で重要!これがあればOKと言っても過言ではないくらい大事。
→私はinput要素にvalueをつけず、
nameがテーブルのカラムと一致しない値のため修正しました。
カラム;image、html:review_imageビューの編集
<div class="md-form"> <label class="wf-mplus1p">日本酒名</label> <input type="text" name="title" class="form-control" required value="{{ old('title') }}"> </div> <div class="nihonshu-image pl-5"> <label class="nihonshu-image wf-mplus1p">画像</label> <input type="file" name="image" accept="image/jpeg, image/png" class="mx-auto pt-3"> </div> <div class="taste-ev "> <label class="taste-evl pl-5 wf-mplus1p">味の濃さ</label> <div class="ratebutton text-center"> <div class="md-radio md-radio-inline d-inline"> <input type="radio" name="taste_intensity" value="1"> <label for="1">1</label> </div> <div class="md-radio md-radio-inline d-inline"> <input type="radio" name="taste_intensity" value="2"> <label for="2">2</label> </div> <div class="md-radio md-radio-inline d-inline"> <input type="radio" name="taste_intensity" value="3" checked> <label for="3">3</label> </div> <div class="md-radio md-radio-inline d-inline"> <input type="radio" name="taste_intensity" value="4"> <label for="4">4</label> </div> <div class="md-radio md-radio-inline d-inline"> <input type="radio" name="taste_intensity" value="5"> <label for="5">5</label> </div> </div> </div> <div class="scent-evl"> <label class="taste-evl pl-5 wf-mplus1p">香りの強さ</label> <div class="ratebutton text-center"> <div class="md-radio md-radio-inline d-inline"> <input type="radio" name="scent_strength" value="1" checked> <label for="1">1</label> </div> <div class="md-radio md-radio-inline d-inline"> <input type="radio" name="scent_strength" value="2" checked> <label for="2">2</label> </div> <div class="md-radio md-radio-inline d-inline"> <input type="radio" name="scent_strength" value="3" checked> <label for="3">3</label> </div> <div class="md-radio md-radio-inline d-inline"> <input type="radio" name="scent_strength" value="4"> <label for="4">4</label> </div> <div class="md-radio md-radio-inline d-inline"> <input type="radio" name="scent_strength" value="5"> <label for="5">5</label> </div> </div> </div> <div class="comp-evl"> <label class="taste-evl pl-5 wf-mplus1p">総合評価</label> <div class="ratebutton text-center"> <div class="md-radio md-radio-inline d-inline"> <input type="radio" name="evaluation" value="1"> <label for="1">1</label> </div> <div class="md-radio md-radio-inline d-inline"> <input type="radio" name="evaluation" value="2"> <label for="2">2</label> </div> <div class="md-radio md-radio-inline d-inline"> <input type="radio" name="evaluation" value="3" checked> <label for="3">3</label> </div> <div class="md-radio md-radio-inline d-inline"> <input type="radio" name="evaluation" value="4"> <label for="4">4</label> </div> <div class="md-radio md-radio-inline d-inline"> <input type="radio" name="evaluation" value="5"> <label for="5">5</label> </div> </div> </div> <div class="form-group"> <label></label> <textarea name="content" required class="form-control wf-mplus1p" rows="4" placeholder="メモ">{{ old('body') }}</textarea> </div>コントローラー編集
?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use App\Review; class ReviewsController extends Controller { public function index() { return view('top.index'); } public function create(Request $request) { $inputs = $request->all(); // $inputsが空じゃなかったら実行 if ( !empty($inputs) ) { // ログイン中のユーザーIDを取得 $current_user_id = Auth::user()->id; $value = [ 'user_id' => $current_user_id, 'title' => (string) $inputs['title'] ?? '', 'content' => (string) $inputs['content'] ?? '', 'taste_intensity' => (int) $inputs['taste_intensity'], 'scent_strength' => (int) $inputs['scent_strength'], 'evaluation' => (int) $inputs['evaluation'], 'image' => (string) $inputs['image'], ]; Review::create($value); } return view('top.index'); } }ポイント
・createメソッドの作成
・$request->all
で全てを取得
★!empty
は$inputs
が空ではない場合に実行するよ、という関数。
逆はempty
・$current_user_id
でログインユーザーidを取得
・$value
でレコードのカラム型に応じた連装配列を作る
・Reviewモデルに渡す
・投稿し終わったらtop.indexを表示
★ (int)によって型チェックを行う
★?? ''
を設定してもし絵文字などint型以外の入力があった場合は空白にするモデル編集
<?php namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Carbon\Carbon; class Review extends Model { protected $table = "reviews"; // ★idカラムの更新・挿入はさせない protected $guarded = ['id']; // ★自動でupdated_atとcreated_atをレコード挿入時に入れてくれる public $timestamps = true; /* ----- リレーション ----- */ public function user(): BelongsTo { return $this->belongsTo('App\User'); } }ポイント
★ idカラムの更新や挿入ができないようにする
★ 自動でupdated_id,created_atをレコード挿入時に入れる無事DBにも保存できました〜〜!