20200811のlaravelに関する記事は11件です。

【Eloquent】よく使うメソッド集

 Eloquentは便利ですよね。どんなメソッドがあるかまとめたくなったので、ここに書いちゃおうと思います。

*使用環境
 PHP 7.4.5
 Laravel 7.22.4

基本的な使い方

 まずはモデルクラスを用意します。Itemクラスならば以下のようなコマンドで作れます。
php artisan make:model Item
後はそのモデルクラスを使って、あとで出る表にあるメソッドでどんどんデータ抽出するだけです。こんな感じで->でくっつけていきます。

<?php
use Item;  //この一文を書き忘れるとエラーになってしまう。

$result = Item::where('value', 1000)->limit(10)->get();

集計系(selectで使うような)

メソッド名 引数 説明
max 1.カラム名 max('value')とすればselect max(value)ということになります。

結合系(joinを使うような)

メソッド名 引数 説明
join 1.テーブル名 2.主となるテーブルの結合カラム 3.演算子(=など) 4.従となるテーブルの結合カラム join('type', 'item.item_type', '=', 'type.id')とすれば、inner join type on item.item_type = type.idということになります。

抽出系(whereで使うような)

メソッド名 引数 説明
where 1.カラム名 2.完全一致させるもの where('id', 'solabito331')とすればwhere id='solabito331'という抽出のしかたになります。
where 1.カラム名 2.演算子(=など) 3.比較対象 where('id', '>', 10)とすればwhere id>10 という抽出のしかたになります。
whereNotNull 1.カラム名 whereNotNull('age')とすれば、where age is not nullという抽出のしかたになります。
limit 1.件数 limit(10)とすれば、10件に絞られます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

独学未経験エンジニアがweb系自社開発企業でアルバイトを2ヶ月してみて感じたこと

簡単な自己紹介

  • 大学では機械工学を専攻 
  • プログラマに魅力を感じ2019年新卒でメーカー子会社のIT会社に入社
  • 入社してから10ヶ月で会社を退職
  • そこから4ヶ月間独学で勉強し、現在web系の自社開発企業でアルバイト中

ニートになって独学していた時代

新卒で入社したときに感じたことや退職理由はまた今度別の記事で書いてみたいと思います。

勉強したこと一覧

  • progate(HTML,CSS,Javascript,Ruby,RubyonRails)

  • railsチュートリアル解説動画
    2周はした。1周目は動画を見るだけで、2周目は手を動かしながらでした。
    かなりお世話になり、railsチュートリアルとは友達になった気がする

  • Ruby on Rails5 超入門
    amazonリンク
    読んだのは3割ぐらいだけ

  • Ruby on Rails5 速習実践ガイド
    amazonリンク
    辞書的な感じで使ったりした。暇なときに読んでみてもためになることが多い。

  • Gitが、おもしろいほどわかる基本の使い方33
    amazonリンク
    gitの操作の基礎を学んだ。すぐに読み終わる内容なので、読みやすい

  • キタミ式イラストIT塾 基本情報技術者
    amazonリンク
    コンピュターの基礎を理解するのにはちょーど良かった。時間をかけてちょっとずつ読んだ

  • webを支える技術
    amazonリンク
    何を書いているのか全然分からなかった。kindle版で技術書は読みにくい。

  • 図解即戦力 AWSのしくみと技術がしっかりわかる教科書
    amazonリンク
    AWSのサービスの概要は大体理解したけど、実装まではできず

  • プログラミングスクール受講(ポテパンキャンプ)
    ポテパンのリンク
    gitの操作、N+1問題、Rspecの書き方はここで自主的に学んだ

  • Everyday Rails - RSpecによるRailsテスト入門 購入リンク
    ちょくちょく参考にできた。これも詰まったときに検索する用。

ポートフォリオ作成

