20210314のlaravelに関する記事は6件です。

Laravel:プロジェクト内で定数を使う方法

概要

Laravelで定数を管理したい時にどうすればいいかわからなかったので備忘録にする

結論

①app/config/配下に定数用のファイルを作る
②定数を呼び出す場合config('ファイル名.定数名')とすればOK

例えばapp/config/配下にconst.phpを作る

const.php
<?php
return [
  //'定数名' => '出力したい値',
    'FILE_URL' => 'public/file', 
];

コントローラーから定数を呼び出す場合config('ファイル名.定数名')とすればOK

TestController.php
$url = config('const.FILE_URL');

.envの定数を呼び出す場合

envの定数を使いたい場合下記のように行う

MAIL_FROM_ADDRESS=test@gmail.com

app/config/app.phpに以下のような形式で追記する
'定数名' => env('envに記載している定数名', 'デフォルト値),

app.php
'email' => env('MAIL_FROM_ADDRESS', 'test@gmail.com'),

呼び出す場合はconfig('app.定数名')とすればOK

TestController.php
$sendEmail = config('app.email');

以上となります。

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

生のPHPとLaravelの、二通りの類似ポートフォリオを作った話

はじめに

こんにちは、おーもとと申します。エンジニアに転職をするため学習している初学者です。
私は車が好きで、「近年の若者の車離れ」という問題にフォーカスしたアプリを制作しようと思いました。

制作背景

若者が車を持たない理由には様々な理由があると思いますが、
「欲しいと思えるほど魅力を感じる車に出会っていないからなのでは?」
と思い、
・かわいいやかっこいいというスタイル
・大きさ
・国産か外車か
・アウトドアや街乗りという用途
これらの項目に当てはまる車を、結果として表示するアプリを制作することにしました。
(これらの特徴は全て私が定めているため、投票などにより特徴を決める機能をつけたいです)

11月 PHPでアプリ開発

10月からPHPの学習を始めていたので、そのアプリはPHPで制作しました。
カーセンサーAPIを使用して、車の情報を取得します。
解説動画:https://www.youtube.com/watch?v=ZXbgUtjxKM8
スクリーンショット 2020-12-12 12.34.26.png

機能

ユーザー登録関連
⚪︎ ログイン
⚪︎ ログアウト
⚪︎ 新規登録
⚪︎ ユーザー件数を表示

車の検索機能
⚪︎ 車の見た目→「かわいい」「かっこいい」「シンプル」「おしゃれ」「レトロ」
⚪︎ 車のサイズ→「ふつう」「すごくおおきい」「おおきい」「ちいさい」
⚪︎ 車の製造国→「国産車」「外車」
⚪︎ 車の用途 →「街乗り」「アウトドア」「スポーツ」

カーセンサー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
(スマホサイズにも対応しています)
スクリーンショット 2021-03-14 16.03.00.png

使用技術

使用言語

⚪︎ 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)

インフラ構成図

スクリーンショット 2021-02-28 20 11 32

機能一覧

機能 概要
ユーザー管理機能 新規登録・ログイン・ログアウトができます
簡単ログイン機能 ログイン画面のゲストログインをクリックすることで、ゲストユーザーとしてログインできます
おすすめ車種検索機能 条件を選択すると、それにあった車種一覧を表示します
検索履歴機能 直近の検索履歴・結果を表示します
画像提供機能 ユーザーの所有している車の画像を提供できます
提供した画像の削除機能 提供した画像を削除できます
提供画像一覧表示機能 自身が提供した画像一覧を表示します。
ユーザー情報編集機能 ご登録いただいたユーザー名・メールアドレスを変更できます
Twitterシェア機能 車の検索結果をツイートすることができます
レスポンシブ機能 スマホサイズ(320~540px)にも対応しています

DB設計

スクリーンショット 2021-02-20 19 05 58

各テーブルについて

テーブル名 説明
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へデプロイしました。
まだ課題も多いですが、ブラッシュアップしていきたく思っています。
長くなりましたが、ここまで読んでくださりありがとうございました!!

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

Laravel

最新のプロジェクトを作成する

コマンドを実行する

composer global require "laravel/installer=~1.1"

プロジェクトを作成したいディレクトリに移動してプロジェクトを作成するためのコマンドを実行する

