20220108のlaravelに関する記事は9件です。

ルーティングの優先度・順番

ルーティングには上から順番に処理がされていくという規則があります。 例えば下記のようなコードの場合、 web.php Route::get('/picture/{id}', 'UserController@show')->name('shop.show'); Route::get('/picture/edit', 'UserController@edit')->name('shop.edit'); 『~/picture/edit』のURIを表示しようとすると 先に記載されているRoute::get('/picture/{id}', 'UserController@show')->name('shop.show'); こちらの処理がされます。 URI『~/picture/edit』の画面に遷移した際、 {id}の中にeditが入ってしまいます。カラムにeditという値が存在しない為、エラーが表示されうまく画面遷移がされません。 解決策 パラメータのあるルーティングは下にする web.php Route::get('/picture/edit', 'UserController@edit')->name('shop.edit'); Route::get('/picture/{id}', 'UserController@show')->name('shop.show'); こうすることで、 URIが『~picture/edit』に画面遷移が可能となり、editメソッドの処理が可能となります。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel-Mix】npm run productionしたらエラーが出た時の苦し紛れの解決方法

npm run productionしたらエラーが出た Terminal npm run production 前提 Laravel 8.4 webpack-cli 4.9 Laravel-mix 5.1 Laravel-uiのLaravel-mixを使いたかった。 package.json "scripts": { "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js" } 苦し紛れの解決方法 そうだ、Laravel-mixを最新にしよう Terminal npm install laravel-mix@latest 私の環境ではうまくいきました。 Terminal npm run production Laravel Mix v6.0.39 ✔ Compiled Successfully in 10197ms ちなみに公式Docによるとlaravel-mixバージョン6以上の場合、 package.json "scripts": { "development": "mix", "watch": "mix watch", "watch-poll": "mix watch -- --watch-options-poll=1000", "hot": "mix watch --hot", "production": "mix --production" } scriptsがこんなに綺麗になる。エラーも出ない。すごい(小並感) 以下、解決するまで試したこと エラー文1 Terminal [webpack-cli] Error: Unknown option '--no-progress' [webpack-cli] Run 'webpack --help' to see available commands and options ⇒ package.jsonのscriptsから --no-progressを削除し、再実行 エラー文2 Terminal [webpack-cli] Error: Unknown option '--hide-modules' [webpack-cli] Run 'webpack --help' to see available commands and options ⇒ package.jsonのscriptsから --hide-modulesを削除し、再実行 --no-progressと--hide-modulesを消したscripts package.json "scripts": { "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --config=node_modules/laravel-mix/setup/webpack.config.js" } エラー文3 Terminal [webpack-cli] Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. - configuration.module.rules[10] has an unknown property 'loaders'. ⇒ webpack.config.jsを確認したところ、'loaders'プロパティが見当たらない。 npm-moduleを削除し、npm installする Terminal rm node_modules Terminal npm install その後も再びエラー文3が出る。 おわり バージョンの選択はやはり塩梅が難しい。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

(備忘録)初学者からLaravelで開発できるまでの要点まとめ

まずは軽くLaravel内でのクラス、メソッド、プロパティの書き方をおさらい クラスが持つ「変数」を「プロパティ」と呼びます。 クラスが持つ「関数」を「メソッド」と呼びます。 プロパティはpublic、private、protected (アクセス修飾子)で定義します。 クラス内でプロパティやメソッドを参照するときは、$this という変数を使います。 このときプロパティ名に$(ダラー)はつけません。 × $this->$number1   〇 $this->number1 クラス(設計図)からインスタンス(newで定義)を作成。 インスタンス内のプロパティやメソッドにアクセスするには、オブジェクトに対して -> (アロー演算子)を使用します。 $math = new Math; //クラス(Math)からインスタンスを作成。 ※ 作成したインスタンス($math)は、クラスで定義したプロパティ($number1,$number2)とメソッド( add(),minus() )を持ちます。 $result1 = $math->add(); //メソッドにアクセス 静的プロパティ・メソッド staticキーワードを指定することで静的なプロパティ、メソッドが定義できるようになります。(動的もある。新しく作られるものなどは動的。) 静的なプロパティ、メソッドを定義するとインスタンスを生成せずに直接プロパティ、メソッドを呼び出すことができます。 例)※)::(スコープ演算子) class Message {   //メソッドを定義   static function hello() {     return "こんにちは";   }   static function bye() {     return "さようなら";   } } //この時点では設計図(クラスのみ)   //Messageクラスのメソッドを直接呼び出す。(まだインスタンス化していない。) $message1 = Message::hello(); $message2 = Message::bye(); //スコープ演算子のみで呼び出せる。 大切なルーティングは大体route/web.phpに書いてある。 routes/web.phpファイルは、Webインターフェイス用のルートを定義する。 laravel公式ルーティング参照 セッション状態やCSRF保護などの機能を提供するwebミドルウェアグループが割り当てられ、ほとんどのアプリケーションはroute/web.phpでルートを定義する所から始める。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

