20210911のlaravelに関する記事は10件です。

Laravel8でバリデーションを日本語化

はじめに  Laravelはログイン機能を簡単に作ることが出来ますが、デフォルトではバリデーションメッセージが英語になっています。日本語に変更することもできますので備忘録として残していきます。 日本語化の手順  Laravelのメッセージファイルはresources/lang/enにあります。enなので英語ですね。ファイルの中身を見てみるとこんな感じです。 resources/lang/en/validation.php <?php return [ /* |-------------------------------------------------------------------------- | Validation Language Lines |-------------------------------------------------------------------------- | | The following language lines contain the default error messages used by | the validator class. Some of these rules have multiple versions such | as the size rules. Feel free to tweak each of these messages here. | */ 'accepted' => 'The :attribute must be accepted.', 'accepted_if' => 'The :attribute must be accepted when :other is :value.', 'active_url' => 'The :attribute is not a valid URL.', 'after' => 'The :attribute must be a date after :date.', 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', 'alpha' => 'The :attribute must only contain letters.', 'alpha_dash' => 'The :attribute must only contain letters, numbers, dashes and underscores.', 'alpha_num' => 'The :attribute must only contain letters and numbers.', 'array' => 'The :attribute must be an array.', 'before' => 'The :attribute must be a date before :date.', 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', 'between' => [ 'numeric' => 'The :attribute must be between :min and :max.', 'file' => 'The :attribute must be between :min and :max kilobytes.', 'string' => 'The :attribute must be between :min and :max characters.', 'array' => 'The :attribute must have between :min and :max items.', ], 'boolean' => 'The :attribute field must be true or false.', 'confirmed' => 'The :attribute confirmation does not match.', 'current_password' => 'The password is incorrect.', 'date' => 'The :attribute is not a valid date.', 'date_equals' => 'The :attribute must be a date equal to :date.', 'date_format' => 'The :attribute does not match the format :format.', 'different' => 'The :attribute and :other must be different.', 'digits' => 'The :attribute must be :digits digits.', 'digits_between' => 'The :attribute must be between :min and :max digits.', 'dimensions' => 'The :attribute has invalid image dimensions.', 'distinct' => 'The :attribute field has a duplicate value.', 'email' => 'The :attribute must be a valid email address.', 'ends_with' => 'The :attribute must end with one of the following: :values.', 'exists' => 'The selected :attribute is invalid.', 'file' => 'The :attribute must be a file.', 'filled' => 'The :attribute field must have a value.', 'gt' => [ 'numeric' => 'The :attribute must be greater than :value.', 'file' => 'The :attribute must be greater than :value kilobytes.', 'string' => 'The :attribute must be greater than :value characters.', 'array' => 'The :attribute must have more than :value items.', ], 'gte' => [ 'numeric' => 'The :attribute must be greater than or equal :value.', 'file' => 'The :attribute must be greater than or equal :value kilobytes.', 'string' => 'The :attribute must be greater than or equal :value characters.', 'array' => 'The :attribute must have :value items or more.', ], 'image' => 'The :attribute must be an image.', 'in' => 'The selected :attribute is invalid.', 'in_array' => 'The :attribute field does not exist in :other.', 'integer' => 'The :attribute must be an integer.', 'ip' => 'The :attribute must be a valid IP address.', 'ipv4' => 'The :attribute must be a valid IPv4 address.', 'ipv6' => 'The :attribute must be a valid IPv6 address.', 'json' => 'The :attribute must be a valid JSON string.', 'lt' => [ 'numeric' => 'The :attribute must be less than :value.', 'file' => 'The :attribute must be less than :value kilobytes.', 'string' => 'The :attribute must be less than :value characters.', 'array' => 'The :attribute must have less than :value items.', ], 'lte' => [ 'numeric' => 'The :attribute must be less than or equal :value.', 'file' => 'The :attribute must be less than or equal :value kilobytes.', 'string' => 'The :attribute must be less than or equal :value characters.', 'array' => 'The :attribute must not have more than :value items.', ], 'max' => [ 'numeric' => 'The :attribute must not be greater than :max.', 'file' => 'The :attribute must not be greater than :max kilobytes.', 'string' => 'The :attribute must not be greater than :max characters.', 'array' => 'The :attribute must not have more than :max items.', ], 'mimes' => 'The :attribute must be a file of type: :values.', 'mimetypes' => 'The :attribute must be a file of type: :values.', 'min' => [ 'numeric' => 'The :attribute must be at least :min.', 'file' => 'The :attribute must be at least :min kilobytes.', 'string' => 'The :attribute must be at least :min characters.', 'array' => 'The :attribute must have at least :min items.', ], 'multiple_of' => 'The :attribute must be a multiple of :value.', 'not_in' => 'The selected :attribute is invalid.', 'not_regex' => 'The :attribute format is invalid.', 'numeric' => 'The :attribute must be a number.', 'password' => 'The password is incorrect.', 'present' => 'The :attribute field must be present.', 'regex' => 'The :attribute format is invalid.', 'required' => 'The :attribute field is required.', 'required_if' => 'The :attribute field is required when :other is :value.', 'required_unless' => 'The :attribute field is required unless :other is in :values.', 'required_with' => 'The :attribute field is required when :values is present.', 'required_with_all' => 'The :attribute field is required when :values are present.', 'required_without' => 'The :attribute field is required when :values is not present.', 'required_without_all' => 'The :attribute field is required when none of :values are present.', 'prohibited' => 'The :attribute field is prohibited.', 'prohibited_if' => 'The :attribute field is prohibited when :other is :value.', 'prohibited_unless' => 'The :attribute field is prohibited unless :other is in :values.', 'prohibits' => 'The :attribute field prohibits :other from being present.', 'same' => 'The :attribute and :other must match.', 'size' => [ 'numeric' => 'The :attribute must be :size.', 'file' => 'The :attribute must be :size kilobytes.', 'string' => 'The :attribute must be :size characters.', 'array' => 'The :attribute must contain :size items.', ], 'starts_with' => 'The :attribute must start with one of the following: :values.', 'string' => 'The :attribute must be a string.', 'timezone' => 'The :attribute must be a valid timezone.', 'unique' => 'The :attribute has already been taken.', 'uploaded' => 'The :attribute failed to upload.', 'url' => 'The :attribute must be a valid URL.', 'uuid' => 'The :attribute must be a valid UUID.', /* |-------------------------------------------------------------------------- | Custom Validation Language Lines |-------------------------------------------------------------------------- | | Here you may specify custom validation messages for attributes using the | convention "attribute.rule" to name the lines. This makes it quick to | specify a specific custom language line for a given attribute rule. | */ 'custom' => [ 'attribute-name' => [ 'rule-name' => 'custom-message', ], ], /* |-------------------------------------------------------------------------- | Custom Validation Attributes |-------------------------------------------------------------------------- | | The following language lines are used to swap our attribute placeholder | with something more reader friendly such as "E-Mail Address" instead | of "email". This simply helps us make our message more expressive. | */ 'attributes' => [], ]; これを日本語に直していく必要があります。 まずはenディレクトリをコピーしてjaディレクトリを作りましょう。そしてja/validation.phpを書き換えていきます。 公式ホームページから日本語のメッセージをコピペできますので丸写ししましょう。 ちなみに、デフォルトではHTMLのinputタグにrequiredと書かれているので、消しておきましょう。 さて、これでバリデーションが日本語化できましたが、まだ少し中途半端です。 nameとかpasswordのように英語が残ってますね。これを変更するためには、validation.phpの最後の方にあるattributesを編集する必要があります。このようにしてみてください。 validation.php 'attributes' => [ 'name' => '名前', 'password' => 'パスワード' ], これで完全に日本語化することができました! まとめ  Laravelすごい!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel初心者によるLaravel Sailの導入

