- 投稿日:2021-03-14T22:42:42+09:00
Laravel:プロジェクト内で定数を使う方法
概要
Laravelで定数を管理したい時にどうすればいいかわからなかったので備忘録にする
結論
①app/config/配下に定数用のファイルを作る
②定数を呼び出す場合config('ファイル名.定数名')
とすればOK例
例えばapp/config/配下に
const.php
を作るconst.php<?php return [ //'定数名' => '出力したい値', 'FILE_URL' => 'public/file', ];コントローラーから定数を呼び出す場合
config('ファイル名.定数名')
とすればOKTestController.php$url = config('const.FILE_URL');.envの定数を呼び出す場合
envの定数を使いたい場合下記のように行う
MAIL_FROM_ADDRESS=test@gmail.comapp/config/app.phpに以下のような形式で追記する
'定数名' => env('envに記載している定数名', 'デフォルト値),app.php'email' => env('MAIL_FROM_ADDRESS', 'test@gmail.com'),呼び出す場合は
config('app.定数名')
とすればOKTestController.php$sendEmail = config('app.email');以上となります。
- 投稿日:2021-03-14T17:27:43+09:00
生のPHPとLaravelの、二通りの類似ポートフォリオを作った話
はじめに
こんにちは、おーもとと申します。エンジニアに転職をするため学習している初学者です。
私は車が好きで、「近年の若者の車離れ」という問題にフォーカスしたアプリを制作しようと思いました。制作背景
若者が車を持たない理由には様々な理由があると思いますが、
「欲しいと思えるほど魅力を感じる車に出会っていないからなのでは?」
と思い、
・かわいいやかっこいいというスタイル
・大きさ
・国産か外車か
・アウトドアや街乗りという用途
これらの項目に当てはまる車を、結果として表示するアプリを制作することにしました。
(これらの特徴は全て私が定めているため、投票などにより特徴を決める機能をつけたいです)11月 PHPでアプリ開発
10月からPHPの学習を始めていたので、そのアプリはPHPで制作しました。
カーセンサーAPIを使用して、車の情報を取得します。
解説動画:https://www.youtube.com/watch?v=ZXbgUtjxKM8
機能
ユーザー登録関連
⚪︎ ログイン
⚪︎ ログアウト
⚪︎ 新規登録
⚪︎ ユーザー件数を表示車の検索機能
⚪︎ 車の見た目→「かわいい」「かっこいい」「シンプル」「おしゃれ」「レトロ」
⚪︎ 車のサイズ→「ふつう」「すごくおおきい」「おおきい」「ちいさい」
⚪︎ 車の製造国→「国産車」「外車」
⚪︎ 車の用途 →「街乗り」「アウトドア」「スポーツ」カーセンサーAPI連携
⚪︎ DBにある車情報と合致した車情報を取得
⚪︎ cronでキャッシュファイル自動生成苦労した点
検索結果の画像表示高速化
検索の度にAPIからデータを取得していたので、電波の悪い場所では結果の表示に1分以上かかっていました。
毎日APIからデータを自動取得しキャッシュ化することで、ユーザーにストレスのない速度で結果を表示させることができました。EC2へデプロイ
公式ドキュメントを参考にしデプロイしました。
その際、インフラの知識が不足していたため、デプロイに一週間以上かかりました。APIのサービス終了!!
転職活動を始めようとした際、一週間後にカーセンサーAPIサービスが終了すると知りました。
急いで提供元へ問い合わせたところ、
「完全に提供が終了すること」「24時間以上のキャッシュデータの保有も禁止」、ということを告げられました。
その後、他の車データAPIの提供元を調べましたが他にありませんでした。
画像だけでもどうにかならないかと思い、ト◯タや◯産などの画像利用規約を確認しましたが、
営利目的ではない&提供元のURLなどの情報を記載する
としても、利用は禁止でした。
そのためLaravelの勉強も兼ねて、画像問題を解決できるアプリの制作に取り掛かりました。1月 Laravelでアプリ開発
12月末からLaravelの学習を始め、1月からアプリの制作に取り掛かりました。
前回のPHPで制作したポートフォリオとの違い
画像の取得にAPIを用いていましたが、ユーザーから愛車の画像を提供してもらう方針に変更し、機能の追加などを行いました。
完成
アプリのURL:https://pf-kurushira.com
(スマホサイズにも対応しています)
使用技術
使用言語
⚪︎ HTML
⚪︎ CSS
⚪︎ SCSS
⚪︎ PHP 7.4.14
⚪︎ Laravel 6.20.11インフラ
⚪︎ Github Actions 自動デプロイ
⚪︎ Docker 20.10.2 / docker-compose 1.27.4
⚪︎ nginx 1.18
⚪︎ mysql 5.7.31 / PHPMyAdmin
⚪︎ AWS ( EC2, ALB, ACM, S3, RDS, Route53, VPC, EIP, IAM)インフラ構成図
機能一覧
機能 概要 ユーザー管理機能 新規登録・ログイン・ログアウトができます 簡単ログイン機能 ログイン画面のゲストログインをクリックすることで、ゲストユーザーとしてログインできます おすすめ車種検索機能 条件を選択すると、それにあった車種一覧を表示します 検索履歴機能 直近の検索履歴・結果を表示します 画像提供機能 ユーザーの所有している車の画像を提供できます 提供した画像の削除機能 提供した画像を削除できます 提供画像一覧表示機能 自身が提供した画像一覧を表示します。 ユーザー情報編集機能 ご登録いただいたユーザー名・メールアドレスを変更できます Twitterシェア機能 車の検索結果をツイートすることができます レスポンシブ機能 スマホサイズ(320~540px)にも対応しています DB設計
各テーブルについて
テーブル名 説明 users 登録ユーザー情報 cars 登録車情報 histories 直近の検索結果の情報 car_images 提供画像の情報 苦労した点
ユーザー情報編集ページのバリデーション
LaravelのAuth機能のバリデーションを使いまわそうとしましたが、ブラックボックスになっていて苦労しました。
→新しくバリデーションを作成。S3からオブジェクト削除
画像の削除機能でDBからだけでなく、S3からもオブジェクトを削除する必要があり苦労しました。
→解決方法を記事にしました
laravel6でS3に画像アップロード&削除今後の課題
機能
機能 概要 英訳機能 Google Cloud Translation APIを利用して翻訳 通報機能 ユーザーの投票で不適切な画像を削除 技術
⚪︎ テスト
⚪︎ Dockerを用いた本番環境の構築
⚪︎ ECSへデプロイ参考にした学習教材など
PHP/Laravel
・【Udemy】PHP+MySQL(MariaDB) Webサーバーサイドプログラミング入門
・【書籍】詳細!PHP 7+MySQL 入門ノート
・【書籍】PHPフレームワークLaravel入門 第2版
・【書籍】PHPフレームワーク Laravel実践開発
・Laravel6.0(PHP7.3)+MySQL+Laradockで簡易的なECサイトを作るAWS
・【Udemy】AWS:ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得
Docker
・【超入門】20分でLaravel開発環境を爆速構築するDockerハンズオン
さいごに
生のPHPでひとつPFを制作したのは、基礎力が身についたので良かったと思います。
今回ポートフォリオ完成を優先したため、ECSではなくEC2へデプロイしました。
まだ課題も多いですが、ブラッシュアップしていきたく思っています。
長くなりましたが、ここまで読んでくださりありがとうございました!!
- 投稿日:2021-03-14T11:56:06+09:00
Laravel
- 投稿日:2021-03-14T11:51:45+09:00
Crostini+Laradockで、ChromebookのLaravel開発環境
ChromebookでPHP開発環境を作ります
Chrome OSのLinux環境(Crostini)を使います
PHPフレームワークLaravelの開発をお手軽にしてくれるLaradockをインストールして動かします。
「Laradockは、Docker用の完全なPHP開発環境(公式サイトより)」Crostiniの基本的な環境構築
- 日本語化
- npm などのインストール
- Docker、Docker Compose のインストール
などはたくさん有益でわかりやすいな情報があるので、それぞれ参考にしてください。(参考になったサイトを下の方にまとめました)
Laradockのインストール
Laradock公式サイト
公式サイトで丁寧に解説してくれているので、この通りでインストールできます。適当な場所にて
ターミナルgit clone https://github.com/Laradock/laradock.git環境ファイルを作成(いったんそのまま)
ターミナルcp env-example .env
起動
ターミナルdocker-compose up -d nginx mysql phpmyadmin redis workspace
起動時にエラーになった場合
自分は初回の起動時に「worksspaceのSSHポートが使われている」という感じのエラーがでましたので、ポートの指定を変更して回避しました。laradock/.env# WORKSPACE_SSH_PORT=22 WORKSPACE_SSH_PORT=50022初回は結構長い時間かかりますが、これで起動までできるはず。
起動ご確認
デフォルトだとlaradockディレクトリと同じ階層の
public
が公開ディレクトリになっているので
以下のようなpublic/index.html
を適当な内容で保存する∟ laradock/ ∟ public/ ∟ index.htmlChrome OS 側の Chromeブラウザから
penguin.linux.test
のURLにアクセスして、index.htmlの内容が表示されれば成功。
penguin.linux.test
は Crostiniに割り振られたアドレスになります。Laravelのインストール
立ち上げたLaradockの中でLaravelをインストールします。
基本は公式の通りhttps://laravel.com/docs/8.x/installation
https://readouble.com/laravel/8.x/ja/installation.htmlLaradockのコンテナ内でインストールするときなどに
docker-compose exec
コマンドでコンテナに接続する必要があるのですがターミナルdocker-compose exec --user=laradock workspace bashというようににユーザーを指定する必要があります。
--user
オプションを指定しないで接続すると、コンテナ内部から作成したファイルの所有者がroot
になってしまい編集できなくなってしまいます。
普段はmacOSなどでやっていると、ここらへん無頓着になっていて、ハマってしまいました。。ユーザー名は、laradock を指定してあげれば、自分のユーザーが割り当てられて、ファイルなども自ユーザー所有として作成されます。とても便利です。
あとは、自分の使いたいバージョンをドキュメントにそってインストールするだけです。
ターミナル(コンテナ内)composer global require laravel/installer laravel new example-appLaradockで複数プロジェクトを管理
https://laradock.io/getting-started/
Setup for Multiple Projects:
の項目にあるように、Laradockで複数のプロジェクトを立ち上げて開発することができます。ただし、Chromebookでは、
/etc/hosts
の編集ができないため少し工夫が必要です。詳しい手順は公式で見ていただくとして、大事な部分のみ。
Laradockでは、複数プロジェクトを管理するときは以下のような構成になります。ターミナル∟ laradock ∟ project1 ∟ public ∟ laravelの各種ファイル ∟ project2 ∟ public ∟ laravelの各種ファイルこのようにファイルを配置したら
あとはnginx
で振り分けます。ターミナルcd laradock/nginx/sites cp laravel.app.example project1.conf cp laravel.app.example project2.conf設定ファイルをプロジェクトごとに設定
project1.conf#server_name laravel.test; server_name project1.test; #root /var/www/laravel/public; root /var/www/project1/public;****.conf#server_name laravel.test; server_name ****.test; #root /var/www/laravel/public; root /var/www/****/public;こんな感じで設定したら、本来は
/etc/hosts
を書き換えるだけ。。なんだけど、残念ながら Chrome OS はhostsの書き換えができない。
(デベロッパーモードにしたりすればできるらしいんだけど、そこまではしたくない)というわけで、どうしようか色々調べたところ Crostiniに簡易DNSサーバーを立ててしまう。という解決方法を見つけた。
ちょっと大変そうだけど興味もあったのでチャレンジしてみました。Crostini で簡易DNSサーバを立てる
基本的にこちらを参考
とても詳しく書いてあり、とても勉強になりました。
https://qiita.com/arakaki_tokyo/items/c17e07220b8f7c465564Dnsmasq のインストール
Dnsmasqはお手軽DNSサーバとして情報も多くちょうどよい感じのようです。まずはインストール
ターミナルsudo apt-get install dnsmasq次に設定をします。
上記の参考サイトのをまるっと参考にさせていただきました。/etc/dnsmasq.conflisten-address=[CrostiniのIPアドレス] interface=eth0 log-queries log-facility=/var/log/dnsmasq.log port=53 no-resolv address=/test/[CrostiniのIPアドレス]これで、
**.test
というドメインを全部Crostiniに向けます。ちなみにCrostini のIPアドレスの確認方法
ターミナルip addr showeth0のあたりです。
参考)
https://stackoverflow.com/questions/53215483/how-do-i-find-out-the-ip-address-of-my-crostini-containerDNSサーバの起動
ターミナル# 起動 sudo systemctl start dnsmasq # 毎回自動的に起動するように設定 sudo systemctl enable dnsmasqで、DNS立ち上げたら、あとはChromeブラウザからURLを見に行くときにCrostiniのDNSを見に行くようにします。
エラーが出た人は下の対処方法を参考に。DNSサーバのポート問題でエラー
自分の場合はここで、Dnsmasqを立ち上げるときに、53番ポートが使われているよ。的なエラーがでてしまいました。
解決方法
systemd-resolvedのstub listenerというのがおなじく53番ポート使っていて被ってしまっているようだったので、それを無効にするオプションを設定/etc/systemd/resolved.conf[Resolve] DNSStubListener=udpこれで、全部再起動
ターミナルsudo systemctl restart systemd-resolved sudo systemctl restart dnsmasqで、なんとか動きました。
この部分は、ほんとうに手探りなのでした。
この方法だとまずいとか、もっといい方法あるとかあれば教えて下さい。Chrome OS にネームサーバの設定
- Chrome OS の設定画面 → ネットワーク → Wi-Fi
- 今接続しているWi-FiのSSIDを開く
- 設定項目が表示されるのでネットワークを開く
- [ネームサーバー]の欄を見る → 多くの人が自動ネームサーバーになっていてそこに現在のネームサーバーが表示されている
- カスタムネームサーバーを選択
- 一番上をCrostiniのIPアドレス、2番めを自動ネームサーバーに表示されていたIPアドレスに設定
これで、Laradockからさきほど設定した
project1.test
などのtestu用ドメインをChromeブラウザで開く。
project1/public/
内に保存した内容が表示されれば成功です。以上で、Chromebook上のLaradockで複数プロジェクトを管理できるようになりました。
動かすまでの流れと詰まったポイントをざっくり書きました。抜けなどあるかもしれません。
こまかな設定などはそれぞれの公式サイトや他の皆さんの記事を参考にしてください。ありがとうございました。
さいごに
自分の場合は、PHPを使うときって地元(地方都市です)で、ちょっとしたウェブ周りの機能やWordPressのカスタマイズなどを依頼されたときが多くて、いつも持ち運べるChromebookで打ち合わせの合間とか空いた時間にちょこっとコードかけるスタイルが、PHPととてもあっているように思ってLaradockインストールしてみました。
まだ、とりあえず立ち上げたという段階ですが、いろいろ使ってみたいと思います。参考
Crositni日本語化
Dockerインストール
必要な言語のインストール
DNSサーバー関連
dnsmasqとsystemd-resolved のエラー解決関連
- resolved: add an option to disable the stub resolver
- Ubuntu 18.04 の systemd-resolved で local DNS stub listener の利用をやめる
- https://kernhack.hatenablog.com/entry/2015/05/05/133203
- https://www.it-swarm.jp.net/ja/systemd/dnsmasq%E3%81%A8systemdresolved%E3%81%AE%E9%96%93%E3%81%AE%E7%AB%B6%E5%90%88%E3%82%92%E5%9B%9E%E9%81%BF%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF%EF%BC%9F/962510074/
- 投稿日:2021-03-14T11:16:08+09:00
Laravelのデフォルトのメーラーを取得する
概要
config/mail.php
で設定したメーラーにアクセスします。環境
Laravel 7.x, 8.x で動作確認しています。
取得方法
app('mailer');または
app('mail.manager')->driver();または
app('mail.manager')->mailer();どれも
Illuminate\Mail\Mailer
を返します。
また、デフォルト以外のメーラーは
driver('ses')
のように引数を与えると取得できます。mail.manager について
app('mail.manager')
はIlluminate\Mail\MailManager
を返します。
資料
- 投稿日:2021-03-14T01:08:55+09:00
laravel Seeder(シーダー)を使ってみる
目的
- laravelでSeeder(シーダー)を使う方法をまとめる。
環境
- ハードウェア環境
項目 情報 OS macOS Catalina(10.15.5) ハードウェア MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) プロセッサ 2 GHz クアッドコアIntel Core i5 メモリ 32 GB 3733 MHz LPDDR4 グラフィックス Intel Iris Plus Graphics 1536 MB
- ソフトウェア環境
項目 情報 備考 PHP バージョン 7.4.8 Homebrewを用いてこちらの方法で導入→Mac HomebrewでPHPをインストールする Laravel バージョン 8.X commposerを用いてこちらの方法で導入→Mac Laravelの環境構築を行う MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いてこちらの方法で導入→Mac HomebrewでMySQLをインストールする Node.jsバージョン v12.14.1 Homwbrewを用いてこちらの方法で導入→Mac HomebrewでNode.jsをインストールする 情報
limitsというテーブルが存在し、下記のようなカラムの設定になっているとする。
mysql> show full columns from limits; +------------+-----------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+ | Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment | +------------+-----------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+ | id | bigint unsigned | NULL | NO | PRI | NULL | auto_increment | select,insert,update,references | | | name | varchar(255) | utf8mb4_unicode_ci | NO | | NULL | | select,insert,update,references | 期限 | | created_at | timestamp | NULL | YES | | NULL | | select,insert,update,references | | | updated_at | timestamp | NULL | YES | | NULL | | select,insert,update,references | | | deleted_at | timestamp | NULL | YES | | NULL | | select,insert,update,references | | +------------+-----------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+limitsテーブルのnameカラムが「今日中」「明日中」「今週中」「今月中」「未定」となるレコードを追加したいとする。
今回の方法で紹介するコマンドは特筆しない限り前のコマンドと同じディレクトリで実行するものとする。
方法
アプリ名ディレクトリで下記コマンドを実行してSeederのファイルを作成する。
$ php artisan make:seeder LimitTableSeeder下記コマンドを実行して作成したSeederファイルを開く。
$ vi database/seeders/LimitTableSeeder.php開いたSeederファイルを下記のように修正する。
アプリ名ディレクトリ/database/seeders/LimitTableSeeder.php<?php namespace Database\Seeders; use Illuminate\Database\Seeder; use Carbon\Carbon; use Illuminate\Support\Facades\DB; class LimitTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { $limit_names = [ '今日中', '明日中', '今週中', '今月中', '未定', ]; $now = Carbon::now(); foreach ($limit_names as $limit_name) { $limit_info = [ 'name' => $limit_name, 'created_at' => $now, 'updated_at' => $now, ]; DB::table('limits')->insert($limit_info); } } }下記コマンドを実行して作成したSeederを登録するファイルを開く。
$ vi database/seeders/DetabaseSeeder.php下記のように内容を追記する。
アプリ名ディレクトリ/database/seeders/DetabaseSeeder.php<?php namespace Database\Seeders; use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder { /** * Seed the application's database. * * @return void */ public function run() { // \App\Models\User::factory(10)->create(); $this->call(LimitTableSeeder::class); } }下記コマンドを実行してシーディングの実行を行う。
$ php artisan db:seedMySQLにログインしlimitsテーブルを確認したところ下記のように表示されたため正常にSeederで登録指示したファイルが正常にシーディングされたことがわかる。
mysql> select * from limits; +----+-----------+---------------------+---------------------+------------+ | id | name | created_at | updated_at | deleted_at | +----+-----------+---------------------+---------------------+------------+ | 1 | 今日中 | 2021-03-13 12:00:03 | 2021-03-13 12:00:03 | NULL | | 2 | 明日中 | 2021-03-13 12:00:03 | 2021-03-13 12:00:03 | NULL | | 3 | 今週中 | 2021-03-13 12:00:03 | 2021-03-13 12:00:03 | NULL | | 4 | 今月中 | 2021-03-13 12:00:03 | 2021-03-13 12:00:03 | NULL | | 5 | 未定 | 2021-03-13 12:00:03 | 2021-03-13 12:00:03 | NULL | +----+-----------+---------------------+---------------------+------------+ 5 rows in set (0.00 sec)