当時はAWS,Docker, CI/CD, Kubernetes等についてはほぼほぼ理解できずに、断念していました。
開発環境なんかはrailsチュートリアルで使っていたcloud9を使っていました。
まずはHerokuに自分が一生懸命作成したアプリケーションをデプロイし、公開できるようにしました。
一応独自ドメイン,SSL化程度は行っておき、Herokuは有料プランを使用し、少しでも応答速度が早くなるようにしておきました。
一応当時のポートフォリオのソースコードのリンクを貼っておきます。
https://github.com/ak2-lucky/clothes-app
ファッションが好きだった僕は洋服のレビューサイトを作りました。

この記事を見ている駆け出しエンジニアの日々勉強されている方々はこう思っているかもしれません。
AWSにデプロイすらできないのに、webエンジニアになれるの?
Dockerで開発環境も構築できないの?
自動テストぐらいはやっといたら?

現役のwebエンジニアも同じことを思うでしょう。
ポートフォリオも作りきれないような奴はエンジニアになる資格なんかないよって。
なぜならポートフォリオだけは運にも左右されない自分の努力だけで100パーセント作りきれる成果物だからです。

確かにそうです。
僕の努力不足です。何の異論もありません。
認めます。

そして就職活動をはじめます。

就職活動時代

結果からゆうとほぼ全落ち。
面接までいったのは1.2回でした。
面談してくれた会社で研究開発で人材を募集しているからそこに来ないか?と言ってくれた企業もありました。(結局いかず)
コロナの影響とかいう言い訳はしません。
全て自分の実力不足。
アルバイトも採用している企業に応募し,1社だけ何とかアルバイトとして採用していただきました。

今回で自分の市場価値を知りました。
大学は何も考えずに過ごし、新卒で入社した会社を何の成果も残さず10ヶ月で退職。
世間はそんな奴のことを評価はしてくれません。
もちろん当然の評価です。

アルバイトとしてweb系自社開発企業で働く(今)

技術スタック:AWS,Docker,Laravel+vue.js

働いてみるまでLaravelはおろかPHPも触ったことありませんでした。vue.jsもですが。
詳細は省きますが、実際に働いてみて感じるのは、プログラムを書く以外のことです。
技術のキャッチアップ云々の話ではなくて、組織作り、開発の体制やフローなどの重要さについてです。
自分はプログラミングが苦ではありません。
しかし、プログラミング業務以外の部分でストップすることが多い場合があります。(例えば、なぜこの変更を加えられたのかというコメントがないandコードを見ても分からない)
連携がうまく取れなくて、個々の意思で変更が加えられたりするので、デザインがバラバラ。
issue作成者等に確認もしないで変更を進められていたり。
CI/CDもそのうちの一つですが、issueを作成するのは誰なのか、誰の判断を最終的に仰ぐのか、UIのデザインは好きに決めていいのか、プルリクではどこを見ればいいのか、など他にもいろいろありますが。。。

会社によって開発の進め方などは違うと思うので、一概にあれが悪い、これが悪いというわけではありませんが、開発体制や組織作りはサービス開発にかなり大きく影響するように感じました。

開発言語や技術以前にこういった根本的な開発の導線を確保する重要性を学びました。

最後に

ここまで読んでいただいた方には、いろいろ思うことがあると思います。
2ヶ月しか働いていない、しかもアルバイト如きが何を偉そうなこと言ってるんだ!
とか思ってる方いるかもしれません。

ですが、これは個人の一意見であります。
ただ同じように駆け出しエンジニアの方の参考になればいいなと思って書きました。

webエンジニアへの道は高く険しいように感じます。
しかし、自分にとって登りたい山がどれだけ高かろうが、険しかろうが、関係ありません。
ただ登るだけ
毎日頑張って積み上げて、疲れたら一緒にサボりましょう。

長くなりましたが、初投稿は以上になります。

ここまで読んでいただきありがとうございました。

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

LaravelのUnitテストでRefreshDatabaseを使ったらSAVEPOINT trans2 does not exist が出た話

現象

Laravelを利用した環境で通常のケースではTransactionも機能しており問題なかったが、RefreshDatabaseを用いたPHPUnitでの実行ではエラーが発生していた。