Laravel Sailという「LaravelをDocker開発環境で動作させるためのツール」を知ったので導入してみることにしました。 この記事は備忘録も兼ねています。 導入理由 docker-compose.yml書かなくていいらしいから。楽そう。 最近職場や自宅でdockerにLaravel環境を構築し勉強を始めました。 しかし、毎回docker-compose.ymlをネットで拾ってきて、勉強のためymlを編集しているので「ぼくのかんがえたさいきょうのdocker-compose.yml」が何かわからない状態になっています。 今回もymlを探していて、その時にLaravel Sailというものを知り、基本的な機能が提供されているので、あれこれ困らずにLaravelをDocker開発環境で構築できそうと思い、導入に至りました。 環境 macOS (WindowsでもMacでもLaravel Sailの導入は可能です。 自宅環境がmacOSなので、それに準じた記事になっています) 参考サイト Laravelの公式サイトなので、これが一次ソースになると思います。 https://readouble.com/laravel/8.x/ja/installation.html 導入の流れ Laravelプロジェクトを作成 curl -s "https://laravel.build/example-app" | bash example-appがプロジェクト名なので、任意の名前に変更しましょう。 下記のようにwith指定をすると、利用するサービスを選択できるようです。 curl -s "https://laravel.build/example-app?with=mysql,redis" | bash とりあえず指定なしのcurl -s "https://laravel.build/example-app" | bashを入力するとインストール開始。 端末のパスワードの入力 インストールが終わる頃に端末のパスワードを求められるので、自分のパソコンに設定しているパスワードを入力するようです。 https://qiita.com/kai_kou/items/0e773aaf50698dd5a93f パスワードの入力をし、インストールが終わると下記が表示されました。 Thank you! We hope you build something incredible. Dive in with: cd simple-memo-app && ./vendor/bin/sail up アプリケーションディレクトリに移動してLaravel Sailを起動 インストール終わりに表示されたコマンドを入力。公式ページにも記載されているので、このコマンドで間違いない。 cd example-app && ./vendor/bin/sail up エラー関係 zsh: no such file or directory: ./vendor/bin/sail cd example-app && ./vendor/bin/sail up で発生 ./vendor/bin/sailが無いようです zsh: no such file or directory: ./vendor/bin/sail https://teratail.com/questions/347252 この記事を参考にし、以下のように試そうとしました。 $ composer require laravel/sail --dev $ php artisan sail:install $ ./vendor/bin/sail up すると、zsh: command not found: composerが発生 zsh: command not found: composer composerがインストールされていないようなので、下記サイトを参考にインストールを試みます。 https://code-graffiti.com/install-comporser-on-mac/ cd ~ curl -sS https://getcomposer.org/installer | php sudo mv composer.phar /usr/local/bin/composer composer -Vでバージョンが出れば成功です。 そして再度example-appフォルダからcomposer require laravel/sail --devから行えばいけました。 php artisan sail:installに何をインストールするか聞かれたので、とりあえずmysqlにしておきました。 エラーが解決したので次に進みます。 ./vendor/bin/sail up をするとコンテナが起動しました。 ./vendor/bin/sail up -dの方が個人的に使いやすいです。 docker-compose up -dでも起動できました。 ./vendor/bin/sail downがコンテナの停止コマンドです。 http://localhostにブラウザでアクセスすると、Laravelの初期画面が表示され・・・ エラー関係 ませんでした。 http://localhostにアクセスすると下記画像のようなエラーが出ました。 ちょっとぐぐるとkeyがないということで、Generate App key(赤枠で囲ったところ)を押してみると、今度はreflash showになったので、そこをクリックすると無事にLaravelが立ち上がりました。 エイリアスの作成 下記のように打って起動できるようにします。 % cd example-app % sail up -d vimの編集 % vim ~/.zshrc 一番下に追記 % alias sail='bash vendor/bin/sail' 設定を反映 % source ~/.zshrc 慣れれば2〜3コマンドで立ち上がりそうなので、爆速っぽいです。 コンテナへの入り方 % sail shell メモ: Node.jsとnpmのインストール npmとは、「Node Package Manager」の略で、Node.jsのパッケージを管理するためのシステム。 下記コマンドを打つとバージョンが表示されたので、既にインストールされていました。 sail node -v sail npm -v
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSにデプロイ後、Vueファイルの更新が反映されない時の対処法

