20210116のPHPに関する記事は11件です。

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.php
require_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 installcomposer.jsonのあるディレクトリで実行する
3. venderというフォルダが作成されるので、このフォルダをphpファイルと同じディレクトリに置く
4. phpファイルで次のようにrequireする

twitter_api._sample.php
require_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 でこの件を報告したので、解決しなかったらこちらにコメントください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker × Laravel ローカル環境でHTTPS(SSL)通信する

ローカル環境でもHTTPS通信したいという要望があり、ちょうど最近仕事でやる機会があったのでQiitaにもまとめたいと思います。

Laravel環境構築

$ git clone git@github.com:ucan-lab/docker-laravel.git
$ cd docker-laravel
$ make create-project

http://localhost

ScreenShot 2021-01-16 15.24.23.png

認証局、鍵の準備

mkcert, nssのインストール

$ brew install mkcert nss

ローカル認証局(CA: Certification Authority)の作成

$ mkcert -install

ChromeのSSL警告をlocalhostの時だけ表示しないようにする。
chrome://flags/#allow-insecure-localhost アドレスバーに入力する。

ScreenShot 2021-01-16 14.56.07.png

DISABLED => ENABLED に変更してブラウザを再起動する。

秘密鍵、公開鍵の作成

コマンドの実行は docker-laravel ディレクトリルートで行ってください。

$ mkcert -cert-file ./infra/docker/nginx/localhost.pem -key-file ./infra/docker/nginx/localhost-key.pem localhost

Dockerのコード書き換え

docker-compose.yml

公開ポートを80から443へ変更する。
HTTPSは、ウェルノウンポート番号として443が使われるのが一般的です。

docker-compose.yml
services:
  web:
    ports:
      - ${WEB_PORT:-443}:443

infra/docker/nginx/default.conf

下記のコードを追記する。

infra/docker/nginx/default.conf
server {
    # 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/Dockerfile
COPY ./*.pem /etc/nginx/conf.d/
  • 秘密鍵、公開鍵をコピーしてます。

Dockerイメージの作成、コンテナ再生成

コマンドの実行は docker-laravel ディレクトリルートで行ってください。

$ docker-compose build web
$ make restart

https://localhost

ScreenShot 2021-01-16 14.54.27.png

ScreenShot 2021-01-16 14.54.39.png

このようにSSL証明書が有効化されていればokです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PhpStormのコードフォーマッタをWordPressのコーディングスタイルにする

WordPressのコーディングスタイルが普段使っているフレームワークのと異なり不便だったのでPhpStormに助けてもらったので設定方法をメモ。(Mac前提)

参考:JetBrainsオフィシャルサイト

Preference を開いて
① Editor > Code Style > PHP を開く
② プロジェクト毎かPhpStorm自体の設定とするか選択
③ WordPressのスタイルを選択

Screen_Shot_2021-01-16_at_12_21_20.png

Screen Shot 2021-01-16 at 12.26.16.png

で、OKで閉じる。

設定後はソースコード開いて(キー設定変えてなければ) option + command + l (エル)のショートカットキーでフォーマッタを適用できる。

以上!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【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かなと思っています。
新しい記法見つけたら、追記していきます。

参考

コールバック/Callcable(公式)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【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かなと思っています。
新しい記法見つけたら、追記していきます。

参考

コールバック/Callcable(公式)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

wordpressで画像加工

はじめに

wordpressでは画像をアップロードするとサムネイル画像が自動生成される。
サムネイル画像が生成されるということは、画像をリサイズする関数やクラスが用意されているということ。
あまり紹介するページを見かけないが、結構便利なのでその関数やクラスを紹介する。

WP_Image_Editor クラス

wrodpressで画像を加工する場合は WP_Image_Editor クラスを使う。

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 )

画像をリサイズする。
$croptrue にするとトリミングされる。デフォルトは 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 リファレンス

書式

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 リファレンス

書式

add_image_size( $name, $width, $height, $crop );

$croptrue にするとトリミングされる。デフォルトは 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 などのプラグインで再生成する。

Regenerate Thumbnails

トリミングの配列の仕様

配列の指定方法は array( x_crop_position, y_crop_position ) で、デフォルトは array( 'center', 'center' )
x_crop_positionleft, center, right が利用でき、
y_crop_positiontop, center, bottom が利用できる。

トリミングの配列の仕様.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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

これで無事完了

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaraveのhasOneとbelongsToの違い

参照先 or 参照される側 or 外部キーがある側は、belongsTo
参照元 or 参照する側 or 外部キーがない側は、hasOne

UsersMedel.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');
    }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【3行で説明】プログラミングスクールの技術記事を検索結果に表示させない方法

※単純に初歩的すぎる記事を見る必要がなくなった時に使う方法です。他意はありません。
1.Chromeでこの拡張機能(uBlacklist)を入れる。
2.表示してほしくないサイトに行く、または調べる
3.拡張機能のボタン(ブラウザ右上のパズルのようなマーク)から選択して、ブロックを押す。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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になっちゃうみたいですね。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】投稿機能をていねいに。

投稿機能を実装

投稿機能のビュー、コントローラー、モデルの実装をしたので自分用にメモ。
作っているアプリ:日本酒のレビュー投稿アプリを作成中

以下3つのファイルを編集しました。
①review.blade.php(ビュー)
②ReviewsController.php(コントローラー)
③Review.php(モデル)

フォーム自体はこちら↓。

image.png
※画像投稿、保存に関しては後日機能を追加する予定なので今回は省きます。

まず最初に!

・HTMLタグのnamevalueはサーバーサイド側で処理を行う上で重要!これがあれば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にも保存できました〜〜!

スクリーンショット 2021-01-16 0.42.05.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む