[{"data":1,"prerenderedAt":1057},["ShallowReactive",2],{"news-item-\u002Fja\u002Fnews\u002Ftinh-nang-moi-va-cach-nang-cap-version-tu-laravel-8-len-laravel-10":3},{"id":4,"title":5,"body":6,"category":1044,"created by":1045,"date":1046,"description":1047,"extension":1048,"meta":1049,"navigation":1050,"path":1051,"sections":1052,"seo":1053,"stem":1054,"thumbnail":1055,"__hash__":1056},"content_ja\u002Fja\u002Fnews\u002Ftinh-nang-moi-va-cach-nang-cap-version-tu-laravel-8-len-laravel-10.md","新機能とLaravel 8からLaravel 10へのアップグレード方法",{"type":7,"value":8,"toc":992},"minimark",[9,14,18,21,26,34,37,46,57,61,64,68,72,75,85,88,92,110,114,123,129,132,136,140,143,147,151,154,158,162,165,169,173,176,180,189,192,196,200,203,207,211,214,218,222,225,228,231,235,239,242,246,250,253,257,261,264,268,272,286,290,305,309,312,316,324,326,329,334,337,341,344,348,351,357,360,366,368,371,373,377,381,384,388,392,395,398,404,412,418,427,433,440,446,450,453,458,461,466,469,474,477,483,486,492,497,506,511,513,518,521,527,531,534,540,548,554,558,561,567,571,574,577,581,584,590,593,599,602,608,612,615,617,620,623,626,629,639,649,655,673,683,687,693,696,700,709,715,719,728,734,737,743,747,750,756,759,765,769,783,787,801,805,814,818,821,827,831,840,846,849,855,858,862,865,868,874,878,881,884,890,893,899,903,906,912,917,920,925,928,931,934,940,944],[10,11,13],"h2",{"id":12},"laravel-8のプロジェクトをなぜアップグレードするべきか","Laravel 8のプロジェクトをなぜアップグレードするべきか",[15,16,17],"p",{},"Laravelの新バージョンは毎年リリースされます。これらのリリースには多少の変更が含まれ、新しい機能が追加されたり、不要な機能が削除されたりします。そのため、早めにアップグレードを行わないと、アップグレードが困難で時間がかかる可能性があります。アップグレードが困難になる主な理由は、プロジェクトが成長し、関数やメソッドが相互に依存するようになることです。つまり、1つの機能を変更すると他の機能にも大きな影響を与える可能性があります。また、Laravel 10がリリースされた後は、Laravel 8のメンテナンスやサポートが終了するため、できるだけ早くアップグレードすることが重要です。",[15,19,20],{},"この記事の主な内容は、Laravel 10へのアップグレード方法を案内します。しかし、本記事では手動でのアップグレード方法を紹介しており、Laravel Shiftのような自動化ツールを使用する方法ではありません（このツールは有料です）。ご了承ください。",[22,23,25],"h1",{"id":24},"laravel-10の新機能の紹介","Laravel 10の新機能の紹介",[10,27,29,30],{"id":28},"_1-laravel-pennant","1. ",[31,32,33],"strong",{},"Laravel Pennant:",[15,35,36],{},"これはLaravel 10の新しいパッケージです。このパッケージはアプリケーションにfeature flagの機能を提供します。feature flagを使用することで、機能の使用可否を制御できます。具体的な例として、アプリケーションに「会議の予約」という機能があり、この機能は上司のみが利用可能です。つまり、この機能は「可用性」というプロパティを持っています。この機能の可用性を確認するために、以下のようにFeatureを宣言し、確認することができます。",[38,39],"img",{"className":40,"alt":43,"src":44,"style":45},[41,42],"block","mx-auto","","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F30160709\u002Flaravel-pennant-768x435.png","width: 80%;",[15,47,48,49,56],{},"このパッケージを使えるために、",[50,51,55],"a",{"href":52,"rel":53},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F10.x\u002Fpennant",[54],"nofollow","Laravel Pennant 資料","をご参照ください。",[10,58,60],{"id":59},"_2-process-interaction","2. Process Interaction:",[15,62,63],{},"Laravel 10は、アプリケーションの実行エンジンと対話するためのabstractionクラスを提供します。これは「process」と呼ばれています。具体的には、この機能により、コマンドを呼び出したり、テストを実行する際にfakeで呼び出したりすることができます。",[38,65],{"className":66,"alt":43,"src":67,"style":45},[41,42],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F30161252\u002Fprocess-call-768x375.png",[10,69,71],{"id":70},"_3-test-profiling","3. Test Profiling:",[15,73,74],{},"artisanで実行するテストコマンドには、新しいオプションパラメータが追加されました。それが --profile です。このオプションを指定すると、各テストファイルの実行時間がどれくらい遅いかまたは速いかを確認することができます。",[76,77,82],"pre",{"className":78,"code":80,"language":81},[79],"language-text","php artisan test --profile\n","text",[83,84,80],"code",{"__ignoreMap":43},[15,86,87],{},"--profile を渡した時のテスト実行結果：",[38,89],{"className":90,"alt":43,"src":91,"style":45},[41,42],"https:\u002F\u002Fuser-images.githubusercontent.com\u002F5457236\u002F217328439-d8d983ec-d0fc-4cde-93d9-ae5bccf5df14.png",[15,93,100,101,109],{"className":94},[95,96,97,98,99],"text-center","text-sm","text-black","italic","-mt-2","\n  (src:\n  ",[50,102,108],{"href":103,"target":104,"rel":105},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F10.x\u002Freleases#test-profiling","_blank",[106,107],"noopener","noreferrer","\n    https:\u002F\u002Flaravel.com\u002F\n  ","\n  )\n",[10,111,113],{"id":112},"_4-pest-scaffolding","4. Pest Scaffolding:",[15,115,116,117,122],{},"Pestは、PHPUnitによって提供されるPHPテストフレームワークです。LaravelはPestをサポートするようになりました。新しいプロジェクトを作成する際に、--pestオプションを指定することで、デフォルトで",[50,118,121],{"href":119,"rel":120},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F10.x\u002Freleases#pest-scaffolding",[54],"Pest test scaffolding","を選択することができます。",[76,124,127],{"className":125,"code":126,"language":81},[79],"laravel new example-application --pest\n",[83,128,126],{"__ignoreMap":43},[130,131],"hr",{},[22,133,135],{"id":134},"laravel-9の新機能の紹介","Laravel 9の新機能の紹介",[10,137,139],{"id":138},"_1-accessors-and-mutatorsは前より簡単になる","1. Accessors and Mutatorsは前より簡単になる",[15,141,142],{},"「Accessors and Mutators」は「getterとsetter」とも呼ばれます。伝統的には、getterやsetterを宣言する場合には、プロパティ名の前に「get」や「set」という接頭辞を付けます。この方法は廃止されず、新しいバージョンでも使用することができます。しかし、よりコンパクトでシンプルな方法が存在するため、以下の新しい方法を推奨します。",[38,144],{"className":145,"alt":43,"src":146,"style":45},[41,42],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F30162149\u002Fgetter-setter-declartion.png",[10,148,150],{"id":149},"_2-enum-attribute-casting","2. Enum Attribute Casting",[15,152,153],{},"PHP 8はenum宣言をサポートするようになりました。そのため、Laravel 9ではこの新機能も更新されます。さらに、enumを使用してEloquentモデルのプロパティをキャストすることもできるようになりました。 例えば、次のようにenumを宣言して使用できます。",[38,155],{"className":156,"alt":43,"src":157,"style":45},[41,42],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F30162343\u002Fenum-768x786.png",[10,159,161],{"id":160},"_3-route-bindings-と-enums","3. Route Bindings と Enums",[15,163,164],{},"この機能は、リクエストパラメータの値をenumにバインドします。つまり、事前にenumを宣言し、以下のようにバインドします。リクエスト時に、enumで宣言されていない値を渡すと、以前のようにコントローラーをチェックする代わりに、HTTP 404エラーが返されます。",[38,166],{"className":167,"alt":43,"src":168,"style":45},[41,42],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F30162513\u002Froute-enum-768x360.png",[10,170,172],{"id":171},"_4-forced-scoping-of-route-bindings","4. Forced Scoping Of Route Bindings",[15,174,175],{},"Laravelの以前のバージョンでは、以下のようにrouteを宣言することで、1つ目のモデルを参照するハンドラ関数に2つ目のEloquentモデルのスコープを渡すことができました。例えば、以下のroute宣言を参考にして、このポストは1つのユーザーに所属し、slugを使用してクエリを実行することができます。",[38,177],{"className":178,"alt":43,"src":179,"style":45},[41,42],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F30162851\u002Fscope-biding-1-768x195.png",[15,181,182,183,188],{},"上記のように宣言すると、Laravelは既存ルール (convention)に基づいて外部キー フィールド(foreign key)を自動的に特定します。 しかし、事前に:slugに",[50,184,187],{"href":185,"rel":186},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F10.x\u002Frouting#implicit-model-binding-scoping",[54],"custom key binding","を宣言する必要があります。そうしないと、渡された2番目のモデルをバインドする必要があることが分かりません。",[15,190,191],{},"しかし、新しいバージョンにscopeBinding()関数へ呼び出すのみでいいです。",[38,193],{"className":194,"alt":43,"src":195,"style":45},[41,42],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F30163001\u002Fscope-biding-2-1024x443.png",[10,197,199],{"id":198},"_5-controller-route-groups","5. Controller Route Groups",[15,201,202],{},"次のように、routeをcontrollerにグループ化することができるようになりました。",[38,204],{"className":205,"alt":43,"src":206,"style":45},[41,42],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F30163135\u002Fcontroller-route-gr-768x171.png",[10,208,210],{"id":209},"_6-full-text-indexes-where-clauses","6. Full Text Indexes \u002F Where Clauses",[15,212,213],{},"フルテキストクエリは、whereFullText()やorWhereFullText()などの新しい関数でサポートするようになりました。",[38,215],{"className":216,"alt":43,"src":217,"style":45},[41,42],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F30163247\u002Ffull-text-search.png",[10,219,221],{"id":220},"_7-laravel-scout-database-engine","7. Laravel Scout Database Engine",[15,223,224],{},"Scoutの主な目標は、全文検索エンジンを利用してアプリケーションの作業プロセスを簡素化することです。Scoutは、driver basedのアプローチで構築されています。つまり、ScoutのAPIを通じてのみ、Elasticsearch、Algolia、MeiliSearch、MySQL、PostgreSQLなど、さまざまなエンジンを使用することができます。",[15,226,227],{},"主なアイデアは、Eloquentモデルがsearch()関数を呼び出して全文検索を実行できることです。同時に、データベース内のデータを追加、削除、編集すると、当該のフルテキストエンジンにも自動的に同期されます。ただし、このsearch()関数は単純なクエリのみをサポートしているため、大規模なプロジェクトには適していませんが、小中規模のプロジェクトには適しています。",[15,229,230],{},"以下のsearch関数の呼び出しを参照します。",[38,232],{"className":233,"alt":43,"src":234,"style":45},[41,42],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F30163504\u002Fscout-768x279.png",[10,236,238],{"id":237},"_8-rendering-inline-blade-templates","8. Rendering Inline Blade Templates",[15,240,241],{},"Blade.phpファイルを作成する代わりに、Blade::render()関数の呼び出しを使用してBladeコードをコンパイルできるようになりました。これは、SPAアプリケーションのインターフェースを更新する際に便利なメソッドです。AJAX呼び出しを使用して部分ビューを取得する必要がある場合に使用します。",[38,243],{"className":244,"alt":43,"src":245,"style":45},[41,42],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F30163626\u002Finline-blade-768x279.png",[10,247,249],{"id":248},"_9-slot-name-shortcut","9. Slot Name Shortcut",[15,251,252],{},"前のバージョンでは、slot nameはx-slotタグのname属性を介して渡されていました。しかし、Laravel 9.xでは、以下のようにより簡単に渡すことができます。",[38,254],{"className":255,"alt":43,"src":256,"style":45},[41,42],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F30163803\u002Fslot-name.png",[10,258,260],{"id":259},"_10-validationにnested-arrayの値を取得","10. ValidationにNested Arrayの値を取得",[15,262,263],{},"nested array型の入力に対して、どのバリデーションルールを適用するかを決定する前に、入力値を確認する必要があります。そのために、Rule::forEach()関数を使用することができます。",[38,265],{"className":266,"alt":43,"src":267,"style":45},[41,42],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F30163940\u002Fvalidation-ar-768x255.png",[10,269,271],{"id":270},"_11-laravel-breeze-api-nextjs","11. Laravel Breeze API & Next.js",[15,273,274,279,280,285],{},[50,275,278],{"href":276,"rel":277},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Fstarter-kits#breeze-and-next",[54],"Laravel Breeze","スターター キットは、",[50,281,284],{"href":282,"rel":283},"https:\u002F\u002Fgithub.com\u002Flaravel\u002Fbreeze-next",[54],"Next.js","をフロントエンドとして使用するアプリケーションに適しているため、「API」という新しいスキャフォールディングモードを追加しました。このスターターキットは、Laravelでバックエンドを構築し、フロントエンドのJavaScriptアプリケーションを迅速にセットアップするだけでなく、Sanctum APIを使用してユーザー認証を提供することができます。",[10,287,289],{"id":288},"_12-bunlding-with-vite","12. Bunlding with Vite",[15,291,292,293,298,299,304],{},"javascriptまたはcssファイルを",[50,294,297],{"href":295,"rel":296},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F10.x\u002Fmix#main-content",[54],"Mix webpack","でバンドルする代わりに、LaravelはViteの使用に移行しています。Viteの使用方法の詳細については、",[50,300,303],{"href":301,"rel":302},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F10.x\u002Fvite#main-content",[54],"こちら","をご覧ください。",[10,306,308],{"id":307},"_13-exceptionページのインターフェース改善","13. Exceptionページのインターフェース改善",[15,310,311],{},"新しいインターフェースと機能がExceptionページに追加され、それにより使いやすさが向上し、デバッグ作業がより効率的になりました。",[38,313],{"className":314,"alt":43,"src":315,"style":45},[41,42],"https:\u002F\u002Fuser-images.githubusercontent.com\u002F483853\u002F149235404-f7caba56-ebdf-499e-9883-cac5d5610369.png",[15,317,100,319,109],{"className":318},[95,96,97,98,99],[50,320,323],{"href":321,"target":104,"rel":322},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Freleases#exception-page",[106,107],"\n    https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Freleases#exception-page\n  ",[130,325],{},[22,327,328],{"id":328},"新バージョンにアップデートした脆弱性",[330,331,333],"h3",{"id":332},"phar形式のファイルをダウンロード禁止",".phar形式のファイルをダウンロード禁止",[15,335,336],{},"「PHP executable」形式のファイルをアップロードする際、セキュリティ上の理由から、Laravelはこれらのファイルをブロックして除外します。これには、'.php'、'.php3'、'.php4'、'.php5'、'.php7'、'.php8'、および'.phtml'形式のファイルが含まれます。ただし、以前は'.phar'形式のファイルは含まれていませんでした。新しいバージョンでは、Laravelはこれを更新し、'.phar'形式のファイルも除外対象となりました。",[330,338,340],{"id":339},"sql-serverにsqlインジェクション","SQL ServerにSQLインジェクション",[15,342,343],{},"Laravelは、SQLインジェクション攻撃に関連する脆弱性を修正しました。この脆弱性は、SQL Serverのlimit()関数とoffset()関数に直接ユーザー入力を渡す場合に発生します（MySQLやPostgreSQLなどの他のデータベースは、この脆弱性の影響を受けません）。",[330,345,347],{"id":346},"sqlインジェクション-配列とクエリパラメータbinding","SQLインジェクション – 配列とクエリパラメータBinding",[15,349,350],{},"以下のソースコードは、SQLインジェクション攻撃の可能性を引き起こす可能性があります。その理由は、is_adminに0の代わりに1の値が割り当てられるためです。この問題は、where()関数に$value = [1, 1]の配列を渡す場合に発生します。",[76,352,355],{"className":353,"code":354,"language":81},[79],"User::where('id', [1,1])->where('is_admin', 0)->first();\n\u002F\u002F sql: select * from `users` where `id` = 1 and `is_admin` = 1\n",[83,356,354],{"__ignoreMap":43},[15,358,359],{},"しかし、この脆弱性が修正されました。 そして、クエリは次のように生成されます。",[76,361,364],{"className":362,"code":363,"language":81},[79],"\u002F\u002F sql: select * from `users` where `id` = 1 and `is_admin` = 0\n",[83,365,363],{"__ignoreMap":43},[130,367],{},[15,369,370],{},"上記では、Laravel 9と10の新機能について説明しました。また、Laravelが修正した脆弱性についても説明しました。次に、プロジェクトをLaravel 8からLaravel 10にアップグレードする方法について説明します。",[130,372],{},[22,374,376],{"id":375},"laravel-8のプロジェクトからlaravel-10へアップグレードの案内","Laravel 8のプロジェクトからLaravel 10へアップグレードの案内",[10,378,380],{"id":379},"php-810-composer-220へのアップグレード","PHP 8.1.0 & Composer 2.2.0へのアップグレード",[15,382,383],{},"Laravel 10を利用するためには、PHP 8.1.0以降とComposer 2.2.0以降がインストールされている必要があります。したがって、アップグレードする前にこれらのバージョンに合わせて調整する必要があります。この手順は、Laravel 10にアップグレードする前に必須となります。",[10,385,387],{"id":386},"composerjsonでdependenciesの変更","composer.jsonでdependenciesの変更:",[330,389,391],{"id":390},"a-アップグレード必要なパッケージ","a. アップグレード必要なパッケージ：",[15,393,394],{},"以下は新しいバージョンにアップグレードする必要なパッケージです。 以下の手順を行います。",[15,396,397],{},"composer.jsonファイルで、パッケージのバージョン値を次のように変更します。",[76,399,402],{"className":400,"code":401,"language":81},[79],"{\n  \"require\": {\n    \"php\": \"^8.1\",\n    \"laravel\u002Fframework\": \"^10.0\",\n    \"laravel\u002Fsanctum\": \"^3.2\",\n    \"doctrine\u002Fdbal\": \"^3.0\",\n    \"laravel\u002Fpassport\": \"^11.0\"\n  },\n  \"require-dev\": {\n    \"nunomaduro\u002Fcollision\": \"^6.1\",\n    \"spatie\u002Flaravel-ignition\": \"^2.0\"\n  }\n}\n",[83,403,401],{"__ignoreMap":43},[15,405,406,411],{},[50,407,410],{"href":408,"rel":409},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F10.x\u002Fbroadcasting#pusher-channels",[54],"Broadcasting","機能を使用している場合は、以下のようにバージョンを変更します。",[76,413,416],{"className":414,"code":415,"language":81},[79],"{\n  \"require\": {\n    \"pusher\u002Fpusher-php-server\": \"^5.0\"\n  }\n}\n",[83,417,415],{"__ignoreMap":43},[15,419,420,421,426],{},"facade ",[50,422,425],{"href":423,"rel":424},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Ffilesystem#main-content",[54],"Storage","経由でS3、FTP、またはSFTPドライバーを使用している場合は、以下のように、当該パッケージのバージョンを変更します。",[76,428,431],{"className":429,"code":430,"language":81},[79],"{\n  \"require\": {\n    \"league\u002Fflysystem-aws-s3-v3\": \"^3.0\",\n    \"league\u002Fflysystem-ftp\": \"^3.0\",\n    \"league\u002Fflysystem-sftp-v3\": \"^3.0\"\n  }\n}\n",[83,432,430],{"__ignoreMap":43},[15,434,435,436],{},"PHPUnit 10を使用したい場合は、phpunit.xmlというconfigファイルで",[437,438,439],"coverage",{}," 部分の processUncoveredFiles=\"true\" 属性を削除します。 それから、パッケージのバージョンを以下のように変更します。",[76,441,444],{"className":442,"code":443,"language":81},[79],"{\n  \"require-dev\": {\n    \"nunomaduro\u002Fcollision\": \"^7.0\",\n    \"phpunit\u002Fphpunit\": \"^10.0\"\n  }\n}\n",[83,445,443],{"__ignoreMap":43},[330,447,449],{"id":448},"b-laravelで削除されたパッケージ","b. Laravelで削除されたパッケージ：",[15,451,452],{},"以下のパッケージはLaravelで使用されなくなったので、削除してソースを軽くすることができます。",[15,454,455],{},[31,456,457],{},"Trusted Proxies:",[15,459,460],{},"app\u002FHttp\u002FMiddleware\u002FTrustProxies.phpファイルで以下のように変更します。",[15,462,463],{},[83,464,465],{},"use Fideloper\\Proxy\\TrustProxies as Middleware;",[15,467,468],{},"次のように変更します。",[15,470,471],{},[83,472,473],{},"use Illuminate\\Http\\Middleware\\TrustProxies as Middleware;",[15,475,476],{},"次に、app\u002FHttp\u002FMiddleware\u002FTrustProxies.phpファイル で、 $headers属性の値を次のように変更します。",[76,478,481],{"className":479,"code":480,"language":81},[79],"\u002F\u002F Before...\nprotected $headers = Request::HEADER_X_FORWARDED_ALL;\n\u002F\u002F After...\nprotected $headers =\n    Request::HEADER_X_FORWARDED_FOR |\n    Request::HEADER_X_FORWARDED_HOST |\n    Request::HEADER_X_FORWARDED_PORT |\n    Request::HEADER_X_FORWARDED_PROTO |\n    Request::HEADER_X_FORWARDED_AWS_ELB;\n",[83,482,480],{"__ignoreMap":43},[15,484,485],{},"後に、以下のようにパッケージを削除します。",[76,487,490],{"className":488,"code":489,"language":81},[79],"{\n  \"require\": {\n    \u002F\u002F Remove this package\n    \"fideloper\u002Fproxy\": \"^4.4\"\n  }\n}\n",[83,491,489],{"__ignoreMap":43},[15,493,494],{},[31,495,496],{},"Fruitcake\u002Flaravel-cors:",[15,498,499,500,505],{},"この",[50,501,504],{"href":502,"rel":503},"https:\u002F\u002Fpackagist.org\u002Fpackages\u002Ffruitcake\u002Flaravel-cors",[54],"パッケージ","は、所有者によってメンテナンスとアップグレードが行われなくなりました。そのため、Laravel 10ではこのパッケージが削除されました。この変更を反映するには、まず、app\\Http\\Kernel.phpファイルでミドルウェアのname spaceを以下のように変更します。",[15,507,508],{},[83,509,510],{},"\\Fruitcake\\Cors\\HandleCors::class",[15,512,468],{},[15,514,515],{},[83,516,517],{},"\\Illuminate\\Http\\Middleware\\HandleCors::class",[15,519,520],{},"後に、composer.jsonでこのパッケージを削除します。",[76,522,525],{"className":523,"code":524,"language":81},[79],"{\n  \"require\": {\n    \u002F\u002F Remove this package\n    \"fruitcake\u002Flaravel-cors\": \"^2.0\"\n  }\n}\n",[83,526,524],{"__ignoreMap":43},[330,528,530],{"id":529},"c-置換されたパッケージ","c. 置換されたパッケージ：",[15,532,533],{},"以下は別のパッケージで置換されたパッケージなので、次のように変更します。",[76,535,538],{"className":536,"code":537,"language":81},[79],"{\n  \"require-dev\": {\n    \u002F\u002F Replace this\n    \"facade\u002Fignition\": \"^2.5\"\n    \u002F\u002F With this\n    \"spatie\u002Flaravel-ignition\": \"^1.0\"\n  }\n}\n",[83,539,537],{"__ignoreMap":43},[15,541,542,547],{},[50,543,546],{"href":544,"rel":545},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F10.x\u002Fnotifications#sms-notifications",[54],"Laravel SMS Notifications","機能に関しては、現在VonageがNexmoを所有するため、このパッケージの名前をそれに応じて変更されます。 composer.jsonファイルで次のように修正します。",[76,549,552],{"className":550,"code":551,"language":81},[79],"{\n  \"require\": {\n    \u002F\u002F Replace this\n    \"laravel\u002Fnexmo-notification-channel\": \"^2.0\"\n    \u002F\u002F With this\n    \"laravel\u002Fvonage-notification-channel\": \"^3.0\"\n  }\n}\n",[83,553,551],{"__ignoreMap":43},[330,555,557],{"id":556},"d-swiftmailerの代わりsymfony-mailerへ","d. SwiftMailerの代わりSymfony Mailerへ  ：",[15,559,560],{},"Laravel 9.xで最も重要な変更点の一つは、SwiftMailerのメンテナンスが終了したため、メール機能がSwiftMailerの代わりにSymfony Mailerを使用するようになったことです。この変更を反映するには、以下の2つのコマンドを実行します。",[76,562,565],{"className":563,"code":564,"language":81},[79],"composer remove wildbit\u002Fswiftmailer-postmark\ncomposer require symfony\u002Fmailgun-mailer symfony\u002Fpostmark-mailer symfony\u002Fhttp-client\n",[83,566,564],{"__ignoreMap":43},[10,568,570],{"id":569},"composer-updateのコマンド実行","「composer update」のコマンド実行",[15,572,573],{},"composer.jsonファイルを更新した後、composer updateコマンドを実行します。ただし、注意点が1つあります。上記の変更は基本的なLaravelアプリケーションにのみ適用されます。各プロジェクトは異なる追加パッケージを使用する場合があり、それらのパッケージのバージョンの競合が発生する可能性があります。そのため、これらのパッケージのバージョンも更新する必要があります。",[15,575,576],{},"updateコマンドの実行が成功した場合、次にソースコードを「リファクタリング・再構築」する必要があります。これは、一部の機能が古くなったり、使い方が変更されたためです。最後に、アプリケーションでLaravelの新機能を使用することを検討することができます。",[10,578,580],{"id":579},"構成configurationの変更","構成(configuration)の変更：",[15,582,583],{},"プロジェクトでPostgresを使用する場合は、config\u002Fdatabase.phpファイルで「schema」の名前を「search_path」に変更します。",[76,585,588],{"className":586,"code":587,"language":81},[79],"'connections' => [\n  'pgsql' => [\n    \u002F\u002F replace this\n    'schema' => 'public',\n    \u002F\u002F by this\n    'search_path' => 'public',\n  ]\n]\n",[83,589,587],{"__ignoreMap":43},[15,591,592],{},"facade Storage経由してSFTP 機能を使用する場合は、config\u002Ffilesystems.phpファイルを次のように修正します。",[76,594,597],{"className":595,"code":596,"language":81},[79],"'sftp' => [\n  \u002F\u002F Replace this         \n  'password' => env('SFTP_PASSPHRASE'),\n  \u002F\u002F By this\n  'passphrase' => env('SFTP_PASSPHRASE'),\n]\n",[83,598,596],{"__ignoreMap":43},[15,600,601],{},"SMTPのstream構成の宣言はサポートされなくなりました。代わりに、直接宣言する必要があります。例えば、TSL証明を無効にする場合は、以下のように宣言します。また、SMTPサーバーへの接続時にauth_modeが自動的に決定されるため、auth_modeは不要になりました。",[76,603,606],{"className":604,"code":605,"language":81},[79],"'smtp' => [\n  \u002F\u002F 'auth_mode' => null,\n\n  \u002F\u002F Laravel 8.x...\n  'stream' => [\n      'ssl' => [\n          'verify_peer' => false,\n      ],\n  ],\n  \u002F\u002F Laravel 9.x...\n  'verify_peer' => false,\n]\n",[83,607,605],{"__ignoreMap":43},[10,609,611],{"id":610},"ディレクトリ構造の変更","ディレクトリ構造の変更：",[15,613,614],{},"Laravelの新しいバージョンでは、\u002Fresources\u002Flangが\u002Flangに変更されました。つまり、langディレクトリはプロジェクトのルートディレクトリに配置されます。もしソースコードでlangディレクトリのパスをハードコードしている場合は、app()→langPath()関数に切り替える必要があります。",[130,616],{},[22,618,619],{"id":619},"ソースコードの改修実行",[15,621,622],{},"Laravel 10では、一部の機能が削除され、使用方法や動作が変更されました。そのため、プロジェクトのソースコードを適切に更新する必要があります。全ての機能を更新する必要はありませんが、使用している機能のみを更新する必要があります。",[10,624,625],{"id":625},"削除されたメソッド",[15,627,628],{},"以下の関数はLaravel 8でのみサポートされており、新しいバージョンではサポートされなくなりました。したがって、これらの関数の呼び出し箇所を見つけて、別の方法に書き直す必要があります。",[15,630,631,638],{},[31,632,633],{},[50,634,637],{"href":635,"rel":636},"https:\u002F\u002Flaravel.com\u002Fapi\u002F8.x\u002FIlluminate\u002FSupport\u002FTraits\u002FEnumeratesValues.html",[54],"EnumeratesValues Trait:"," reduceWithKeys()メソッドが削除されました。reduceWithKeys()メソッドの代わりに、reduce()メソッド使用します。又、reduceMany()メソッドは、reduceSpreadへ名前を変更しました。",[15,640,641,648],{},[31,642,643],{},[50,644,647],{"href":645,"rel":646},"https:\u002F\u002Flaravel.com\u002Fapi\u002F8.x\u002FIlluminate\u002FDatabase\u002FSchema\u002FBuilder.html#method_registerCustomDoctrineType",[54],"Illuminate\\Database\\Schema\\Builder::registerCustomDoctrineType()"," メソッドが削除されました。代わりに、DBファサードで、registerDoctrineTypeメソッドを使用するか、config\u002Fdatabase.php設定ァイルで、カスタムDoctrineタイプを登録できます。",[15,650,651,654],{},[31,652,653],{},"Testing:"," assertDeleted() メソッドが削除されました。assertModelMissing()メソッドを使用します。",[15,656,657,660,661,666,667,672],{},[31,658,659],{},"Queue:"," ",[50,662,665],{"href":663,"rel":664},"https:\u002F\u002Flaravel.com\u002Fapi\u002F9.x\u002FIlluminate\u002FBus\u002FDispatcher.html#method_dispatchNow",[54],"Bus::dispatchNow","() と dispatch_now() メソッドが削除しました。",[50,668,671],{"href":669,"rel":670},"https:\u002F\u002Flaravel.com\u002Fapi\u002F10.x\u002FIlluminate\u002FBus\u002FDispatcher.html#method_dispatchSync",[54],"Bus::dispatchSync","() と dispatch_sync()メソッドを使用します。",[15,674,675,682],{},[31,676,677],{},[50,678,681],{"href":679,"rel":680},"https:\u002F\u002Flaravel.com\u002Fapi\u002F9.x\u002FIlluminate\u002FRouting\u002FRedirector.html#method_home",[54],"Redirect::home()"," メソッド が削除しました。代わりに、return Redirect::route('home')メソッドを使用することでリダイレクトします。",[10,684,686],{"id":685},"陳腐-blade-レイジーコレクションとloop変数","【陳腐】- Blade - レイジーコレクションと$loop変数",[76,688,691],{"className":689,"code":690,"language":81},[79],"@php\n    use App\\Models\\Car;\n    $cars = Car::cursor();  \u002F\u002F cars lazy collection\n    foreach($cars as $c) {\n        echo $loop->iteration;\n    }\n@endphp\n",[83,692,690],{"__ignoreMap":43},[15,694,695],{},"上記のソースコードで、 レイジーコレクション内の$loop変数へ抽出しています。 この仕方は古いです。そういう風で呼び出す時に全てコレクションがRAMのメモリにロードされるからです。( レイジーコレクション稼働と逆です。)",[10,697,699],{"id":698},"削除-ストレージ","【削除】- ストレージ",[15,701,702,703,708],{},"Storage - FlySystemが",[50,704,707],{"href":705,"rel":706},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F8.x\u002Ffilesystem#composer-packages",[54],"cached adapters","をサポートしなくなりました。削除するためには下記のコマンドを実行します。",[76,710,713],{"className":711,"code":712,"language":81},[79],"composer require league\u002Fflysystem-cached-adapter\n",[83,714,712],{"__ignoreMap":43},[10,716,718],{"id":717},"削除-dbからstringexpressionの抽出","【削除】 DBからStringExpressionの抽出",[15,720,721,722,727],{},"前のバージョンでは、以下の方法でで",[50,723,726],{"href":724,"rel":725},"https:\u002F\u002Flaravel.com\u002Fapi\u002F9.x\u002FIlluminate\u002FDatabase\u002FQuery\u002FExpression.html",[54],"Expression"," の文字列の一部を抽出することができます。",[76,729,732],{"className":730,"code":731,"language":81},[79],"$expression = DB::raw('select * from news');\n$expStr = (string)$expression;\n",[83,733,731],{"__ignoreMap":43},[15,735,736],{},"この方法がサポートしなくなりました。代わりに、以下の方法でやります。",[76,738,741],{"className":739,"code":740,"language":81},[79],"$expStr = $expression->getValue(DB::connection()->getQueryGrammar());\n",[83,742,740],{"__ignoreMap":43},[10,744,746],{"id":745},"削除eloquent-モデルにおけるdateプロパティ","【削除】Eloquent モデルにおける$dateプロパティ",[15,748,749],{},"以前は、自動的にDateTimeプロパティを定義するためには、$date プロパティを使用することができました。しかし、現在のバージョンでは、$date プロパティは削除されています。",[76,751,754],{"className":752,"code":753,"language":81},[79],"protected $dates = [\n    'deployed_at'\n];\n",[83,755,753],{"__ignoreMap":43},[15,757,758],{},"その代わりに、$castsプロパティに指定します。",[76,760,763],{"className":761,"code":762,"language":81},[79],"protected $casts = [\n    'deployed_at' => 'datetime',\n];\n",[83,764,762],{"__ignoreMap":43},[10,766,768],{"id":767},"削除testing-service-mocking","【削除】Testing - Service Mocking",[15,770,771,776,777,782],{},[50,772,775],{"href":773,"rel":774},"https:\u002F\u002Flaravel.com\u002Fapi\u002F9.x\u002FIlluminate\u002FFoundation\u002FTesting\u002FConcerns\u002FMocksApplicationServices.html",[54],"MocksApplicationServices"," トレイトのexpectsEvents()、expectsJobs()、expectsNotifications()などのテストメソッドが削除されました。これらのメソッドを使用している場合は、代わりにEvent::fake()、Bus::fake()、Notification::fake()などのメソッドを使用する必要があります。fakeメソッドでモックを作成する方法詳細については、fakeしたい該当サービスの",[50,778,781],{"href":779,"rel":780},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Fmocking",[54],"資料","を参照ください。",[10,784,786],{"id":785},"変更バリデーション-パスワードのルール","【変更】バリデーション - パスワードのルール",[15,788,789,794,795,800],{},[50,790,793],{"href":791,"rel":792},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F10.x\u002Fvalidation#rule-password",[54],"パスワードのルール","はユーザーが入力したパスワードを確認するためです。現在、passwordルールの名前を",[50,796,799],{"href":797,"rel":798},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F10.x\u002Fvalidation#rule-current-password",[54],"current_password","へ変更しました。",[10,802,804],{"id":803},"変更blade-vueスニペットの上書き避止","【変更】Blade - Vueスニペットの上書き避止",[15,806,807,808,813],{},"Laravel 9では、@diabled、@checked、@selected等の 新しい",[50,809,812],{"href":810,"rel":811},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F10.x\u002Fblade#additional-attributes",[54],"ブレード ディレクティブ"," を提供します。又、Vue も同様なディレクティブを使用しています。そのため、Vueを上書きしないために、@@disabled、@@selected、@@selected のような記号を付ける必要があります。",[10,815,817],{"id":816},"変更コレクション","【変更】コレクション",[15,819,820],{},"Collection::when(), unless()メソッドの1番目の引数にクロージャを渡すことができます。これらのクロージャは実行されます。（前のバージョンで実行できません）",[76,822,825],{"className":823,"code":824,"language":81},[79],"$collection->when(function ($collection) {\n  \u002F\u002F This closure is executed...\n  return false;\n}, function ($collection) {\n  \u002F\u002F Not executed since first closure returned \"false\"...\n  $collection->merge([1, 2, 3]);\n});\n",[83,826,824],{"__ignoreMap":43},[10,828,830],{"id":829},"変更-eloquent-null値でキャストカスタム","【変更】- Eloquent - Null値でキャストカスタム",[15,832,833,834,839],{},"Laravel 8では、$value = nullの場合に",[50,835,838],{"href":836,"rel":837},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F10.x\u002Feloquent-mutators#defining-a-mutator",[54],"mutator set() メソッド","が実行されませんが、Laravel 9で実行します。 以下のソースコードで、$value = nullの場合より出力値が全く違います。",[76,841,844],{"className":842,"code":843,"language":81},[79],"\u002F\u002F In App\\Casts\\FilenameWithTimestamp.php\npublic function set($model, $key, $value, $attributes) {\n  return time() . '_' . $value;\n}\n\n\u002F\u002F In App\\Models\\File.php\nprotected $casts = [\n  'filename' => FilenameWithTimestamp::class\n];\n\n\u002F\u002F Somewhere in your program\n\u002F\u002F With Laravel 8, the result of echo statement will be: null\n\u002F\u002F With Laravel 9, the result of echo statement will be: \"20230322_\"\n$file = File::first();\n$file->filename = null;\necho $file->filename;\n",[83,845,843],{"__ignoreMap":43},[15,847,848],{},"Laravel 9では、nullを渡してもファイル名にタイムスタンプが付けられます。これは不合理です。そのため、ソースコードを再度確認して、nullを渡してもアプリケーションも処理できることを確保しないといけません。例えば、上記のソースコードは、nullをチェックするケースを以下のように修正できます。",[76,850,853],{"className":851,"code":852,"language":81},[79],"\u002F\u002F In App\\Casts\\FilenameWithTimestamp.php\npublic function set($model, $key, $value, $attributes) {\n  if (empty($value)) {\n    return '';\n  }\n  return time() . '_' . $value;\n}\n",[83,854,852],{"__ignoreMap":43},[15,856,857],{},"上記の修正したら、ソースコードが正常に実行できます。",[10,859,861],{"id":860},"変更ストレージ-例外処理","【変更】ストレージ - 例外処理",[15,863,864],{},"前のバージョンでは、存在しないファイルを削除する等書き込みや読み込み途中でエラーが発生した場合、Laravelが例外をスローします。しかし、新しいバージョンでは、Laravelは例外をスローせずに、true、false、null などの結果のみを返します。",[15,866,867],{},"この変更により、try-catchで例外処理を実装している場合、アプリケーションが正常に稼働しない可能性があります。この変更に対して対策は、if-else を使うことでエラーチェックを行います。または、以前のように例外をスローするためにLaravel を以下のように構築します。",[76,869,872],{"className":870,"code":871,"language":81},[79],"'public' => [\n  'driver' => 'local',\n  \u002F\u002F ...\n  'throw' => true,\n]\n",[83,873,871],{"__ignoreMap":43},[10,875,877],{"id":876},"変更ストレージ-カスタムファイル-システムドライバー","【変更】ストレージ - カスタムファイル システムドライバー",[15,879,880],{},"スタムファイル システムドライバーの登録に必要な手順が一部変更されました。したがって、もし独自のカスタムファイルシステムドライバを定義していたり、カスタムドライバを定義しているパッケージを使用していた場合は、コードと依存を更新する必要があります。",[15,882,883],{},"例えば、Laravel8.xのカスタムファイルシステムの登録は、以下のようにします。",[76,885,888],{"className":886,"code":887,"language":81},[79],"use Illuminate\\Support\\Facades\\Storage;\nuse League\\Flysystem\\Filesystem;\nuse Spatie\\Dropbox\\Client as DropboxClient;\nuse Spatie\\FlysystemDropbox\\DropboxAdapter;\n\nStorage::extend('dropbox', function ($app, $config) {\n    $client = new DropboxClient(\n        $config['authorization_token']\n    );\n\n    return new Filesystem(new DropboxAdapter($client));\n});\n",[83,889,887],{"__ignoreMap":43},[15,891,892],{},"しかし、Laravel9.xから、Storage::extend メソッドへ与えられるコールバックは、 直接Illuminate\\Filesystem\\FilesystemAdapterインスタンスを返さなければなりません。",[76,894,897],{"className":895,"code":896,"language":81},[79],"use Illuminate\\Filesystem\\FilesystemAdapter;\nuse Illuminate\\Support\\Facades\\Storage;\nuse League\\Flysystem\\Filesystem;\nuse Spatie\\Dropbox\\Client as DropboxClient;\nuse Spatie\\FlysystemDropbox\\DropboxAdapter;\n\nStorage::extend('dropbox', function ($app, $config) {\n    $adapter = new DropboxAdapter(\n        new DropboxClient($config['authorization_token'])\n    );\n\n    return new FilesystemAdapter(\n        new Filesystem($adapter, $config),\n        $adapter,\n        $config\n    );\n});\n",[83,898,896],{"__ignoreMap":43},[10,900,902],{"id":901},"変更swift-mailerをsymfony-mailerに置き換える","【変更】Swift MailerをSymfony Mailerに置き換える",[15,904,905],{},"Laravel8 では、Swift Mailer ライブラリがメールを送信するように使用されますが、Swiftmailerが廃止され、Symfony\u002FMailerが採用されています。大きく影響を与えます。ライブラリへ呼び出すコマンドが殆ど変更されて、コマンドを更新する必要があります。",[15,907,908,911],{},[31,909,910],{},"「Swift」のメソッドの名前の変更："," さまざまなSwiftMailer関連のメソッドは、Symfony Mailerの対応するメソッドへ名前を変更しました。 IDE のadvanced search機能を使用して、以下のように該当メソッドを使用することでメソッドへの呼び出しのコマンドに上書きを一括で行います。",[15,913,914],{},[31,915,916],{},"MessageSent イベント の変更：",[15,918,919],{},"Illuminate\\Mail\\Events\\MessageSent イベントは、前のSwift_Messageの代わりに、 Symfony\\Component\\Mime\\Emailの変数を提供しています。この変数に送信前のメールに関する情報が含まれています。同時に、新しくsentプロパティを追加しました。この新しいプロパティは、メッセージIDなど送信したメールに関する情報が含まれています。",[15,921,922],{},[31,923,924],{},"配信失敗メールの受信者リスト：",[15,926,927],{},"メッセージ送信後に、失敗した受信者のリストを取得できなくなりました。代わりに、メッセージの送信に失敗すると、Symfony\\Component\\Mailer\\Exception\\TransportExceptionInterface例外が投げられるようになりました。",[10,929,930],{"id":930},"理解度テスト",[15,932,933],{},"この記事の理解度を測るテストを用意しました。 ぜひ挑戦してください!!",[15,935,936],{},[50,937,938],{"href":938,"rel":939},"https:\u002F\u002Fexam-site.briswell-vn.com\u002FstartTest\u002FcopKXQI21W",[54],[10,941,943],{"id":942},"参照元","参照元：",[945,946,947,954,960,967,974,980,986],"ul",{},[948,949,950],"li",{},[50,951,952],{"href":952,"rel":953},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Freleases",[54],[948,955,956],{},[50,957,958],{"href":958,"rel":959},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F10.x\u002Freleases",[54],[948,961,962],{},[50,963,966],{"href":964,"rel":965},"https:\u002F\u002Flaracasts.com\u002Fseries\u002Fwhats-new-in-laravel-9",[54],"Laracasts: What's New in Laravel 9",[948,968,969],{},[50,970,973],{"href":971,"rel":972},"https:\u002F\u002Flaracasts.com\u002Fseries\u002Fwhats-new-in-laravel-10",[54],"Laracasts: What's New in Laravel 10",[948,975,976],{},[50,977,978],{"href":978,"rel":979},"https:\u002F\u002Fgithub.com\u002Flaravel\u002Flaravel\u002Fcompare\u002F8.x...9.x",[54],[948,981,982],{},[50,983,984],{"href":984,"rel":985},"https:\u002F\u002Fgithub.com\u002Flaravel\u002Flaravel\u002Fcompare\u002F9.x...10.x",[54],[948,987,988],{},[50,989,990],{"href":990,"rel":991},"https:\u002F\u002Fsecurity.snyk.io\u002Fpackage\u002Fcomposer\u002Flaravel%2Fframework",[54],{"title":43,"searchDepth":993,"depth":993,"links":994},2,[995,996,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1019,1020,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043],{"id":12,"depth":993,"text":13},{"id":28,"depth":993,"text":997},"1. Laravel Pennant:",{"id":59,"depth":993,"text":60},{"id":70,"depth":993,"text":71},{"id":112,"depth":993,"text":113},{"id":138,"depth":993,"text":139},{"id":149,"depth":993,"text":150},{"id":160,"depth":993,"text":161},{"id":171,"depth":993,"text":172},{"id":198,"depth":993,"text":199},{"id":209,"depth":993,"text":210},{"id":220,"depth":993,"text":221},{"id":237,"depth":993,"text":238},{"id":248,"depth":993,"text":249},{"id":259,"depth":993,"text":260},{"id":270,"depth":993,"text":271},{"id":288,"depth":993,"text":289},{"id":307,"depth":993,"text":308,"children":1014},[1015,1017,1018],{"id":332,"depth":1016,"text":333},3,{"id":339,"depth":1016,"text":340},{"id":346,"depth":1016,"text":347},{"id":379,"depth":993,"text":380},{"id":386,"depth":993,"text":387,"children":1021},[1022,1023,1024,1025],{"id":390,"depth":1016,"text":391},{"id":448,"depth":1016,"text":449},{"id":529,"depth":1016,"text":530},{"id":556,"depth":1016,"text":557},{"id":569,"depth":993,"text":570},{"id":579,"depth":993,"text":580},{"id":610,"depth":993,"text":611},{"id":625,"depth":993,"text":625},{"id":685,"depth":993,"text":686},{"id":698,"depth":993,"text":699},{"id":717,"depth":993,"text":718},{"id":745,"depth":993,"text":746},{"id":767,"depth":993,"text":768},{"id":785,"depth":993,"text":786},{"id":803,"depth":993,"text":804},{"id":816,"depth":993,"text":817},{"id":829,"depth":993,"text":830},{"id":860,"depth":993,"text":861},{"id":876,"depth":993,"text":877},{"id":901,"depth":993,"text":902},{"id":930,"depth":993,"text":930},{"id":942,"depth":993,"text":943},"tech talk","Briswell Vietnam Co Ltd","2023-05-23","Laravel 8のプロジェクトをなぜアップグレードするべきか Laravelの新バージョンは毎年リリースされます。これらのリリースには多少の変更が含まれ、新しい機能が追加されたり、不要な機能が削除されたりします。そのため、早めにアップグレードを行わないと、アップグレードが困難で時間がかかる可能性があります。アップグレードが困難になる主な理由は、プロジェクトが成長し、関数やメソッドが相互に依存するようになることです。つまり、1つの機能を変更すると他の機能にも大きな影響を与える可能性があります。また、Laravel 10がリリースされた後は、Laravel 8のメンテナンスやサポートが終了するため、できるだけ早くアップグレードすることが重要です。","md",{},true,"\u002Fja\u002Fnews\u002Ftinh-nang-moi-va-cach-nang-cap-version-tu-laravel-8-len-laravel-10",null,{"title":5,"description":1047},"ja\u002Fnews\u002Ftinh-nang-moi-va-cach-nang-cap-version-tu-laravel-8-len-laravel-10","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F04\u002F06151008\u002Flaravel-8-upgrade-thumbnail.jpg","kwUTpzD7TjIUTICo6Osc71E2JHHnneNVFBcoxfu-Y88",1782263096790]