EC2内のvueファイルを更新しても、ブラウザに反映されない。 既にAWSにデプロイ済みのLaravelで作成したプロダクトについて、git pullで変更点をEC2に持って来た際に、ファイル内のコードは変更が反映されているのに、ブラウザで見ると反映されない事態が発生しました。 phpのファイルは問題なく変更が反映されているのに、なぜvueは反映されないのか。 ローカルで確認すると、期待通りに表示できています。 結論 app.jsの中身が更新できていませんでした。 よくよく確認するとmargeが前後した関係で、app.jsが古い状態になっていました。 レアケースかもしれませんが、一応シェアしておきます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【実務で使えるLaravel】seederでデータベースにダミーデータを投入しよう

この記事では、実際の実務で使っている方法でLaravelのseederを使って、データを投入する流れを説明します。 【開発環境】 Docker 20.10.7 PHP 7.4.22 Laravel 8.53.1 mySQL 5.7 データベースのツール phpmyadmin seederとは seederとは日本語に訳すと「種をまく」となります。つまり、データにタネをまく=データを投入すると言い換えられます。 開発現場では、開発中にいちいちデータベースを操作してデータを1件ずつ投入するのは面倒です。 シーダーを使えば、事前に定義しておいたダミーデータをコマンド一発でデータベースに投入できます。 実際の流れ 実際にseederを活用してデータベースにダミーデータを投入する 今回は、本を管理するアプリを想定します。 ダミーデータとして、users,books,categoriesテーブルにデータを投入します。 $ php artisan make:seeder initBooksSeeder database>seeders>initBooksSeederが作成されます。 試しにusersのダミーデータを投入してみましょう。 database>seeders>initBooksSeeder.php <?php namespace Database\Seeders; use Illuminate\Database\Seeder; use Illuminate\Support\Facades\DB; //追加 use Illuminate\Support\Str; //追加 use Illuminate\Support\Facades\Hash; //追加 class initBooksSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { DB::table('users')->insert([ 'user_name' => Str::random(10), 'email' => Str::random(10).'@gmail.com', 'password' => Hash::make('password'), ]); } } 編集できたら、以下を実行してダミーデータを投入する。 $ php artisan db:seed --class=initBooksSeeder データベースを確認すると、データが1件登録されているのが確認できますね。 usersテーブルにデータが登録できることがわかったので、users,books,categoriesテーブルにデータを投入していきましょう。 以下のコマンドを実行すると、すべてのテーブルが削除され、すべてのマイグレーションが再実行されます。このコマンドは、データベースを完全に再構築するのに役立ちます。 $ php artisan migrate:fresh --seed これでデータベースのデータは綺麗さっぱりなくなり、テーブルには何もデータがない状態にできました。 users,categories,bookテーブルにデータを3件ずつ投入するように私は実装してみました。 database>seeders>initBooksSeeder.php <?php namespace Database\Seeders; use Illuminate\Database\Seeder; use Illuminate\Support\Facades\DB; //追加 use Illuminate\Support\Str; //追加 use Illuminate\Support\Facades\Hash; //追加 class initBooksSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { DB::table('users')->insert([ [ 'user_name' => Str::random(10), 'email' => Str::random(10).'@gmail.com', 'password' => Hash::make('password'), ], [ 'user_name' => Str::random(10), 'email' => Str::random(10).'@gmail.com', 'password' => Hash::make('password'), ], [ 'user_name' => Str::random(10), 'email' => Str::random(10).'@gmail.com', 'password' => Hash::make('password'), ], ]); DB::table('categories')->insert([ [ 'user_id' => 1, 'category_name' => Str::random(10), ], [ 'user_id' => 2, 'category_name' => Str::random(10), ], [ 'user_id' => 3, 'category_name' => Str::random(10), ], ]); DB::table('books')->insert([ [ 'user_id' => 1, 'category_id' => 1, 'book_name' => Str::random(5), ], [ 'user_id' => 1, 'category_id' => 1, 'book_name' => Str::random(5), ], [ 'user_id' => 1, 'category_id' => 1, 'book_name' => Str::random(5), ], ]); } } $ php artisan db:seed --class=initBooksSeeder 上記を実行すれば、データが3件ずつ投入されているのが確認できます。 エンジニア・フリーランスにおすすめの転職サイト↓ https://www.kamome-susume.com/enginner-job-change-site/
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】マイグレーションで外部キーを設定する場合の注意事項