空白投稿もエラーメッセージが表示されない(Laravel)

<エラー概要> ◉LaravelMix学習 Class "App\Http\Controllers\Admin\Profile" not found <仮説> ・ Profileが存在するか確認 ・ 名前空間とファイル名の命名規則相違 ・ ファイルの階層を、Profileの名前を確認 ・ namespace App; → namespace App\Models; ※いずれも変化なし。 <解決方法> ①複数形になっているmodel削除 ②単数系で再度作成 ③validation.phpで日本語表示に設定 modelは原則単数系で命名しないといけないにも関わらず、 複数形で命名していたことが原因。 冷静になって基礎から調べたら解決できました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Laravel]リクエスト値の整形にpassedValidationという選択肢

やりたいこと 例えば、WEBサイトの新規登録画面を作る状況で、郵便番号などを整形した上でDBへ登録したい時 Laravelを使うとなると、ベストプラクティスにもある通りフォームリクエストを使うことが多いと思うので、 Viewから入力内容を含んだリクエストを送信 ↓ フォームリクエストでバリデーション ↓ Contorollerでバリデーション済のリクエスト受け取り ↓ 受け取ったリクエストに対して整形・・・★ みたいにやると思うが★の部分でControllerを汚すため、あまり望ましくないと思う ということで今回のらやりたいことは「やりたいこと」は 「Controllerを汚さずにバリデーション済かつ、整形済みの値を取得する」 です。 手段 方法としては 同じController内で整形用フォーム作る 別階層に整形専用クラスを作成、使用 などいくつか方法はあるけど、自分の場合は passedValidationメソッドを使う という選択肢を使った次第 内容 passedValidationの説明は公式ドキュメントになくて、Githubから引用 使い方 フォームリクエストにpassedValidationメソッドを追加し、バリデーション後の処理を書くだけ。非常に簡単。 namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class HogeRequest extends FormRequest { ... ... // 郵便番号の整形(ハイフンが有ったらハイフン削除) public function passedValidation() { if (Str::contains($this->postal_code, '-')) { $formattedPostalCode = Str::remove('-', $this->postal_code); $this->merge([ 'postal_code' => $formattedPostalCode, ]); } } } 注意点 一個厄介なのが、フォームリクエストでControllerで整形後の内容は$requestには反映されるが、$request→validated()には反映されない点 リクエストの値がバリデーションを通っていることを明示的にするため、$request→validated()を使うことが多いと思うが、これでは整形前(=入力値そのまま)しか取得できない ↓HogeRequestでフォームリクエスト受け取り先Controller class HogeController extends Controller { public function register(HogeRequest $request) { $validated = $request->validated(); dd($validated); // 整形前(=ハイフン未削除)の値 dd($request); // 整形後(=ハイフン削除済)の値 } } なので、整形後の値を取得する方法は2つ 1, $requestをそのまま使う 2, 以下のように$validated = $request→validated()した後、$validatedの内容を$requestに置き換える $validated = $request->validated(); // passedValidationで整形後の値で置き換え $validated['postal_code'] = $request->postal_code; これはこれでビジネスロジック汚すので、別で専用メソッド作って呼び出すとかのがいいかもですね protected function ($request) { $validated = $request->validated(); // passedValidationで整形後の値で置き換え $validated['postal_code'] = $request->postal_code; // 他に整形が必要なリクエスト値も置換え ... ... return $validated; } 尚、こことか こことか 見ていると$requestに対してvalidated()を使うのは暗黙的なベストプラクティスに思われます。 補足 passedValidationの逆にバリデーション前にリクエスト処理を行えるメソッドとして、prepareForValidationがある これもドキュメントには記載がないが、Githubを転記 いつ使うんだろう。。。 所見 ココまで書いて思うのは、自分のアサイン中のプロジェクトはvalidated()は基本必須なので、一番スマートなのは「別階層に整形専用クラスを作成、使用」かな、と思いました。。。 Controllerで専用クラスを呼び出して、1文で整形してしまうみたいな感じかな 例えば、専用クラス名がViewHelperでメソッド名がformatPostalCodeであればこんな感じ public function register(HogeRequest $request) { // 郵便番号の整形 ViewHelper::formatPostalCode($request->postalcode); ... } こっちのがControllerで余計な処理($vaidatedに$requestを再代入など)をしなくていいのでスッキリする。 しかも整形処理なんて、新規登録だけじゃなくて、登録情報変更でも使ったりする汎用性の高い処理なので、そっちのが望ましい でも、プロジェクトとして$requestそのまま使うことを許容されているのであれば、断然こっちのが楽ですね 公式ドキュメントに書いていない理由の個人的推測は、Laravelベンダーとしては $request→validated()推奨・・・★ ↓ 「$request→validated()ではpassedValidationメソッドで処理後の値を取得できない」 ↓ 「★と相性悪いよね。。。」 ってとこでしょうね。 最後までお読みいただきありがとうございました!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】フォーム送信時に419 Page Expiredが発生する件について調べてみた

概要 本記事は、PHPフレームワークLaravel入門 第2版で学習している中の疑問・つまづきの備忘録です。 今回はCSRF対策の際のエラー解決と根本原因についてまとめます。 発生したエラー フォーム送信時に以下のエラーが発生しました。 ソースコード index.blade.php <form action="/hello" method="post"> <table> ///////中略 <tr> <th>Message: </th> <td> <input type="text" name="msg" value="{{ old('msg') }}"> </td> </tr> </table> </form> VerifyCsrfToken.php <?php namespace App\Http\Middleware; use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; class VerifyCsrfToken extends Middleware { protected $except = [ // ]; } 原因 以下の2点が原因です。 index.blade.phpのformタグ内に@csrfディレクティブを記載していない にも関わらず、VerifyCsrfTokenクラスの配列$exceptにCSRF対策から除外するアクション名を記載していない 解決策1(CSRF対策を行いたい場合) index.blade.phpのformタグ内に@csrfディレクティブを追記 index.blade.php <form action="/hello" method="post"> <table> @csrf //これを追記する ///////中略 <tr> <th>Message: </th> <td> <input type="text" name="msg" value="{{ old('msg') }}"> </td> </tr> </table> </form> 解決策2(CSRF対策を行わない・必要ない場合) VerifyCsrfTokenクラスの配列$exceptにCSRF対策から除外するアクション名を追記 ※この場合formタグに@csrfディレクティブの追記は不要 VerifyCsrfToken.php <?php namespace App\Http\Middleware; use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; class VerifyCsrfToken extends Middleware { protected $except = [ 'hello', //helloアクションではCSRF対策を行わない指定 ]; } なぜ上記の対応を行わないと419 Page Expiredが発生するのか こうすればエラーが解消できる!というのは分かりましたが、なぜこのような対応が必要なのでしょうか。 裏側で何が起こっているのか調べてみました。 答えはLaravel 8.x CSRF保護に記載がありました。 アプリケーションで"POST"、"PUT"、"PATCH"、"DELETE" HTMLフォームを定義するときはいつでも、CSRF保護ミドルウェアがリクエストを検証できるように、フォームに非表示のCSRF_tokenフィールドを含める必要があります。便利なように、@csrf Bladeディレクティブを使用して、非表示のトークン入力フィールドを生成できます。 Laravelを使用しないPHPでの開発の際に必要だったtype="hidden"でvalueにトークンを持つinputタグを自動で生成してくれています。 <form method="POST" action="/profile"> @csrf <!-- Equivalent to... --> <input type="hidden" name="_token" value="{{ csrf_token() }}" /> //生成されるタグのトークン入力フィールド </form> さらに、 webミドルウェアグループへデフォルトで含まれているApp\Http\Middleware\VerificationCsrfTokenミドルウェアは、リクエスト入力のトークンがセッションに保存されたトークンと一致するかを自動的に検証します。この2トークンが一致すれば、認証済みユーザーがリクエストを開始したことがわかります。 つまり今回は index.blade.phpのフォームに@csrfディレクティブが記載されておらず、トークンを持つinputタグが生成されていなかった VerificationCsrfTokenクラスの配列$exceptでCSRF対策を除外したい当該のフォーム送信時のアクション名が追加されていなかった VerificationCsrfTokenで入力トークン検証が失敗した という理由でフォーム送信時に419 Page Expiredが発生したようです。 まとめ CSRF対策する場合は、formタグに@csrfディレクティブを記載する。 しない場合はVerificationCsrfTokenクラスの配列$exceptにCSRF対策から除外するアクション名を追記する。 色々と調べてみると新たな発見があって楽しいですね! 参考文献 PHPフレームワークLaravel入門 第2版 Laravel 8.x CSRF保護
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel8.x】Laravel + Ngram + Observerを利用した全文検索機能の実装ハンズオン

はじめに 本記事は以下の続編になります。 https://qiita.com/naoki-haba/items/ace7a5d1e0d9d72ed040 続編記事を書くことにした経緯 シンプルなテーブル構成の場合は以下の通りにすれば全文検索の準備は整います DB::statement("ALTER TABLE shops ADD free_word TEXT as (concat(IFNULL(age, ''), ' ',IFNULL(name, ''), ' ',(case gender_id when 1 then '男性' when 2 then '女性' else '' end), ' ')) STORED"); しかし、複雑な要因(複数テーブルとの外部結合が必要な場合etc)の場合に、上記の記述をすることに苦労したので、今回は対処方法の選択肢の1つとしてご紹介させていただきます。 記事の流れ 1.既存のDDLからfree_wordカラムを削除する 2.ダミーデータを投入する 3.free_wordカラムを追加する 4.登録・更新イベントをディスパッチする処理を追加する 5.Artisanコマンドを作成する 6.作成したArtisanコマンドを実行。  free_wordカラムにデータを投入する 事前準備 docker-compose up -d docker-compose exec app bash composer install composer update cp .env.example .env php artisan key:generate php artisan storage:link chmod -R 777 storage bootstrap/cache Laravel + Ngram + Observerを利用した全文検索機能の実装ハンズオン 1.既存のDDLからfree_wordカラムを削除する 変更用のmigrationファイルを生成します php artisan make:migration change_free_word_to_shops --table=shops migrationを定義 backend/database/migrations/2022_01_06_185439_change_free_word_to_shops.php class ChangeFreeWordToShops extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('shops', function (Blueprint $table) { $table->dropColumn('free_word'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('shops', function (Blueprint $table) { DB::statement("ALTER TABLE shops ADD free_word TEXT as (concat(IFNULL(age, ''), ' ',IFNULL(name, ''), ' ',(case gender_id when 1 then '男性' when 2 then '女性' else '' end), ' ')) STORED"); }); } migrationを実行する php artisan migrate DDLを確認し,shopsテーブルにfree_wordカラムがなければOKです ngram-docker-laravel docker-compose exec db bash mysql -u root -p Enter password: password mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | laravel_local | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.01 sec) mysql> use laravel_local; mysql> show tables; +-------------------------+ | Tables_in_laravel_local | +-------------------------+ | failed_jobs | | migrations | | password_resets | | personal_access_tokens | | shops | | users | +-------------------------+ 6 rows in set (0.00 sec) DESC shops; +------------+-----------------+------+-----+-------------------+-----------------------------------------------+ | Field | Type | Null | Key | Default | Extra | +------------+-----------------+------+-----+-------------------+-----------------------------------------------+ | id | bigint unsigned | NO | PRI | NULL | auto_increment | | name | varchar(255) | NO | | NULL | | | age | int unsigned | NO | | NULL | | | gender_id | smallint | NO | | NULL | | | created_at | timestamp | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED | | updated_at | timestamp | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP | +------------+-----------------+------+-----+-------------------+-----------------------------------------------+ 6 rows in set (0.01 sec) 2.ダミーデータを投入する 実行するSeedファイル backend/database/seeders/DummyShopsSeeder.php <?php namespace Database\Seeders; use App\Models\Shop; use Illuminate\Database\Seeder; class DummyShopsSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { $data = [ [ 'name' => 'サンプル太郎', 'age' => 25, 'gender_id' => 1 ], [ 'name' => 'サンプル花子', 'age' => 30, 'gender_id' => 2 ], [ 'name' => 'サンプル二郎', 'age' => 20, 'gender_id' => 1 ], ]; (new Shop())->query()->insert($data); } } Seedファイルを実行 php artisan db:seed --class=DummyShopsSeeder Seed結果を確認し登録できていれば成功です mysql> select * from shops; +----+--------------------+-----+-----------+---------------------+---------------------+ | id | name | age | gender_id | created_at | updated_at | +----+--------------------+-----+-----------+---------------------+---------------------+ | 1 | サンプル太郎 | 25 | 1 | 2022-01-07 04:19:43 | 2022-01-07 04:19:43 | | 2 | サンプル花子 | 30 | 2 | 2022-01-07 04:19:43 | 2022-01-07 04:19:43 | | 3 | サンプル二郎 | 20 | 1 | 2022-01-07 04:19:43 | 2022-01-07 04:19:43 | +----+--------------------+-----+-----------+---------------------+---------------------+ 3 rows in set (0.01 sec) 3.free_wordカラムを追加する 再度free_wordカラムを追加するmigrationを作成します php artisan make:migration add_free_word_column_to_shops --table=shops migrationファイルを定義します backend/database/migrations/2022_01_07_162519_add_free_word_column_to_shops.php class AddFreeWordColumnToShops extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('shops', function (Blueprint $table) { DB::statement("ALTER TABLE shops ADD free_word TEXT"); DB::statement("ALTER TABLE shops ADD FULLTEXT index ftx_free_word (free_word) with parser ngram"); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('shops', function (Blueprint $table) { $table->dropColumn('free_word'); }); } } migrationを実行する php artisan migrate DDLを確認しshopsテーブルにfree_wordカラムが追加されていればOKです ngram-docker-laravel docker-compose exec db bash mysql -u root -p Enter password: password mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | laravel_local | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.01 sec) mysql> use laravel_local; mysql> show tables; +-------------------------+ | Tables_in_laravel_local | +-------------------------+ | failed_jobs | | migrations | | password_resets | | personal_access_tokens | | shops | | users | +-------------------------+ 6 rows in set (0.00 sec) mysql> select * from shops; +----+--------------------+-----+-----------+---------------------+---------------------+-----------+ | id | name | age | gender_id | created_at | updated_at | free_word | +----+--------------------+-----+-----------+---------------------+---------------------+-----------+ | 1 | サンプル太郎 | 25 | 1 | 2022-01-08 01:54:17 | 2022-01-08 01:54:17 | NULL | | 2 | サンプル花子 | 30 | 2 | 2022-01-08 01:54:17 | 2022-01-08 01:54:17 | NULL | | 3 | サンプル二郎 | 20 | 1 | 2022-01-08 01:54:17 | 2022-01-08 01:54:17 | NULL | +----+--------------------+-----+-----------+---------------------+---------------------+-----------+ 4.登録・更新イベントをディスパッチする処理を追加する さて,ここまでで全文検索用のカラムの作成が完了しました。 ですが見ての通りfree_wordカラムはNULLなのでこれでは全文検索ができません。 そこで、登録・更新イベントをディスパッチして自動的にfree_wordカラムに追加する値を生成していきます オブザーバーを作成します php artisan make:observer ShopObserver --model=Shop オブサーバーを定義 <?php namespace App\Observers; use App\Models\Shop; class ShopObserver { /** * save()イベントを検知する * @param Shop $shop * @return void */ public function saved(Shop $shop) { $collect = collect($shop); $id = $collect->get('id'); $name = $collect->get('name'); $age = $collect->get('age'); $genderId = $collect->get('gender_id'); if (!is_null($genderId)) { $gender = (int)$genderId === 1 ? '男性' : '女性'; } else { $gender = null; } $freeWord = $age . ' ' . $id . ' ' . $name . ' ' . $gender; $data = [ 'id' => $id, 'name' => $name, 'age' => $age, 'gender_id' => $genderId, 'free_word' => $freeWord, ]; (Shop::query()->where('id', $id))->update($data); } } オブサーバーを登録 backend/app/Providers/EventServiceProvider.php class EventServiceProvider extends ServiceProvider { /** * The event listener mappings for the application. * * @var array<class-string, array<int, class-string>> */ protected $listen = [ Registered::class => [ SendEmailVerificationNotification::class, ], ]; /** * Register any events for your application. * * @return void */ public function boot() { Shop::observe(ShopObserver::class); } } 5.Artisanコマンドを作成する コマンド生成 php artisan make:command UpdateFreeWordByShop コマンド定義 class UpdateFreeWordByShop extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'update:free-word-by-shop'; /** * The console command description. * * @var string */ protected $description = 'shopsテーブルのfree_wordを登録するコマンド'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return void */ public function handle() { $updateTarget = Shop::query()->pluck('id'); foreach ($updateTarget as $id) { $target = Shop::find($id); $result = $target->save(); if (!$result) { echo "店ID:{$id}の登録中にエラーが発生しました。終了します\n"; exit(); } echo "{$id}完了\n"; } echo "処理完了。終了します。\n"; exit(); } } 6.作成したArtisanコマンドを実行してfree_wordカラムにデータを投入する 作成したコマンドが登録されていることを確認 php artisan update update:free-word-by-shop shopsテーブルのfree_wordを登録するコマンド コマンドを実行する php artisan update:free-word-by-shop 1完了 2完了 3完了 処理完了。終了します。 free_wordにデータが登録されているかを確認 free_wordに値が登録されていれば成功です! mysql> select * from shops; +----+--------------------+-----+-----------+---------------------+---------------------+--------------------------------+ | id | name | age | gender_id | created_at | updated_at | free_word | +----+--------------------+-----+-----------+---------------------+---------------------+--------------------------------+ | 1 | サンプル太郎 | 25 | 1 | 2022-01-08 01:54:17 | 2022-01-07 19:25:39 | 25 1 サンプル太郎 男性 | | 2 | サンプル花子 | 30 | 2 | 2022-01-08 01:54:17 | 2022-01-07 19:25:39 | 30 2 サンプル花子 女性 | | 3 | サンプル二郎 | 20 | 1 | 2022-01-08 01:54:17 | 2022-01-07 19:25:39 | 20 3 サンプル二郎 男性 | +----+--------------------+-----+-----------+---------------------+---------------------+--------------------------------+ 3 rows in set (0.00 sec) おわりに 読んでいただきありがとうございます。 今回の記事はいかがでしたか? ・こういう記事が読みたい ・こういうところが良かった ・こうした方が良いのではないか などなど、率直なご意見を募集しております。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel備忘録

はじめに Laravelのプロジェクトを作成するにあたって毎度実行することは変わらないが、覚えるのが大変なものを備忘録としてまとめ上げた。 目次 プロジェクト初期設定 migrationファイル作成 Herokuデプロイ プロジェクト初期設定 Laravelプロジェクトを作成 composer create-project laravel/laravel --prefer-dist プロジェクト名 サーバーを起動 cd プロジェクト名 php artisan serve Bootstrapのダウンロード & Login関連の見た目を作る composer require laravel/ui npm install npm run dev npm run dev php artisan ui bootstrap --auth モデルの作成 php artisan make:model モデル名(1文字目大文字&単数形) -m php artisan migrate 再度内容を修正したい場合 php artisan migrate:fresh migrationファイル作成 構造 up関数 migrateしたときに実行されたい部分を記述 down関数 rollbackしたときに実行されたいコードを記述 データ型 自動増分 increments(‘id’) … 符号なしINTを使用した自動増分ID(主キー) bigIncrements(‘id’) … 符号なしINTを使った自動増分ID(主キー)。 unsignedBigInteger(‘id’) … 符号なしBIGINTを使用した自動増分ID(主キー) 数字 integer(‘カラム名’) … 数値データカラム bigInteger(‘カラム名’)… 数値ビッグデータカラム double(‘カラム名’, 桁数, 小数点以下桁数) … 小数カラム 日付 date(‘カラム名’) … 日付カラム(日付のみ) time(‘カラム名’) … 時間カラム(時間のみ) dateTime(カラム名) … 日時カラム timestamp(‘カラム名’) … TIMESTAMPカラム timestamps() … created_atとupdate_atカラム nullableTimestamps() … NULL値を許すtimestamps() softDeletes() … 論理削除のためのNULL値可能な deleted_at カラム追加 文字 char(‘カラム名’, 長さ) … 長さを指定する文字列カラム string(‘カラム名’, ['長さ']) … VARCHARカラム。第2引数で長さ指定も可、デフォルト255文字。 text(‘カラム名’) … TEXTカラム longtext('カラム名') … LONGTEXTカラム その他 binary(‘カラム名’) … バイナリデータカラム boolean(‘カラム名’) … 真偽値カラム enum(‘カラム名’, [‘定数’, ‘定数’]) … ENUMカラム json(‘カラム名’) … JSONフィールドカラム Herokuデプロイ Heroku App作成 ログインし、右上 NewからCreate New Appを選択 App Nameを入力 → Create Appを選択 settings→BuildpacksにNode.jsとPHPを追加 DB登録 Resources→Add-onsにJawsDB MySQLと入力 Submit Order Formを押す ターミナルでプロジェクト内まで移動 heroku git:remote -a [Herokuアプリ名]を実行 set git remote heroku to https://git.heroku.com/[Herokuアプリ名].gitを実行 git push heroku masterを実行(この時点で一度デプロイが完了する) heroku configを実行し、JAWSDB_URLを取得 書式:mysql://[DB_USERNAME]:[DB_PASSWORD]@[DB_HOST]:[DB_PORT]/[DB_DATABASE] settings→Config VarsのReveal Config Varsを押し、上の情報をそれぞれ入力 同じ場所にAPP_KEY(.env.exampleに表記あり)とAPP_URL(Heroku画面右上のOpen Appで開くデフォルトURL)も追加 メールを使用している場合はその情報も入れる ファイル準備 .env.exampleファイルを複製し、アプリファイル直下に.env.herokuファイルを作成 & 内容をDB登録の内容と合わせる composer.jsonファイルの"scripts"に以下を追加 "compile": [ "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" ] アプリファイル直下にProcfileを作成し、中身にweb: vendor/bin/heroku-php-apache2 public/を追加 アプリファイル直下に.htaccessファイルを作成、中身に以下を入れる <IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews </IfModule> RewriteEngine On RewriteCond %{REQUEST_FILENAME} -d [OR] RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^ ^$1 [N] RewriteCond %{REQUEST_URI} (\.\w+$) [NC] RewriteRule ^(.*)$ public/$1 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ server.php </IfModule> app/Providers/AppServiceProvider.phpのboot関数に以下の記述を追加 Paginator::useBootstrap(); Schema::defaultStringLength(191); if (request()->isSecure()) { \URL::forceScheme('https'); } app/Providers/RouteServiceProvider.phpのpublic const HOMEを/home→/に変更 app\Http\Middleware\TrustedProxiesのprotected $proxies直後に= "*"追加 GitHub Auto Deploy設定 Heroku画面のDeploy→Deployment methodでGitHubを選択 GitHubのリポジトリーを選択 Enable Automatic Deploysを選択 migration heroku run php artisan migrate デプロイ方法 ファイルを編集 GitHubにpushする もしくは Heroku画面からDeploy→GitHub→Deploy Branchを選択
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel 起動時の "No input file specified." を解決する

開発環境 ・windows10 ・virtual box 6.1.22 ・Vagrant 2.2.9 (最新版だとうまくいかなかったのでどちらもバージョンを下げています。) 環境構築はLaravel公式ページを参考にしました。 1 Homestead.yamlファイルの確認 yamlファイルの to: が以下のようになっていることを確認します。 sites: - map: homestead.test to: /home/vagrant/code/{自分のアプリ名}/public ※公式サイトの手順通りに環境構築した場合以下のようになっているので注意が必要です。 sites: - map: homestead.test to: /home/vagrant/code/public  <---ここがダメ 2 vagrant up --provision の実行 vagrant up または vagrant reload を実行してもうまくいかない。 再起動するだけではだめで プロビジョニングすることで編集したファイルの修正を行ってくれるみたいです。 vagrant up --provision を実行することでLaravelが表示されました! Laravelの環境構築に2日かかってしまいました。 社会人1年目貪欲に頑張ります。 参考文献 HomesteadでLaravel起動時の「No input file specified.」の対処法
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む