Doctrine\DBAL\Driver\PDOException : SQLSTATE[42000]: Syntax error or access violation: 1305 SAVEPOINT trans2 does not exist
 /src/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:43
 /src/vendor/laravel/framework/src/Illuminate/Database/Concerns/ManagesTransactions.php:260
 /src/vendor/laravel/framework/src/Illuminate/Database/Concerns/ManagesTransactions.php:238
 /src/vendor/laravel/framework/src/Illuminate/Foundation/Testing/RefreshDatabase.php:90
 /src/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php:233
 /src/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php:149

 Caused by
 PDOException: SQLSTATE[42000]: Syntax error or access violation: 1305 SAVEPOINT trans2 does not exist

 /src/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:41
 /src/vendor/laravel/framework/src/Illuminate/Database/Concerns/ManagesTransactions.php:260
 /src/vendor/laravel/framework/src/Illuminate/Database/Concerns/ManagesTransactions.php:238
 /src/vendor/laravel/framework/src/Illuminate/Foundation/Testing/RefreshDatabase.php:90
 /src/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php:233
 /src/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php:149

環境

全てdockerコンテナ内

  • mysql: 5.7
  • Laravel: 6.18.34
  • PHPUnit: 9.3.0

先に結論

調査方法

  • MySQLのクエリログを有効にする
[mysqld]
general_log=ON 
general_log_file=general_query.log
  • テストを実行する
  • /var/lib/mysql/general_query.log を確認
  • QueryとExecuteだけ抜き出し

今回はこの時点でSTART TRANSACTION後にテーブルのtruncateを行っていた事に気づけたが一応MySQLコンソールにクエリ流し込んでエラーになることを確認したりもした。

あとがき

LaravelのRefreshDatabaseでRollback出来ない、Transactionがおかしいみたいな内容はググると結構出てくるが、結局きちんと解決しているものが少ないように思えたので残してみることにした。

はじめはLaravel側でクエリログを出力していたが、SAVEPOINT周りなんかはTransactionRolledBackTransactionCommittedTransactionBeginningで追いきれなかったのでMySQL側でログ出力したほうが確実だったなと後から反省。

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

VSCode Remote-Containers で Laravel7 開発環境 ( CentOS8+PHP7.4+MongoDB4.4 ) を爆速で準備する

はじめに

Docker で開発環境コンテナをサクッと準備。実際の開発は VSCode + Remote-Containers ( 拡張機能 ) を使ってコンテナ内で行うための手順をまとめています。記事内容に間違いなどありましたら、コメント欄にてご指摘お願いいたします。
まだ色々と制約はありますが、とりあえずコンテナを立ち上げるところまでは上手くいったので公開します。

前提条件

  • Docker ( Windows/MacOS の方は Docker Desktop ) が使用できること
  • VSCode が使用できること

ファイル構成

以下の構成でディレクトリとファイルを作成していきます。
とりあえず動かしてみたい方は GitHub から Clone してください。

Project/
  ├─ .devcontainer/
  │    ├─ devcontainer.json
  │    └─ Dockerfile
  └─ mongodb-org.repo

手順.1 : VSCode に Remote-Containers ( 拡張機能 ) をインストール

VSCode に Remote-Containers という拡張機能をインストールしてください。

手順.2 : devcontainer.json 作成

.devcontainer/devcontainer.json
{
    "name": "test",
    "context": "..",
    "dockerFile": "Dockerfile",
    "settings": {
        "terminal.integrated.shell.linux": null,
        "workbench.startupEditor": "newUntitledFile",
        "editor.minimap.enabled": true,
        "vsicons.dontShowNewVersionMessage": true,
        "explorer.confirmDelete": false,
        "files.autoSave": "afterDelay"
    },
    "appPort": [ 8000, 27017 ],
    "remoteUser": "vscode",
    "workspaceFolder": "/var/www/html",
    "extensions": [
        "alefragnani.bookmarks",
        "mikestead.dotenv",
        "mhutchie.git-graph",
        "eamodio.gitlens",
        "onecentlin.laravel-blade",
        "austenc.laravel-blade-spacer",
        "onecentlin.laravel5-snippets",
        "cjhowe7.laravel-blade",
        "felixfbecker.php-pack",
        "vscode-icons-team.vscode-icons"
    ]
}