マイグレーションでよく失敗する、 カラムの型問題 マイグレーションファイルの実行順問題 についてまとめておきます。 カラムの型問題 外部キーを設定する場合は、参照先のカラムと同じ型にする必要があります。 一般に、プライマリーキーには以下のようにincrementsを指定しますが、これは自動的にunsigned int型のカラムを生成します。 migrationファイル $table->increments('id'); よって、外部キーを設定する際にもunsigned型を指定する必要があります。 ※以下のどちらでも可。 migrationファイル //方法1 $table->integer('user_id')->unsigned() //方法2 $table->unsignedInteger('user_id'); //共通 $table->foreign('user_id') ->references('id')->on('users') ->onDelete('cascade');      //親テーブルで行削除された場合、子テーブルの対応する行も削除する マイグレーションファイルの実行順問題 外部キー参照先のマイグレーションファイルが実行されていない状態で、外部キーを設定したマイグレーションファイルが実行されると、参照するテーブルがないとエラーを返される。 SQLSTATE[42000]: Syntax error or access violation: 1072 Key column 'medium_id' doesn't exist in table (SQL: alter table `teaching_materials` add constraint `teaching_materials_medium_id_foreign` foreign key (`medium_id`) references `media` (`id`)) マイグレーションはファイルを作成した順(ファイル名になっている作成日時順)に実行される。 例えば、postsテーブルの外部キー参照先にusersテーブルを設定したい場合は、usersマイグレーションの作成後にpostsのマイグレーションファイルを作成し、マイグレーションを実行する。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ネストしたwithでリレーション先の情報取得するカラムを指定する方法