cd ディレクトリ名
laravel new プロジェクト名

バージョンを指定してプロジェクト作成する

composer create-project "laravel/laravel=バージョン" プロジェクト名

バージョン確認

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

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.html

Chrome 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.html

Laradockのコンテナ内でインストールするときなどに docker-compose exec コマンドでコンテナに接続する必要があるのですが

ターミナル
docker-compose exec --user=laradock workspace bash

というようににユーザーを指定する必要があります。
--user オプションを指定しないで接続すると、コンテナ内部から作成したファイルの所有者が root になってしまい編集できなくなってしまいます。
普段はmacOSなどでやっていると、ここらへん無頓着になっていて、ハマってしまいました。。

ユーザー名は、laradock を指定してあげれば、自分のユーザーが割り当てられて、ファイルなども自ユーザー所有として作成されます。とても便利です。

あとは、自分の使いたいバージョンをドキュメントにそってインストールするだけです。

ターミナル(コンテナ内)
composer global require laravel/installer
laravel new example-app

Laradockで複数プロジェクトを管理

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/c17e07220b8f7c465564

Dnsmasq のインストール

Dnsmasqはお手軽DNSサーバとして情報も多くちょうどよい感じのようです。まずはインストール

ターミナル
sudo apt-get install dnsmasq

次に設定をします。
上記の参考サイトのをまるっと参考にさせていただきました。

/etc/dnsmasq.conf
listen-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 show

eth0のあたりです。
参考)
https://stackoverflow.com/questions/53215483/how-do-i-find-out-the-ip-address-of-my-crostini-container

DNSサーバの起動

ターミナル
# 起動
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 にネームサーバの設定

  1. Chrome OS の設定画面 → ネットワーク → Wi-Fi
  2. 今接続しているWi-FiのSSIDを開く
  3. 設定項目が表示されるのでネットワークを開く
  4. [ネームサーバー]の欄を見る → 多くの人が自動ネームサーバーになっていてそこに現在のネームサーバーが表示されている
  5. カスタムネームサーバーを選択
  6. 一番上をCrostiniのIPアドレス、2番めを自動ネームサーバーに表示されていたIPアドレスに設定

これで、Laradockからさきほど設定した project1.test などのtestu用ドメインをChromeブラウザで開く。
project1/public/ 内に保存した内容が表示されれば成功です。

以上で、Chromebook上のLaradockで複数プロジェクトを管理できるようになりました。

動かすまでの流れと詰まったポイントをざっくり書きました。抜けなどあるかもしれません。
こまかな設定などはそれぞれの公式サイトや他の皆さんの記事を参考にしてください。

ありがとうございました。

さいごに

自分の場合は、PHPを使うときって地元(地方都市です)で、ちょっとしたウェブ周りの機能やWordPressのカスタマイズなどを依頼されたときが多くて、いつも持ち運べるChromebookで打ち合わせの合間とか空いた時間にちょこっとコードかけるスタイルが、PHPととてもあっているように思ってLaradockインストールしてみました。
まだ、とりあえず立ち上げたという段階ですが、いろいろ使ってみたいと思います。

参考

Crositni日本語化

Dockerインストール

必要な言語のインストール

DNSサーバー関連

dnsmasqとsystemd-resolved のエラー解決関連

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

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 を返します。

資料

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

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カラムが「今日中」「明日中」「今週中」「今月中」「未定」となるレコードを追加したいとする。

  • 今回の方法で紹介するコマンドは特筆しない限り前のコマンドと同じディレクトリで実行するものとする。

方法

  1. アプリ名ディレクトリで下記コマンドを実行してSeederのファイルを作成する。

    $ php artisan make:seeder LimitTableSeeder
    
  2. 下記コマンドを実行して作成したSeederファイルを開く。

    $ vi database/seeders/LimitTableSeeder.php
    
  3. 開いた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);
            }
        }
    }
    
  4. 下記コマンドを実行して作成したSeederを登録するファイルを開く。

    $ vi database/seeders/DetabaseSeeder.php
    
  5. 下記のように内容を追記する。

    アプリ名ディレクトリ/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);
        }
    }
    
  6. 下記コマンドを実行してシーディングの実行を行う。

    $ php artisan db:seed
    
  7. MySQLにログインし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)
    
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む