手順.3 : Dockerfile 作成

.devcontainer/Dockerfile
FROM centos:8

LABEL maintainer="slangsoft"
LABEL version="1.0"
LABEL description="Laravel sample project for trying out the VS Code Remote - Containers extension."

ARG USERNAME=vscode
ARG USER_UID=1000
ARG USER_GID=$USER_UID
ARG PATH_LARAVEL=/var/www/html

# Basic settings
RUN set -x \
    && dnf -y upgrade \
    && dnf -y install sudo dnf-utils wget git \
    && groupadd --gid $USER_GID $USERNAME \
    && useradd --shell /bin/bash --uid $USER_UID --gid $USER_GID --create-home $USERNAME \
    && echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \
    && chmod 0440 /etc/sudoers.d/$USERNAME

# Install nginx
RUN  dnf -y install nginx

# Install php
RUN set -x \
    && dnf module reset php \
    && dnf -y install epel-release glibc-locale-source glibc-langpack-en \
    && dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm \
    && dnf -y module install php:remi-7.4

# Install Laravel
EXPOSE 8000
RUN set -x \
    && dnf -y install php-mcrypt php-pdo php-bcmath php-tokenizer php-xml php-mysqlnd php-gd php-intl php-zip php-opcache php-pecl-xdebug \
    && wget https://getcomposer.org/installer -O composer-installer.php \
    && php composer-installer.php --filename=composer --install-dir=/usr/local/bin \
    && composer self-update \
    && composer create-project laravel/laravel $PATH_LARAVEL --prefer-dist \
    && groupadd laravel \
    && gpasswd -a $USERNAME laravel \
    && gpasswd -a nginx laravel \
    && find $PATH_LARAVEL -type d -exec chmod 775 \{\} \; \
    && find $PATH_LARAVEL -type f -exec chmod 664 \{\} \; \
    && chown -R :$USERNAME $PATH_LARAVEL \
    && find $PATH_LARAVEL -type d -exec chmod g+s \{\} \; \
    && setfacl -R -d -m g::rwx $PATH_LARAVEL

# Install MongoDB
EXPOSE 27017
COPY ./mongodb-org.repo /etc/yum.repos.d/
RUN dnf -y install mongodb-org

# Set locale
RUN localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG="ja_JP.UTF-8"
ENV LANGUAGE="ja_JP:ja"
ENV LC_ALL="ja_JP.UTF-8"

# Working directory setting
WORKDIR $PATH_LARAVEL

手順.4 : mongodb-org.repo 作成