Laravelが提供するリレーションでは、withメソッドを使うことでJOINを使うことなく関係するテーブルに情報を取得できます。 withの基本の使い方 // 商品情報を出品ユーザー情報と一緒に取得する $products = Product::with('user'); withでのカラム指定 withを使う時は、.の後にカラムを記述することで、取得するカラムだけを指定することができます。 うっかり出品者のメアドやパスワードもレスポンスに含めてしまわないようにするためにも基本設定した方がいいですね。 (画面に表示してなくても、デベロッパーツールでレスポンスの見方を知ってる人には筒抜け) // 商品情報を出品ユーザー情報(名前のみ)を取得する // リレーション参照のために、参照カラム(idやproduct_idなど)を含める必要あり $products = Product::with('user.id,name'); withでネストリレーション 商品情報とユーザー情報、さらにユーザーの画像情報(正規化して別テーブルに保存されている)と一緒に取得したい時は、ネストしたリレーションで取得することができます。 公式リファレンス:ネストしたEagerロード // 商品情報を出品ユーザー情報と一緒に取得する $products = Product::with('user.image'); ネストされたwithを使いつつ、参照カラムを指定する ・カテゴリーをメインに商品情報を参照 ・さらに商品の出品者情報(usersテーブル)も参照したい ・usersテーブルにはemailなどのプライベートな情報があるので、カラム指定で取得するようにしたい このパターンでは下記のように書く必要があります。 // OK $categories = Category::with('products', function($products) { // ユーザーの画像URLを取得 $products->with('user:id,name'); }); *ちゃんと確認してはいませんが、少なくとも5.8系以降では使用可能 ちなみに、↓のように書くとエラーになります。 // NG $categories = Category::with('product.user:id,name'); withは便利ですが、不要なカラムは参照しないというセオリーを忘れずに使っていかなきゃですね!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelでVue.jsのチラつきをv-cloakを使わずに防止する方法

