- 投稿日:2021-01-19T22:54:48+09:00
【Laravel6】セッションの値が多重連想配列の時に特定のkeyに対応するvalueを更新する方法
はじめに
あまりググっても出てこなかった方法なので、残しておきます。
この選択肢があればセッションの扱える幅が広がると思います。対象のセッション(仮)
例えば
//セッションからkeyが'cartData'の値を取得 $request->session()->get('cartData');これで取得した値が以下の場合を想定する
[ [0] => [ 'item_name' => 'ジャケット', 'item_count' => 1, ], [1] => [ 'item_name' => '靴下', 'item_count' => 3, ], [2] => [ 'item_name' => 'バッグ', 'item_count' => 2, ], ]実現したいこと
靴下の個数を3 → 5個にしたい!
セッションの特定のkeyに対応するvalueを更新する方法
以下のコードで更新できる
$request->session()->put('cartData.1.item_count', 5);
->put()
の第1引数に連想配列の階層を文字列連結することで特定のkeyのvalueにアクセスすることができる。※
config()
と同じ感じですねさいごに
ドキュメントにも明確には記載されていなかった...
- 投稿日:2021-01-19T22:19:38+09:00
laravel6,7,8インストール
Laravel6
terminalcomposer create-project --prefer-dist laravel/laravel ●●● "6.*" composer require laravel/ui:^1.0 --devLaravel7
terminalcomposer create-project --prefer-dist laravel/laravel ●●● "7.*" composer require laravel/ui:^2.4Laravel8
terminalcomposer create-project --prefer-dist laravel/laravel ●●● "8.*" composer require laravel/uivue、テーブル作成
terminalphp artisan ui vue //authがいる場合 php artisan ui vue --auth php artisan migratenpm
terminalnpm installコンパイル
terminalnpm run dev
- 投稿日:2021-01-19T22:19:38+09:00
laravel6,7,8別プロジェクト作成
Laravel6
terminalcomposer create-project --prefer-dist laravel/laravel ●●● "6.*" composer require laravel/ui:^1.0 --devLaravel7
terminalcomposer create-project --prefer-dist laravel/laravel ●●● "7.*" composer require laravel/ui:^2.4Laravel8
terminalcomposer create-project --prefer-dist laravel/laravel ●●● "8.*" composer require laravel/uivue、テーブル作成
terminalphp artisan ui vue //authがいる場合 php artisan ui vue --auth php artisan migratenpm
terminalnpm installコンパイル
terminalnpm run dev
- 投稿日:2021-01-19T17:53:57+09:00
【Laravel】artisanコマンドでやりたいこと、ここで見つかる
はじめに
「この記事を見ればお目当てのartisanコマンドが(だいたい)全て見つかる!」っていう記事です。
以前書いたGitでやりたいこと、ここで見つかるのartisanコマンドバージョンです。
僕自身が「あのartisanコマンドどう書くんだっけ?」ってなった時に見返す用でもありますのでストックしておくと便利かなと思いますw
※この記事では全てのartisanコマンドを網羅したわけではありません。
.envのAPP_ENVを表示
$ php artisan envLaravelの内蔵サーバーを起動(PHPのビルドインサーバー)
$ php artisan serveDBとの接続状況を確認
$ php artisan migrate:statusコントローラー作成
$ php artisan make:controller {任意の名前}Controllerコントローラー作成(主要7アクションを自動的に生成)
$ php artisan make:controller {任意の名前}Controller --resourceシングルアクションコントローラー作成
$ php artisan make:controller {任意の名前}Controller --invokableマイグレーションファイル作成(テーブル作成用)
$ php artisan make:migration create_{テーブル名}_table —-create={テーブル名}マイグレーションファイル作成(カラム追加用)
$ php artisan make:migration add_column_{テーブル名}_table —-table={テーブル名}※ファイル名の付け方には個人差あり
※これがデファクトスタンダードではないマイグレーション実行
$ php artisan migrate現在のテーブルを全削除してマイグレーションやり直し
$ php artisan migrate:freshデータベース全体を作り直す
$ php artisan migrate:refreshマイグレーション実行&シーディング実行
$ php artisan migrate --seedマイグレーションロールバック(最後に実行したマイグレーションを元に戻す)
$ php artisan migrate:rollback全てのマイグレーションをロールバックする
$ php artisan migrate:resetシーダーファイル作成
$ php artisan make:seeder {任意の名前}Seeder※
{任意の名前}TableSeeder
にする場合もアリシーディング実行
$ php artisan db:seed特定のシーダーファイルを実行
$ php artisan db:seed --class={実行するシーダーファイル}モデル作成
$ php artisan make:model {任意の名前}(例)テーブル名が
users
なら{任意の名前}はUser
にするモデルとファクトリーを同時に作る
$ php artisan make:model {任意の名前} —-factory(例)テーブル名が
users
なら{任意の名前}はUser
にするルーティング一覧を表示
$ php artisan route:listフォームリクエスト作成(バリデーションに使用)
$ php artisan make:request {任意の名前}Requestポリシー作成
$ php artisan make:policy {任意の名前}Policy --model=Article通知クラス作成
$ php artisan make:notification {任意の名前}Notificationファクトリー作成(モデルと対応させる)
$ php artisan make:factory {モデル名}Factory —-model={モデル名}テスト作成
$ php artisan make:test {任意の名前}ControllerTesttinker起動
$ php artisan tinkerさいごに
順次追記予定です
- 投稿日:2021-01-19T14:37:36+09:00
xamppでバーチャルホストを設定する(laravel)
概要
三か月前にエンジニアになったばかりですが、この前新規のプロジェクトでバーチャルホストとやらを設定し、開発をスタートして、これは便利だなーと感じたので記録しておきます。
バーチャルホストとは?
その名の通り、仮想のホストのことですね。1つのサーバーで複数のドメインを運用できるみたい。
例えば、3つのプロジェクトを平行して開発しているとき、プロジェクトごとコードを書くたびにサーバーを切り替えるのはすごくめんどうだと。だからバーチャルホストを設定してプロジェクトaは「aaa.com」プロジェクトbは「bbb.com」プロジェクトcは「ccc.com」みたいにドメインを設定することができる。手順
手順はざっくりとこんな感じ。
この手順に入る前にapacheは停止させてくださいね。
1.hostsファイルの編集
2.httpd-vhostsファイルの編集
3.envファイルの編集1.hostsファイルの編集
hostsファイルの場所は下記。
C:\Windows\System32\drivers\etc\hostsただ、hostsファイルはそのままでは編集できません。
なので、一旦デスクトップへ移しましょう。
その際に警告が出ますが、「続行」を押して問題ないです。
デスクトップで編集したら、元の場所へ戻す。hostsファイルの一番下に以下を追加
aaaの部分は任意の文字で。127.0.0.1 aaa.com2.httpd-vhostsファイルの編集
ファイルの場所は下記。
C:\xampp\apache\conf\extra\httpd-vhosts一番下に下記を追加。
htdocs配下に作業フォルダとかを作っている人はそのパス通りに。<VirtualHost *:80> DocumentRoot "C:/xampp/htdocs/aaa/public" ServerName localhost </VirtualHost> <VirtualHost *:80> DocumentRoot "C:/xampp/htdocs/aaa/public" ServerName aaa.com </VirtualHost>3.envファイル編集
laravelにはプロジェクト直下に.envファイルというものがあるかと思います。
.env上部のAPP_URLとやらを手順1と2で設定したドメインを記述。APP_NAME=aaa APP_ENV=local APP_KEY=それぞれ取得したkey APP_DEBUG=true APP_URL=aaa.comこれでapacheを立ち上げて、aaa.comをブラウザに入力すると表示されます。
- 投稿日:2021-01-19T14:14:44+09:00
【Laravel】動的に生成した文字列を直接ファイル形式でレスポンスする方法。
自分用のメモとして残します。
文字列をダウンロードファイルとしてレスポンスを返す方法をメモ。
→つまりレスポンス用にわざわざファイルを保存しない。■やり方
\Responseクラスでレスポンス用のオブジェクトを明示的に作成する。
$content = 'hoge,hoge,hoge'; $headers = [ 'Content-type' => 'text/plain; charset=utf-8', 'Content-Disposition' => 'attachment; filename="download.txt"', ]; $response = \Response::make($content, 200, $headers); return $response;
- 投稿日:2021-01-19T14:13:17+09:00
初心者がLaravelでアプリを作るまで(2)
基本設計とテーブル定義の相談を終えて、コードを書いていくことに、、
でもいきなりコードを書いていくことは難易度が高すぎるので、スクールのカリキュラムで覚えたことに沿って少しずつ書いていく。とりあえず、MVCモデルとルーティングの流れでページを作るということはわかっているので、まずviewの部分を書いて、
それからcontroller、routingという順番で書いていこう。
先生が言うには、順番は決まっているわけではないらしいので適当に決めてみました。
DBとmodelの部分は少し自分にとって難しいので、後で書くことにする。とりあえず、投稿ページの形だけは完成。
形を整えるために、bootstrapを使ったけど、使うのが難しい。
しかも、スクールのカリキュラムにbootstrapに関する記述はほぼなかったので、質問投稿機能と自分で調べながら書いてみたけど、一ページ作るのに果てしない時間がかかりました、、初心者は、フロントすらなかなか整えれない、、
それから、複数ページを時間をかけながらつくってみました。
何枚か画像を載せておきます。↑投稿一覧ページ
これはカリキュラムにやり方が、書いてあったので少し短めの時間で完成しました。
投稿する機能もついでに書いてみましたが、理解しにくい部分もありながら実装してみました。何せ、一つのページに一つの機能をつけるのに時間がとてもかかる、、
書いてはエラー書いてはエラーの繰り返し、、↑マイページ
あとは、マイページもつくってみましたがここから色々データを持ってくる機能だったり、内容を変更する部分を書いていかなくては、、とりあえずフロント画面は徐々に完成していっているので、このままがんばります!
問題はページとページの中身をうまく遷移したりデータを持ってくるコードのとこやなあ
- 投稿日:2021-01-19T12:46:12+09:00
Laravel カラム追加 外部キーカラムの追加と削除
はじめに
・カラムを後から追加したい
・外部制約キーをつけたカラムを追加したい向けの内容となっています
マイグレーション 外部キーカラムを追加
1.migrationファイルの作成
例) offersテーブルにuser_idカラムを追加したい場合migration$ php artisan make:migration add_user_id_to_offers_table --table=offers命名規則は add_(カラム名)to(テーブル名)_table --table=(テーブル名)
でファイル名を作成します--table=(テーブル名)の部分では、カラムを追加のテーブルを指定して行っています。
migrationpublic function up() { Schema::table('offers', function (Blueprint $table) { $table->integer('user_id')->unsigned(); $table->foreign('user_id')->references('id')->on('users')->OnDelete('cascade'); }); }$ php artisan migrateさあ、これでマイグレーションするとカラム作成だ!
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint failsと思いきや,うまく外部制約キーのカラムがうまく作成できません。
調べてみると、原因は、「users.idに存在しないデータがoffers.user_idに存在しているから」だそうです。
上記のマイグレーションをしたときはoffersテーブルにはuser_idのカラムが入っていましたが、user_idが0でした。もともと外部キー制約は
「参照元フィールドに存在するデータのみ参照先フィールドのデータに存在できる」
という仕様です。そもそも,user_idが存在しない場合にoffers.user_idが存在しているのは外部キーの設定ができるはずもありません。
解決方法
今回の場合の対策として
1. 整合性の取れないデータはdeleteする
2. usersにデータを追加する
3. offersテーブルのuser_idをnullにする外部制約のキーでデータが一致しないとエラーになります。
そのときに
php artisan migrate:refresh
php artisan migrate:fresh
など一旦データを削除してまたmigrateをするとうまくいきますが、問題点として
すでにあるデータを削除してしまう
毎回、データを削除しないといけない
などがあります。本来なら最初にちゃんとテーブル設計したらと思いますが、開発の途中で機能追加するときもこういった場面があるのではないかなと思い記事を書いてみました。
データを挿入するなら
・seedやfactoryを使ってデモデータを挿入するなどのやり方があります。
今回僕がやった方法は, 外部制約キーにnullableを追加して解決しました。
migratepublic function up() { Schema::table('offers', function (Blueprint $table) { $table->integer('user_id')->unsigned()->nullable(); $table->foreign('user_id')->references('id')->on('users')->OnDelete('cascade'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('offers', function (Blueprint $table) { $table->dropForeign('offers_user_id_foreign'); }); // Schema::table('offers', function (Blueprint $table) { // $table->dropColumn('user_id'); // }); }nullable()を追加すれば、migrateがうまくいきます。
down()のところには外部制約キーを削除できるように
$table->dropForeign('offers_user_id_foreign');
に設定します。
ただ、外部キーをNullにするのはどうかなぁと考えてしまいます。
ここら辺はSQLの知識が必要だなと思っています。外部キー制約カラムの追加を試している方はぜひ参考にしてみてください。
参考
- 投稿日:2021-01-19T12:09:31+09:00
【Laravel】.envファイルの値を確認する方法。env関数の使い方と注意点。
Laravelで.envファイルに記述した値が反映されているのか確認する方法について。
envヘルパ関数
Laravelにデフォルトで用意されている関数。.envファイルの指定した値を呼び出せる。
・
env('環境変数名', 'デフォルト値')
- 環境変数がnullの場合にデフォルト値が表示される。
- デフォルト値はなくてもいい。
値がきちんと読み込まれているか確認するにはデフォルト値を設定しておく方がわかりやすい。
▼記述例
env('DB_CONNECTION') env('DB_CONNECTION', 'default')
確認手順
実際にブラウザに表示してみる。
1. ビューの作成
rousources > views > env.blade.php
テストとして、DBに関する3つの環境変数を表示してみる。
env.blade.php<p>{{ env('DB_CONNECTION', 'default')}}</p> <p>{{ env('DB_HOST', 'default')}}</p> <p>{{ env('DB_PORT', 'default') }}</p>
▼(補足)対象のデータ.envDB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=33062. ルーティング
routes > web.php
web.php//env Route::get('env', function () { return view('env'); });3. ブラウザに表示
ターミナル#サーバー起動 php artisan servehttp://127.0.0.1:8000/env にアクセス
環境変数の値が読み込まれていることが確認できた。
表示されない場合の対処法
キャッシュが読み込まれてしまい、.envファイルが読み込まれない場合がある。
以下コマンドでキャッシュをクリアする。
・
$ php artisan config:clear
↓
ターミナル$ php artisan config:clear Configuration cache cleared!↓
ローカル環境で実行してはいけないコマンド
php artisan config:cache
を実行すると、.env
ファイルを読み込みに行かなくなる。すべての値が.envがきちんと記述されているのに、ブラウザの表示がnull(上記設定ではdefault)になる場合は、このコマンドが実行された可能性がある。
php artisan config:cache
とは?本番環境用のコマンドで、すべての設定ファイルを一つにまとめることで高速化するためのコマンド。
設定が頻繁に変わる開発環境では推奨されていない。
また、実行すると、キャッシュが作成され、.envファイルを読み込みに行かなくなる点も注意が必要。
$ php artisan config:cache Configuration cache cleared!
- 投稿日:2021-01-19T10:52:43+09:00
【メモ】LaravelのIlluminateの場所
ここにあります。
vender/laravel/framework/src/Illuminate
- 投稿日:2021-01-19T06:27:34+09:00
Laravel/UIでの簡単ログイン機能の実装
準備
Laravel/uiをインストールしてとりあえず基本のログイン機能が使えることを確認しておく。
※php8では使えません。前提
セキリュティへの考慮はしていません。
ポートフォリオを作る際にできたらいいなと思ったので書いています。
コードを書くのには慣れていないので、あくまで参考程度でお願いします。実装
Laravel/UIの処理が全部はわかりませんが、インストールの際に
views/auth
にlogin.blade.php
が作成されています。
この中を見てみるとlogin.blade.php<form action="{{ route('login') }}" method="POST"> ... </form>と書かれており、このrouteに渡してあげればいいみたいです。
login.blade.php<form method="POST" action="{{ route('login') }}"> @csrf //この記述がないとセッションエラーが起きる <button type="submit" >{{ __('Guest Login') }}</button> <input type="hidden" name="email" value="..."> <input type="hidden" name="password" value="..."> </form> //valueには自分が作成したいユーザの値をいれる。次にlogin.blade.phpの表示を命令している部分が、少しややこしいですが、
vendor/laravel/ui/auth-backend/AuthenicatesUsers.php
内にありました。AuthenicatesUsers.phppublic function showLoginForm() { return view('auth.login', compact('test')); } //ここが該当部分です。そこでDBにゲストで使いたいユーザが登録されている場合にtrueを返し簡単ログインできるようにしたいと思います。
AuthenicatesUsers.phppublic function showLoginForm() { if(User::where('email','LIKE', '...')->get() != '[]'){ $test = true; }else{ $test = false; } //if文で ... != '[]'としているのはsqlを発行した際、見つからない場合の返り値が'[]'のため return view('auth.login', compact('test')); }そしてlogin.blade.phpで$testを読み取ればできる。
login.blade.php@if($test == true) <form method="POST" action="{{ route('login') }}"> @csrf <button type="submit" class="btn btn-primary">{{ __('Guest Login') }}</button> <input type="hidden" name="email" value="test@test.com"> <input type="hidden" name="password" value="password"> </form> @endifとりあえずこれで簡単ログインができる。
しかし、最初からゲストユーザはDBに無くエラーが出るので、DBに無い場合はregisterに渡して登録させればいい。login.blade.php@if($test == true) <form method="POST" action="{{ route('login') }}"> @csrf <button type="submit" class="btn btn-primary">{{ __('Guest Login') }}</button> <input type="hidden" name="email" value="test@test.com"> <input type="hidden" name="password" value="password"> </form> @else <form method="POST" action="{{ route('register') }}"> @csrf <button type="submit" class="btn btn-primary">{{ __('Guest Login') }}</button> <input type="hidden" name="name" value="test"> <input type="hidden" name="email" value="test@test.com"> <input type="hidden" name="password" value="password"> <input type="hidden" name="password_confirmation" value="password"> </form> @endifこれで簡単ログインが実装できた。
注意
本番では100%使いません。
ポートフォリオで見てもらう人の負担を減らすみたいな用途くらいかな?
再度、コードを書くのには慣れていないためよくない書き方をしているかもしれません。もしこうした方がいいよ!などありましたら是非教えていただきたいです。
- 投稿日:2021-01-19T03:34:19+09:00
Laravel 地理座標を文字と数字の文字列にエンコードするジオハッシュアルゴリズム
saikiran/geohashライブラリをインストール
composer require saikiran/geohash地理的な位置を文字と数字の短い文字列にエンコードします。
use Sk\Geohash\Geohash; $g = new Geohash(); public function run(Faker $faker) { // 緯度,経度,文字数 'geohash' => $g->encode($faker->latitude(), $faker->longitude(), 12), }文字と数字の文字列を緯度と経度にデコードします。
use Sk\Geohash\Geohash; $g = new Geohash(); public function run(Faker $faker) { 'geohash' => $g-> decode('エンコードされた文字列', 12), }
- テーブルに緯度・経度を文字列かしたレコードを保持しておけば色々使い回しが出来そう!
- 投稿日:2021-01-19T00:32:16+09:00
【Laravel】.envを編集したが、migration時に反映されなかった
事象
Laravelのmigrationを掛けたかった。
しかし.envのDB名が間違っていたため、修正をかけたが、反映されず修正前のDB名でエラーが出た。変更前
.env~ DB_CONNECTION=mysql DB_HOST=localhost DB_PORT=3306 DB_DATABASE=before #修正前 DB_USERNAME=root DB_PASSWORD= ~変更後
.env~ DB_CONNECTION=mysql DB_HOST=localhost DB_PORT=3306 DB_DATABASE=after #修正後 DB_USERNAME=root DB_PASSWORD= ~しかし、beforeのDB名でエラー出力されました。
$ php artisan migrate Illuminate\Database\QueryException : SQLSTATE[HY000] [1049] Unknown database 'before' (SQL: select * from information_schema.tables where table_schema = before and table_name = migrations and table_type = 'BASE TABLE') at /Library/WebServer/Documents/laravel/vendor/laravel/framework/src/Illuminate/Database/Connection.php:669 665| // If an exception occurs when attempting to run a query, we'll format the error 666| // message to include the bindings with SQL, which will make this exception a 667| // lot more helpful to the developer instead of just the database's errors. 668| catch (Exception $e) { > 669| throw new QueryException( 670| $query, $this->prepareBindings($bindings), $e 671| ); 672| } 673| Exception trace: 1 Doctrine\DBAL\Driver\PDOException::("SQLSTATE[HY000] [1049] Unknown database 'before'") /Library/WebServer/Documents/laravel/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:31 2 PDOException::("SQLSTATE[HY000] [1049] Unknown database 'before'") /Library/WebServer/Documents/laravel/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:27 Please use the argument -v to see more details. $解決策
config(?)のキャッシュクリア
$ php artisan config:clear Configuration cache cleared!参考:Laravel キャッシュクリア系コマンドなど
https://qiita.com/Ping/items/10ada8d069e13d729701
- 投稿日:2021-01-19T00:03:34+09:00
【Laravel】【mac】ドキュメントルートにしかアクセスできない
環境
macOS Catalina 10.15.7
$ apachectl -v Server version: Apache/2.4.41 (Unix)$ php artisan --version Laravel Framework 6.20.12事象
ドキュメントルート以外のページにアクセスできない。
(404 Not Foundとなる)解決策
$ sudo vim /etc/apache2/httpd.conf ~ LoadModule rewrite_module libexec/apache2/mod_rewrite.so ->このコメントアウトを外す ~ $ sudo apachectl restartこれだけで治りました。
ご参考:https://qiita.com/u-akihiro/items/c7a5bb38c34858d00c2a
Ubuntu版のご投稿ですが、内容はほぼ一緒です。