mongodb-org.repo
[mongodb-org-4.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc

手順.5 : コンテナ起動

コマンドパレットを開いて [remote-containers: Open Folder in Container...] を実行するとコンテナのビルドが始まります。無事にビルドが完了すると、コンテナ内で VSCode が起動します。

参考リンク

改訂履歴

  • 2020/08/11
    初版公開 ( ほとんど説明も無い叩き台記事 )
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VSCode Remote-Containers で Laravel7 開発環境 ( Centos8+PHP7.4+MongoDB4.4 ) を爆速で準備する

はじめに

Docker で開発環境コンテナをサクッと準備。実際の開発は VSCode + Remote-Containers ( 拡張機能 ) を使ってコンテナ内で行うための手順をまとめています。記事内容に間違いなどありましたら、コメント欄にてご指摘お願いいたします。
まだ色々と制約はありますが、とりあえずコンテナを立ち上げるところまでは上手くいったので公開します。

前提条件

  • Docker ( Windows/MacOS の方は Docker Desktop ) が使用できること
  • VSCode が使用できること

ファイル構成

以下の構成でディレクトリとファイルを作成していきます。
とりあえず動かしてみたい方は GitHub から Clone してください。

Project/
  ├─ .devcontainer/
  │    ├─ devcontainer.json
  │    └─ Dockerfile
  └─ mongodb-org.repo

手順.1 : VSCode に Remote-Containers ( 拡張機能 ) をインストール

VSCode に Remote-Containers という拡張機能をインストールしてください。

手順.2 : devcontainer.json 作成

.devcontainer/devcontainer.json
{
    "name": "test",
    "context": "..",
    "dockerFile": "Dockerfile",
    "settings": {
        "terminal.integrated.shell.linux": null,
        "workbench.startupEditor": "newUntitledFile",
        "editor.minimap.enabled": true,
        "vsicons.dontShowNewVersionMessage": true,
        "explorer.confirmDelete": false,
        "files.autoSave": "afterDelay"
    },
    "appPort": [ 8000, 27017 ],
    "remoteUser": "vscode",
    "workspaceFolder": "/var/www/html",
    "extensions": [
        "alefragnani.bookmarks",
        "mikestead.dotenv",
        "mhutchie.git-graph",
        "eamodio.gitlens",
        "onecentlin.laravel-blade",
        "austenc.laravel-blade-spacer",
        "onecentlin.laravel5-snippets",
        "cjhowe7.laravel-blade",
        "felixfbecker.php-pack",
        "vscode-icons-team.vscode-icons"
    ]
}

手順.3 : Dockerfile 作成

.devcontainer/Dockerfile
FROM centos:8

LABEL maintainer="slangsoft"
LABEL version="1.0"
LABEL description="Laravel sample project for trying out the VS Code Remote - Containers extension."

ARG USERNAME=vscode
ARG USER_UID=1000
ARG USER_GID=$USER_UID
ARG PATH_LARAVEL=/var/www/html

# Basic settings
RUN set -x \
    && dnf -y upgrade \
    && dnf -y install sudo dnf-utils wget git \
    && groupadd --gid $USER_GID $USERNAME \
    && useradd --shell /bin/bash --uid $USER_UID --gid $USER_GID --create-home $USERNAME \
    && echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \
    && chmod 0440 /etc/sudoers.d/$USERNAME

# Install nginx
RUN  dnf -y install nginx

# Install php
RUN set -x \
    && dnf module reset php \
    && dnf -y install epel-release glibc-locale-source glibc-langpack-en \
    && dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm \
    && dnf -y module install php:remi-7.4

# Install Laravel
EXPOSE 8000
RUN set -x \
    && dnf -y install php-mcrypt php-pdo php-bcmath php-tokenizer php-xml php-mysqlnd php-gd php-intl php-zip php-opcache php-pecl-xdebug \
    && wget https://getcomposer.org/installer -O composer-installer.php \
    && php composer-installer.php --filename=composer --install-dir=/usr/local/bin \
    && composer self-update \
    && composer create-project laravel/laravel $PATH_LARAVEL --prefer-dist \
    && groupadd laravel \
    && gpasswd -a $USERNAME laravel \
    && gpasswd -a nginx laravel \
    && find $PATH_LARAVEL -type d -exec chmod 775 \{\} \; \
    && find $PATH_LARAVEL -type f -exec chmod 664 \{\} \; \
    && chown -R :$USERNAME $PATH_LARAVEL \
    && find $PATH_LARAVEL -type d -exec chmod g+s \{\} \; \
    && setfacl -R -d -m g::rwx $PATH_LARAVEL

# Install MongoDB
EXPOSE 27017
COPY ./mongodb-org.repo /etc/yum.repos.d/
RUN dnf -y install mongodb-org

# Set locale
RUN localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG="ja_JP.UTF-8"
ENV LANGUAGE="ja_JP:ja"
ENV LC_ALL="ja_JP.UTF-8"

# Working directory setting
WORKDIR $PATH_LARAVEL

手順.4 : mongodb-org.repo 作成

mongodb-org.repo
[mongodb-org-4.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc

手順.5 : コンテナ起動

コマンドパレットを開いて [remote-containers: Open Folder in Container...] を実行するとコンテナのビルドが始まります。無事にビルドが完了すると、コンテナ内で VSCode が起動します。

参考リンク

改訂履歴

  • 2020/08/11
    初版公開 ( ほとんど説明も無い叩き台記事 )
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP/Laravel】Class 'Collective\Html\HtmlServiceProvider' not found への対処法

はじめに

Laravelでアプリ開発をしております。
環境構築が完了し、Formを実装した際にエラーが発生。
備忘のために記録しております。
同じような方の助けになれば幸いです。

開発環境

・MacOS:10.15.6 (Catalina)
・PHP7.3.20
・Laravel6.18.35

対処法

①プロジェクト直下の「composer.json」に「"laravelcollective/html": "^6.0"」を追記

※これでもエラーが起きる場合はLaravelのバージョンとlaravelcollective/htmlのバージョンを合わせる(ex. Laravel5.8なら、laravelcollective/htmlの5.8)。

composer.json
 "require": {
        "php": "^7.2",
        "fideloper/proxy": "^4.0",
        "laravel/framework": "^6.2",
        "laravel/tinker": "^2.0" ,
        "laravelcollective/html": "^6.0"
    },

②ターミナルで「composer update」を実行

$ composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 2 installs, 3 updates, 0 removals
  - Updating egulias/email-validator (2.1.18 => 2.1.19): Downloading (100%)       - Installing league/mime-type-detection (1.4.0): Downloading (100%)         
  - Updating league/flysystem (1.0.70 => 1.1.0): Downloading (100%)         
  - Updating nikic/php-parser (v4.7.0 => v4.8.0): Downloading (100%)         
  - Installing laravelcollective/html (v6.1.2): Downloading (100%)         
Package jakub-onderka/php-console-color is abandoned, you should avoid using it. Use php-parallel-lint/php-console-color instead.
Package jakub-onderka/php-console-highlighter is abandoned, you should avoid using it. Use php-parallel-lint/php-console-highlighter instead.
Writing lock file
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: laravelcollective/html
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
40 packages you are using are looking for funding.
Use the `composer fund` command to find out more!

③「config/app.php」への下記の追記

※Laravel5.5以上はPackage Auto Discoveryが入っているため不要。

config/app.php
   'providers' => [
        Collective\Html\HtmlServiceProvider::class,
    ],

    'aliases' => [
        'Form' => Collective\Html\FormFacade::class,
        'Html' => Collective\Html\HtmlFacade::class,
    ],

以上となります。

以下、参考にさせていただいたサイトも掲載させていただきます。
ご参考にしていただければ。

参考文献

Laravelで「Formクラスが無い」とエラーが出た時の対処法
【Laravel】Formファサード(laravelcollective/html)をインストールする

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

Laravelログイン機能にTwitter認証を追加するのに参考にした記事まとめ

前提、私の環境ではLaravelバージョン6.xです。
バージョン5.x以前とでは処理が違う部分があるそうさので注意。

Laravel Socialite 4.x でソーシャルログイン(OAuth認証)を行う
https://www.ritolab.com/entry/207

データベース周りはこちらの記事を参考にしました。
https://qiita.com/tetsu-upstr/items/d1cccfac362872ed140c

すでにusersテーブルは作ってしまっていたので、changeについてはこちを参考
https://qiita.com/shosho/items/a5a5839735dfef9214b1

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

Docker × Laravel テスト用のデータベースコンテナを構築する

Laravelでデータベースのテストを行う時、RefreshDatabasefactoryなど便利なメソッドやトレイトが用意されています。
これらを使ってテストを行いますが、Dockerでデータベースコンテナ一つでやると開発で使ってるデータがクリアされてしまってあまりよろしくないです。

今回はテストする時はテスト用のデータベースを使うように設定します。

前提

当記事は上記の記事の補足になる記事です。

Laravel環境構築

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

手順

infrastructure/docker-compose.yml を編集する

$ cd infrastructure
$ docker-compose down

docker-compose.ymlDockerfile を変更する場合は予めコンテナを破棄しておくと良いです。

infrastructure/docker-compose.yml
  db-testing:
    build: ./docker/mysql
    tmpfs:
      - /var/lib/mysql

db-testing サービスの設定を services 配下に追記します。

tmpfsはLinux環境でのみ動作すると書いてありましたが、Docker for Macでも動作するっぽいので使ってみました。
動かない場合はnamed volumeを使うといいかもです。

$ docker-compose up -d

コンテナを作成して起動します。

$ docker-compose ps
           Name                          Command              State                 Ports              
-------------------------------------------------------------------------------------------------------
docker-laravel_app_1          docker-php-entrypoint php-fpm   Up      9000/tcp                         
docker-laravel_db-testing_1   docker-entrypoint.sh mysqld     Up      3306/tcp, 33060/tcp              
docker-laravel_db_1           docker-entrypoint.sh mysqld     Up      0.0.0.0:3306->3306/tcp, 33060/tcp
docker-laravel_web_1          nginx -g daemon off;            Up      0.0.0.0:80->80/tcp

db-testing のコンテナが起動していればokです。

backend/phpunit.xml

backend/phpunit.xml
    <php>
        <server name="APP_ENV" value="testing"/>
        <server name="BCRYPT_ROUNDS" value="4"/>
        <server name="CACHE_DRIVER" value="array"/>
        <server name="DB_CONNECTION" value="sqlite"/>
        <server name="DB_DATABASE" value=":memory:"/>
        <server name="MAIL_MAILER" value="array"/>
        <server name="QUEUE_CONNECTION" value="sync"/>
        <server name="SESSION_DRIVER" value="array"/>
        <server name="TELESCOPE_ENABLED" value="false"/>
    </php>
backend/phpunit.xml
    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="BCRYPT_ROUNDS" value="4"/>
        <env name="CACHE_DRIVER" value="array"/>
        <env name="DB_HOST" value="db-testing" force="true"/>
        <env name="MAIL_MAILER" value="array"/>
        <env name="QUEUE_CONNECTION" value="sync"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="TELESCOPE_ENABLED" value="false"/>
    </php>

serverではなくenvに変更してます。
DockerfileDB_HOST のサーバー環境変数を設定しているので、 force="true" オプションで上書きしてあげます。

サンプルのテストを作成

backend/tests/Feature/SampleTest.php
<?php declare(strict_types=1);

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;
use App\User;

class SampleTest extends TestCase
{
    use RefreshDatabase;

    /**
     * A basic feature test example.
     *
     * @return void
     */
    public function testExample()
    {
        factory(User::class)->create(['name' => 'sample']);
        $this->assertEquals(1, User::where('name', 'sample')->count());
    }
}

テスト実行

$ php artisan test
   PASS  Tests\Unit\ExampleTest
  ✓ basic test

   PASS  Tests\Feature\ExampleTest
  ✓ basic test

   PASS  Tests\Feature\SampleTest
  ✓ example

  Tests:  3 passed
  Time:   3.74s

テストが通ったことを確認できればokです。
db データベースのデータも消えていないことを確認してください。

補足: backend/.env.testing

phpunit.xml ではなく .env.testing で環境変数を上書きする方法もあります。
その場合、 Dockerfile で設定したサーバー環境変数の方が優先されてしまうのでそちらは削除してください。

$ cp .env.example .env.testing
$ php artisan key:generate --env=testing
.env.testing
DB_CONNECTION=mysql
DB_HOST=db-testing
DB_PORT=3306
DB_DATABASE=laravel_local
DB_USERNAME=phper
DB_PASSWORD=secret
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel6.x以上にBootstrapを導入

Laravel6.x以上にBootsrapを導入

ターミナル上で以下のコマンドを打つ必要あり

ターミナル
$ composer require laravel/ui
$ php artisan ui bootstrap
$ npm install && npm run dev

インストールされたか確認

CSS

publicの下にcssのフォルダが作成されていたら成功!

public/css/app.css
/*!
 * Bootstrap v4.5.2 (https://getbootstrap.com/)
 * Copyright 2011-2020 The Bootstrap Authors
 * Copyright 2011-2020 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
 */

入ってますね。

Javascript

publicの下にjsのフォルダが作成されていたら成功!
app.jsというファイルが入っているはずです。

head情報に読み込むためのコードを埋め込む

<link href="{{ asset('/css/app.css') }}" rel="stylesheet">

asset('ファイルパス')はpublicディレクトリのパスを返す関数。

ということは、
publicの直下なら
asset('/app.css')

publicの下にcssというディレクトリを作ってその中にcssファイルを入れるなら
asset('/css/app.css')

<script src="{{ asset('/js/app.js') }}"></script>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】メール送信機能

はじめに

問い合わせフォームで問い合わせがあった場合に、内容をメールで通知するシステムを組んだ際の備忘録。

LaravelのMailableクラスを利用し送信します。

ファイル構成

app
 |- Http
 |  |- SendController.php
 |
 |- Mail
   |- SendMail.php

resources
 |- views
   |- contact
     |- mail.blade.php

.env

コード

Controller

sendメソッドの引数に、Mailableクラスを継承したクラスを渡す。

SendController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Mail;
use Illuminate\Http\Request;

class SendController extends Controller
{

    public function submit(Request $req){

      //メールを送信
      Mail::to("送信先アドレス")
      ->send(new SendMail($req['message']));

      return view('sample');
    }
}

Mailableクラス

コンストラクタで表示するメッセージリストを受け取る。
buildメソッドで、あらかじめ準備したbladeを利用して本文を作成する。
HTMLメールの場合viewメソッド、通常テキストの場合textメソッドを使う。

SendMail.php
<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class SendMail extends Mailable
{
    use Queueable, SerializesModels;

    protected $message;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($message)
    {
        //コンストラクタで表示するメッセージを受け取る
        $this->message = $message;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->text('contact.mail')
                    ->subject('件名')
                    ->with(['message' => $this->message]);
    }
}

View

変数を展開して本文を作成する。

mail.blade.php
問い合わせが来ました。

---------------------
名前:{{$message->name}}
アドレス:{{$message->address}}
内容:{{$message->body}}
---------------------

.env

.envにメールサーバの情報を記載する。

.env
MAIL_MAILER=smtp
MAIL_HOST=***
MAIL_PORT=***
MAIL_USERNAME=***
MAIL_PASSWORD=***
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=***
MAIL_FROM_NAME="${APP_NAME}"

参考
Laravelでメール送信する

最後に

利用するサーバの情報が間違っていてはまりました。
処理を何度も見直したことで理解が深まったのでOK!!!

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

Laravel 6.x CasherでStripe決済するときに参考になる資料

やりたいこと

Laravel 6.xでCasherを用いてstripeから決済をしたい

問題

6.x未満の古い記事がおおいのと、ドキュメントから動作を想像しづらい

1.翻訳ドキュメント

おなじみのreadouble
インストールや設定等、基本的にはここのを行えばいいが
イメージがしづらい

https://readouble.com/laravel/6.x/ja/billing.html

2.Youtube

https://www.youtube.com/watch?v=OtLmqDpH-C8

こちらの動画が公式ドキュメントに沿って行っているのでイメージがしやすい
翻訳ドキュメントとと合わせると良い感じ

詰まったところ

郵便番号を非表示に

https://blog.ichikaway.com/entry/2019/05/29/180537
https://stripe.com/docs/js/elements_object/create_element?type=card

サブスクリプションでIdが必要だが、[No such plan]となった

https://takkublog.net/no-such-plan/

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