背景 Vue.jsのチラつきとは Vue.jsの「マスタッシュ表記({{ data }}のような表記)」や「v-if」などで表示を制御している場合、ページ読み込み直後に一瞬だけVueデータが反映される前のコードが表示されてしまうことがある。これを経験した人は少なくないと思う。 v-cloakでの対策と問題点 このチラつきの解決策をネットで検索すると、「v-cloakを使いましょう」という記事が出てきて、下記のようなサンプルコードを提案される。 index.html <!DOCTYPE html> <html lang="ja"> <head> <style type="text/css"> [v-cloak] { display: none; } </style> </head> <body> <div id="app" v-cloak> <p>{{ message }}</p> </div> <script type="text/javascript"> new Vue({ el: '#app', data: { message: "メッセージ", }, }); </script> </body> </html> ただの html や php 環境ならこの方法で解決できる。しかし、Laravel の blade で Vue.js を使用している場合、この方法では解決しないことがある。 (条件や原因を特定できていないので、もし知っている人はコメントいただけるとありがたいです。) v-cloakを使わない解決方法 サンプルコード v-cloakと同様の処理を下記サンプルコードのように自作してしまえば解決できる。 index.blade.php <!DOCTYPE html> <html lang="ja"> <head> </head> <body> <div id="app" style="display:none"><!-- (1)html読み込み時はcssで非表示 --> <p>@{{ message }}</p> </div> <script type="text/javascript"> new Vue({ el: '#app', data: { message: "メッセージ", }, mounted: function () { const targetElement = this.$el; this.$el.style.display='block'; // (2)vueマウント完了後に表示させる }, }); </script> </body> </html> 解説 まず、Vueの制御対象のコンテンツ全体を「style="display:none"」で非表示にしておく。こうすることで、Vueと連動する部分はページ読み込み直後であっても表示されない。 Vueインスタンスが生成され、エレメントのマウントが完了後(=Vueインスタンスのデータがhtmlコード側に反映された後)に、非表示を解除する。 同様の問題で困っている人の参考になれば幸いです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】Non-static method <メソッド名> should not be called staticallyの解決方法

事象 以下のようにメソッドを呼び出したときに発生します。 class Item extends Model { public function getItems() { // 取得処理 class ItemController extends Controller { public function index(Request $request) { $items = Item::getItems(); // Error > Non-static method App\Models\Item::getItems() should not be called statically 原因 エラーメッセージを訳すと「非静的メソッドApp\Models\Item::getItems()は静的に呼び出されるべきではありません」になります。 原因はそのままでgetItemsは非静的メソッドなので、静的な呼び出しを行なってはならない、ということになります。 「静的」とは? クラスのメソッドを静的として宣言すると、クラスのインスタンス化を必要とせずにそれらにアクセスできるようになります。 「静的な呼び出し」とは? クラス名::メソッド名()のような書き方です。 静的呼び出しではItemクラスのインスタンスを作成せずにgetItemsメソッドを呼び出しています。 上記の例ではgetItemsは静的なメソッドとして定義されていないので、呼び出すにはインスタンスを生成する必要があります。それを静的呼び出し(インスタンスを生成せず呼び出す方法)で呼び出そうとしているので警告されているわけですね。 解決方法 1.インスタンスを生成し、インスタンスメソッドとして呼び出す getItemsは非静的メソッドなので静的な呼び出しを行ってはならない、ということだったのでインスタンスを作成して、インスタンスメソッドとして呼び出すようにします。 class ItemController extends Controller { public function index(Request $request) { $i = new Item(); // Itemクラスのインスタンスを生成 $items = $i->getItems(); //生成したItemインスタンスのgetItemsメソッドを呼び出す 2.静的メソッドに変更する getItemsは非静的メソッドなので静的な呼び出しを行ってはならない、ということだったのでgetItemsを静的メソッドに変更してあげます。 class Item extends Model { public static function getItems() // メソッド名にstaticキーワードを付けると静的メソッドになる { どちらを使えばいいのか? インスタンスメソッド インスタンスごとに異なる動作を期待する場合 静的メソッド いろんな場所で繰り返し同じ処理を呼びたい場合 呼び出す場所によって期待する動作が異ならない(常に同じものを返してほしい)場合 参考 Why I'm getting 'Non-static method should not be called statically' when invoking a method in a Eloquent model? PHPでなくC#ですが、静的メンバ―の説明がわかりやすかったので。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Spring Boot学習者が他言語のWebフレームワークを触ってみて気づいたこと

こんにちは。ワタナベトシヒロです。 私はJavaのWebアプリケーションフレームワークであるSpring Bootを学習してきましたが、今回は他の言語のフレームワークも触ってみました。 Spring Boot(Java)、Laravel(PHP)、Ruby on Rails、Django(Python)を比較して、気づいたことを挙げていきます。 ただし、Spring Boot以外のフレームワークでは簡単なCRUD処理のAPIを実装しただけなので、フレームワークへの深い理解はできていません。 Spring Bootの特徴 コマンドを入力する機会が少ない? Spring Bootのプロジェクト作成はWeb上で行ったり、IDEのGUI上で行うことが多いです。 また、LaravelやRailsではモデル作成やコントローラー作成用のコマンドがありますが、Spring Bootではコマンドを使ってファイルを作成する例は見たことがありません。 Spring Bootでは他のフレームワークと比べてCLIを操作する機会が少ない気がします。 DBのテーブルの作成はSQLで行う Laravel、Rails、Djangoにはマイグレーションという機能があり、SQLを書かなくてもDBのテーブルを作成できますが、Spring Bootではフレームワークの機能を使わずにSQLでテーブルを作成しておくのが一般的だと思います。 プロジェクト作成時に生成されるコード量が少ない 最初に作成されるjavaファイルは3つだけで、最低限の記述しかありません。 htmlファイルも用意されておらず、初期状態でアプリを起動してアクセスしても何も表示されないのはSpring Bootだけです。 ただし、ディレクトリの階層は深く、初期設定では無駄なディレクトリ構成に感じてしまいます。 Spring Bootはパッケージ数が多い大規模なアプリのために設計されているのかもしれません。 Laravel プロジェクト作成時に生成されるファイル数が多い Laravelはプロジェクト作成時点でファイル数が多く、ディレクトリ構成もしっかり決められています。 ↑ Spring Boot、Laravel、Rails、Djangoの4つの新規プロジェクトをまとめたGitリポジトリのコード割合です。BladeはLaravelのテンプレートエンジンなので、約7割がLaravel関連のコードで占められていることになります。 Ruby on Rails Windowsでの開発が難しい WindowsでRailsの開発をしようとすると、エラーに遭遇することが多く、特に環境構築で苦戦しました。 WindowsのWSL2という機能を使い、Linuxの仮想環境で環境構築をしてみましたが、それでもスムーズにいきませんでした。 (謎の警告が出たり、Rubyのインストール時に1時間以上インストール中と表示され続ける問題がありました) Django 同名のフォルダやファイルが多くなりがち? django-admin startproject <アプリ名>でDjangoプロジェクトを作成すると、<アプリ名>のフォルダが作成され、その中に同名の<アプリ名>のフォルダが作成されます。 また、__init__.pyやurls.pyなど、同名のファイルが複数作られることが多いですが、このように同名のフォルダやファイルが多いと紛らわしいのでは?と思いました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Faviconの実装方法(Laravel)

プログラミング初心者です。 やりたいこと 私なりにfaviconを実装した方法をご紹介していきます。 開発環境 PHP Laravel5.8 MAMP 1 faviconにしたい画像を決める 無料画像ダウンロードサイトで画像を選びました。 参考画像ダウンロードサイト ダウンロード形式はJPEGかPNGでいいと思います。 私は256か512サイズをダウンロードしました。 2 画像形式をicoに変更 形式がPNGやJPEGでも実装できるのですが、ブラウザによって(例:Edge)表示できない場合もあるそうです。 下記のサイトで形式の変更ができます。 私は16サイズにしました。 3 ターミナルで直接画像をダウンロード(Macのみ) ドロップして移動させる方法もありますが、環境によってできない状況に出くわしたので、ターミナルに直接画像をダウンロードしました。(Macのみ) publicディレクトリーに保存したいため移動します $ cd public Finderに保存している画像をダウンロード   大文字のオー $ curl -O サーバー上のファイル名で保存 サーバー上のファイル名というのは、http://~やhttps://~から始まるURLです。 Finder→ダウンロードしたい画像右クリック→情報→詳細情報:入手先: にURLが記載されています。 参考サイト 4 headタグ内に実装 publicディレクトリー内に画像がダウンロードできたか確認できたら、viewのheadタグ内に以下のコード記載します。 sample_blade.php <head> <link rel="icon" href="{{ asset('sample.ico') }}"> </head> hrefに画像パスを指定します。 今回はpublicディレクトリー内にあるため、assetメソッドを使用します。 asset('ファイルパス')はpublicディレクトリのパスを返すメソッドです。 補足 assetについて 通常はhttpの時はassetメソッド、httpsの時はsecure_assetメソッドを使うみたいですが、環境が変わるごとに書き換えるのは面倒ですよね。 http、httpsでもassetメソッドを使えるように設定ができます。 二つのファイルを以下のようにします。 TrustProxies.php protected $proxies = "**"; AppServiceProvide.php public function boot() { if (\App::environment('production')) { \URL::forceScheme('https'); } } または public function boot() { if (request()->isSecure()) { \URL::forceScheme('https'); } } 自分はこれでhttpでもhttpsでもassetメソッドが使えています。 参考記事:https://qiita.com/e_tyubo/items/c25df0c545b1af8494c7
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む