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

Github Actions で Laravel + MySQLのテスト

前回の環境を使用します。 ワークフローの作成 wsl mkdir -p .github/workflows touch laravel.yml laravel.yml name: Laravel on: push: branches: [ main ] paths: - 'src/**' pull_request: branches: [ main ] paths: - 'src/**' jobs: laravel-tests: runs-on: ubuntu-latest services: mysql: image: mysql:5.7 ports: - 3306:3306 env: MYSQL_DATABASE: laravel MYSQL_ROOT_PASSWORD: test options: --health-cmd "mysqladmin ping -h localhost" --health-interval 20s --health-timeout 10s --health-retries 10 env: DB_CONNECTION: mysql DB_HOST: 127.0.0.1 DB_PORT: 3306 DB_DATABASE: laravel DB_USER_NAME: root DB_PASSWORD: test steps: - uses: shivammathur/setup-php@15c43e89cdef867065b0213be354c2841860869e with: php-version: '7.4' - uses: actions/checkout@v2 - name: Initalize MySQL run: mysql -h 127.0.0.1 --port 3306 -uroot -ptest -e "$(cat docker/mysql/initdb.d/*.sql)" - name: Copy .env working-directory: ./src run: php -r "file_exists('.env') || copy('.env.example', '.env');" - name: Install Dependencies working-directory: ./src run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist - name: Generate key working-directory: ./src run: php artisan key:generate - name: Directory Permissions working-directory: ./src run: chmod -R 777 storage bootstrap/cache - name: Execute tests (Unit and Feature tests) via PHPUnit working-directory: ./src run: vendor/bin/phpunit 動作テスト 失敗するテストを試す テストファイルの作成 wsl docker-compose exec php php artisan make:test GithubActionsTest ./src/tests/Feature/GithubActionsTest <?php namespace Tests\Feature; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\WithFaker; use Tests\TestCase; class GithubActionsTest extends TestCase { /** * A basic feature test example. * * @return void */ public function test_example() { $this->assertTrue(false); } } ローカルで実行 wsl docker-compose exec php php artisan test Github上で実行 変更をプッシュ DBの初期化&接続テスト テストファイルの作成 先ほど作成したファイルを編集します。 ./src/tests/Feature/GithubActionsTest <?php namespace Tests\Feature; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\WithFaker; use Tests\TestCase; class GithubActionsTest extends TestCase { /** * A basic feature test example. * * @return void */ public function test_example() { $this->assertDatabaseHas('users', [ 'name' => 'Dog', ]); } } ローカルで実行 wsl docker-compose exec php php artisan test Github上で実行 変更をプッシュ
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

laravel-adminのSSL化方法

Configの設定を変えるだけで可能 /config/admin.php 'https' => env('ADMIN_HTTPS', false), local環境もhttpsで構わないという場合は第二引数をtrueにする。 本番環境やstg環境だけSSL化したい場合(こちらの方がたぶん多い)、環境変数でADMIN_HTTPS を定義してtrue にする。 これだけでSSL化されます。あら、便利。 あくまでもlaravel-adminの設定なので、管理画面の他に公開画面などのviewを作っている場合は別途そちらもSSL化する必要があります。 ミドルウェア用意したり、リダイレクトさせたり。 https://qiita.com/Yorinton/items/50b9c8e3102ac661f08c
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel のリリーススケジュールとサポート期限

ソース: Laravel公式 サポートポリシー(8.xリリースノート) 現状(2021年7月時点)まとめ LaravelにはLTS(Long Term Support:長期サポート)版があります。 現行のLTSは6.xで、次のLTSは2022年1月25日リリース予定の9.xになります。 7.xはBug FixesもSecurity Fixesもサポート期限が終了しているので 今利用すべきはLTSの6.xか、アップデートするなら8.xになります。 もし今利用しているのが7.xであれば8.xにアップグレードを行う必要があります。 現行ではLTSである6.xの方が後発の7.xよりサポート期限が長くなっています。 そのため頻繁にアップグレードできない場合はLTSからLTSへ上げていくのが定番ですが、 次回LTSの9.xより10.xの方がBug Fixes期限は長く、Security Fixes期限は同じになっています。 Laravelのアップグレード作業は1ずつバージョンを上げていく形になりますし、 8.x以降は上げたいところまでバージョンを上げていってもよさそうです。 バージョン リリース バグ修正 セキュリティ修正 6 (LTS) 済 2022/1/25 2022/9/6 7 済 2020/10/6 2021/3/3 8 済 2022/7/26 2023/1/24 9 (LTS) 2022/1/25 2024/1/30 2025/1/28 10 2023/1/24 2024/7/30 2025/1/28 11 2024/1/? 2025/7/30? 2026/1/28? なお、今後は11月のSymfonyのアップグレードにあわせて、その2ヶ月後の年明け1月に新バージョンをリリースしていく予定のようです。 https://blog.laravel.com/laravel-9-release-date アップグレード計画作成の助けになれば幸いです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelで細かくSQLを指定したい場合に使える「rawメソッド」

LaravelでSQL文を構成する際、クエリビルダではなく直接細かいカスタマイズをしたい時がある。 そんな時はrawメソッドを使う。 DB::select('\DB::raw('users.*')') rawメソッドを使う事でクエリビルダで構成されたSQLに生のSQLを差し込む事ができる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

paginateがあるとtoSql()での中身確認ができない

LaravelではtoSql()でSQLの中身を確認する際、paginateは外さなければならない。 ■元となるSQLの例 $query->paginate(100); ※NG例 $query->paginate(100)->toSql(); ※OK例 $query->toSql();
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Boost your Laravel models by Lara Query Kit

Lara Query Kit Lara Query Kit utilizes the Eloquent model. PHP Trait and Laravel local scope are used to implement this utilitiy PHP Traits PHP only supports single inheritance: a child class can inherit only from one single parent. So, what if a class needs to inherit multiple behaviors? OOP traits solve this problem. Traits are used to declare methods that can be used in multiple classes. Traits can have methods and abstract methods that can be used in multiple classes, and the methods can have any access modifier (public, private, or protected). Laravel local scope Local scopes allow you to define common sets of constraints that you may easily re-use throughout your application. To define a scope, simply prefix an Eloquent model method with scope. Installation & Configuration 1-Install cuongnd88/lara-query-kit using Composer. composer require cuongnd88/lara-query-kit 2-Push lara-query-kit into your application. php artisan vendor:publish --provider="Cuongnd88\LaraQueryKit\LaraQueryKitServiceProvider" 3-App\Traits\QueryKit.php is already to pump your performance. Please add QueryKit into the model . . . . use App\Traits\QueryKit; class User extends Authenticatable { use Notifiable; use HasOtpAuth; use HasGuardian; use QueryKit; . . . . } Available methods Let discuss each method available on the Query Kit. insertDuplicate() getTableColumns() exclude() filter() searchFulltext() insertDuplicate insertDuplicate(array $data, array $insertKeys, array $updateKeys): Insert new rows or update existed rows. public function upsert() { $data = [ ['name' => "Dean Ngo", 'email' => 'dinhcuongngo@gmail.com', 'mobile' => '84905005533', 'password' => Hash::make('123456')], ['name' => "Robert Neil", 'email' => '1111@gmail.com', 'mobile' => '84905001122', 'password' => Hash::make('123456')], ]; User::insertDuplicate($data, ['name', 'email', 'mobile', 'password'], ['name', 'email', 'mobile']); } getTableColumns getTableColumns(): Get the array of columns. public function listTableColumns() { $columns = User::getTableColumns(); dump($columns); } exclude exclude(array $columns): Retrieve a subset of the output data. You should define which model attributes you want to exclude. You may do this using the $excludable property on the model. . . . . use App\Traits\QueryKit; class User extends Authenticatable { use Notifiable; use HasOtpAuth; use HasGuardian; use QueryKit; protected $excludable = ['deleted_at', 'created_at', 'updated_at']; . . . . } public function listUsers() { $data = User::exclude()->get()->toArray(); dump($data); } Or pass a array of excludable columns as argument public function listUsers() { $users = User::exclude(['deleted_at', 'created_at', 'updated_at']) ->get()->toArray(); dump($users); } filter filter(array $params): Get the result with filter conditions. You may use the fitler method on a query builder instance to add where clauses to the query. The $filterable property should contain an array of conditions that you want to execute searching. The key of filterable array corresponds to table columns, whereas the value is condition to call where clauses. The most basic condition requires two arguments: The first argument is simple where clause such as: where, orWhere, whereBetween, whereNotBetween, whereIn, whereNotIn, whereNull, whereNotNull, orWhereNull , orWhereNotNull, whereDate, whereMonth, whereDay, whereYear, whereTime The second argument is an operator, which can be any of the database's supported operators. Exceptionally, the third argument is required with the operator is LIKE, it is for a specified pattern For convenience, if you verify only column in fiterable property, the default clause is where with = operator . . . . use App\Traits\QueryKit; class User extends Authenticatable { use Notifiable; use HasOtpAuth; use HasGuardian; use QueryKit; protected $filterable = [ 'id' => ['whereBetween'], 'email', 'name' => ['orWhere', 'LIKE', '%{name}%'], ]; . . . . } public function filter() { $where = [ 'id' => [1,5], 'email' => 'dinhcuongngo@gmail.com', 'name' => 'ngo', ]; $data = User::->filter($where)->get()->toArray(); } Dynamically, you can call filterableCondition() and assign the filterable conditions public function filter() { $filterable = [ 'email', 'name' => ['orWhere', 'LIKE', '%{name}%'], 'deleted_at' => ['whereNull'], ]; $where = [ 'email' => 'dinhcuongngo@gmail.com', 'name' => 'ngo', 'deleted_at' => '', ]; $data = User::filterableCondition($filterable) ->filter($where) ->get() ->toArray(); } searchFulltext searchFulltext($value, $mode = NATURAL_LANGUAGE): Run full-text queries against character-based data in MySQL tables. There are four modes of full-text searches: NATURAL_LANGUAGE (is default): IN NATURAL LANGUAGE MODE NATURAL_LANGUAGE_QUERY: IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION BOOLEAN_MODE: IN BOOLEAN MODE QUERY_EXPANSION: WITH QUERY EXPANSION The $searchable property should contain an array of conditions that you search full- . . . . use App\Traits\QueryKit; class User extends Authenticatable { use Notifiable; use HasOtpAuth; use HasGuardian; use QueryKit; protected $excludable = ['deleted_at', 'created_at', 'updated_at']; protected $searchable = [ 'name', 'address' ]; . . . . } public function search() { $data = User::searchFulltext('ngo')->exclude()->get()->toArray(); dump($data); } You flexibly add matched columns by searchableCols() public function search() { $data = User::searchableCols(['name', 'address']) ->searchFulltext('ngo') ->exclude() ->get() ->toArray(); dump($data); } You must create a full-text index on the table before you run full-text queries on a table. The full-text index can include one or more character-based columns in the table. ALTER TABLE `users` ADD FULLTEXT(`name`, `address`);
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

共同開発まとめ

初めに 実務に近い経験を積みたい!と思い、共同開発のコミュニティに参加しECサイトを作成しました。 共同開発するにあたって苦労した点や、各機能実装の際に参考にした記事や教材について記事にまとめました。 アプリの概要 ご当地の美味しいものをお取り寄せできるECサイト。 アプリURL https://www.tomtom-blog.net ※テストアカウント メールアドレス test@co.jp パスワード123456789123でログインできます。 GitHub https://github.com/KawataTsutomu/yanbaru_ec_traning 使用画面のイメージ 使用技術 フロントエンド HTML / CSS / Bootstrap バックエンド PHP 7.2.34 Laravel 6.18.36 インフラ Vagrant + VirtualBox + Docker CentOS 7.3.1611 Apache 2.4.6 MySQL 5.7 / PHPMyAdmin AWS ( VPC, EC2, RDS, IAM, IGW, ELB, Route53 ) 開発環境、インフラ構成図 AWSデプロイ参考記事 VPC構築参考 Docker環境構築 機能一覧 ログイン関連 ログイン、ログアウト機能 ユーザー登録関連 新規登録、ユーザー情報確認、編集、退会機能 商品関連 商品詳細、検索機能 注文関連 カート、注文詳細、キャンセル機能  私は主にマイグレーション・シーダーファイル作成、ユーザー情報確認・修正、注文詳細を担当しました。 DB設計 ER図 苦労したこと まず何をすればいいんだ...?と何も分からないところからスタート。考えているだけでは始まらない!とりあえず手を動かそう!とcodeを書いてみるもエラー連発で泣きそうになりました...w ここでは特に印象に残っている点をまとめます。 環境構築 Vagrantを用いてDocker動作環境を構築し、Laravel立ち上げに成功! 翌日、PCを再起動し、作業を始めようとするapacheだけ立ち上がらない... 原因は、正しい手順でDockerとVagrantを停止していなかったからで、コンテナを壊してしまっていました...。 docker-compose stop でDocker停止 vagrant suspend でvagrant停止 パソコンをシャットダウン することで防ぐことができました。パソコンの電源を切るのと同じように正しい手順があることを学びました。 Git操作 意図して変更していないファイルも差分としてpushしてしまっていました。 commit,pushする前に何を変更した確認することを怠っていました。 色々な方法がありますが、VSCodeで確認するのが自分にあっているように感じました。 ①サイドバーの「ソース管理」のアイコンをクリック ②変更に変更されたファイルが表示される ③ファイルをクリックすると変更内容が表示される。(左が変更前で右が変更後) 個人で開発する分にはそれほど問題にはならないが、複数人で作業する現場では注意しなくてはいけないということを学びました。 「git push origin master は悪魔のコマンド」という高額な損害賠償のエピソードを知り、個人で開発する時よく使ってしまっていたのでゾッとしました... DBからデータ取得 先に取りかかったユーザー情報確認画面では Controller UserController.php public function show() { $user = Auth::user(); return view('auth/user_info', ['user' => $user]); } View user_info.blade.php @extends('layouts.app') @section('content') <main> <div class="page-header mt-5 pt-5 text-center"> <h4>ユーザ情報</h4> </div> <div class="row mt-5 mb-5"> <div class="col-sm-6 mx-auto"> <div class="mb-3"> <p class="contents">ユーザID</p> <p class="contents-text">{{ $user->id }}</p> </div> <div class="mb-3"> <p class="contents">氏名</p> <p class="contents-text"> {{ $user->last_name }} {{ $user->first_name }}</p> </div> <div class="mb-3"> <p class="contents" id="content-address"> 住所 </p> <div class="contents-text"> <p class="mb-1">〒{{ $user->zipcode }}</p> <p class="mb-1">{{ $user->prefecture }}{{ $user->municipality }}{{ $user->address }}{{ $user->apartments }}</p> </div> </div> Authで欲しい情報(ログインしているユーザー情報)を取得できたので簡単だったので、次に担当した注文詳細画面で壁にぶち当たりました... Route web.php Route::resource('orders', 'OrderDetailController', ['only' => ['show', 'edit']]); Controller web.php class OrderDetailController extends Controller { private const SHIPMENT_STATUS_PREPARE = 1; private const SHIPMENT_STATUS_CANCEL = 2; public function show($id) { $orderDetail = OrderDetail::whereHas('order', function ($query) use($id) { $query->where('order_id', $id); }) ->select('order_detail_number') ->first(); // ログインしているユーザーの注文詳細、注文履歴で選んだ注文のキャンセル(注文状態)以外を取得 $ordersHistory = OrderDetail::with('Product.category', 'shipmentStatus') ->whereHas('order', function ($query) { $query->where('user_id', Auth::id()); }) ->where('order_detail_number', $orderDetail->order_detail_number) ->where('shipment_status_id', '<>', self::SHIPMENT_STATUS_CANCEL) ->get(); $userInfo = Auth::user(); $subtotal = 0; $total = 0; //注文状態の判定 $preparationOrder = OrderDetail::whereHas('order', function ($query) { $query->where('user_id', Auth::id()); }) ->where('order_detail_number', $orderDetail->order_detail_number) ->where('shipment_status_id', '=', self::SHIPMENT_STATUS_PREPARE) ->get(); //$shipment_status_flg = true なら準備中、false なら発送済 $preparationOrderFlg = $preparationOrder->isEmpty() ? false : true; return view('order/order_detail', compact('ordersHistory', 'userInfo', 'orderDetail', 'subtotal', 'total', 'preparationOrderFlg') ); } public function edit($id) { // ログインしたユーザーと同じuser_idなら選択した注文を準備中をキャンセルへ変更 $ordersHistory = OrderDetail::whereHas('order', function ($query) { $query->where('user_id', Auth::id()); }) ->where('order_detail_number', '=', $id) ->where('shipment_status_id', '=', self::SHIPMENT_STATUS_PREPARE) ->update(['shipment_status_id' => self::SHIPMENT_STATUS_CANCEL]); return redirect()->back();; } } しかしそのお陰で、クエリビルダを使ってデータベースを操作し、テーブルからデータを取得することや、定数を定義して数字に意味を持たせることによってcodeが読みやすくなることを学べました。 参考にしたURL https://readouble.com/laravel/5.7/ja/queries.html 終わりに 壁にぶち当たってメンバーに相談した際、嫌な顔せずに、dd( );を使ったデバッグの方法など色々教えてもらい、感謝してもしきれません。本当ありがとうございます。 自分もそんなチームを助けられるエンジニアになれるよう、勉強を続け知識を深めていきたいと思います。 動作確認した不備が見つかったので時間を作り直していきます。 技術的な記事ではありませんが、最後まで読んでいただきありがとうございました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel でのファイルダウンロードを実装してみた

LaravelでPDFファイルのダウンロードを実装してみて、こんなに簡単に実装できるんだ、、、と驚いたので書いてみた 仕様、もしくは前提 ・OS : Windows ・PHP 7.4.16 (cli) (built: Mar 2 2021 14:06:15) ( ZTS Visual C++ 2017 x64 ) ・Laravel Framework 6.20.24 ・ある画面に表示される「PDF出力」ボタンをクリックすると、DBに登録されているPDFファイルのパスを取得し、ブラウザ経由でローカルにPDFファイルがダウンロードされる。 1.PDFファイルのパス取得 $res = \DB->table('files') ->where('id', '=', $id) ->get(); $pdfFilePath = $res->pdf_pile_path; //C:\LavelDir\storage\app\public\pdfFiles\202107191038162092931173.pdf $pdfFileName = pathinfo($pdfFilePath)['basename']; //202107191038162092931173.pdf 2.ヘッダー情報指定 $headers = [ 'Content-Type' => 'application/pdf' ]; 3.ファイルが存在したらダウンロード if(file_exists($pdfFilePath)){ return response()->download($pdfFilePath, $pdfFileName, $headers); return redirect()->route('sales.index.list')->with('sales.index.list.print.success', true); }else{ //ファイルが存在しなかった場合のエラー処理 } まとめ こんな感じです。 他にもStorage::download()やStorage::response()を使う方法があるみたいですが、今回は使いませんでした。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel+Eclipseで開発するための準備&Google App Engineにデプロイする

概要 以前からLaravelに興味があり、Laravelを用いて何かWebアプリケーションを作ってみたいと思っていました。 そこで先日、準備としてLaravelをインストールしてEclipseで開発環境を作り、作成した新規LaravelプロジェクトをGoogle App Engineにデプロイしてみました。最初は色々つまずきましたが、何とか一通りできたので参考にさせていただいたサイトと手順をメモとして残します。 目的 Laravelをインストールしてプロジェクトを作成する LaravelプロジェクトをEclipseにインポートして編集できるようにする 作成したLaravelプロジェクトをGoogle App EngineにデプロイしてWebアプリとして公開する 環境 macOS Catalina ver.10.15.7 PHP 7.3.11 Laravel Framework 8.50.0 Eclipse Platform Version: 2021-06 (4.20) ※おおよその手順は同じだと思いますが、Windowsの場合手順が一部異なる可能性があります。 ※今回、開発環境にEclipseを選んでいますがEclipse以外の環境を用いても大丈夫です。 手順 1.  Eclipseのインストール 参考サイト:MacにEclipse(+日本語化)をインストールする方法 上記サイトを参考に、Pleiades All in One ダウンロードページから自分の環境に合うEclipseをダウンロード・インストールしてください(自分はMacのFull Edition(PHP)を選択しました)。 2. Composerのインストール 参考サイト:Macにcomposerをインストール Composerのダウンロードページにあるコマンドを実行してComposerをインストールしてください。 インストール後、composer -Vまたはcomposer --versionコマンドを実行してComposerが正しくインストールされているかを確認してください。 3. Composerを用いてLaravelをインストール+プロジェクトを作成 参考サイト:【PHP/Laravel】開発環境構築(Mac版) プロジェクトを作成したい場所にカレントディレクトリを移動し、 $ composer create-project "laravel/laravel=8.*" プロジェクト名 (プロジェクト名の部分は任意の名前を設定してください。またLaravelのバージョンはここでは8としていますが、任意のバージョンで大丈夫です。) 上記コマンドでLaravelをインストール&プロジェクトを作成してください。プロジェクトの作成後、作成したプロジェクトにカレントディレクトリを移動して $ php artisan serve 上記コマンドを実行して表示されるURLにブラウザでアクセスし、プロジェクトが正しく動作することを確認してください(ローカルサーバーを停止させたい時はCtrl+Cを押してください)。 以降、作成したプロジェクトがカレントディレクトリになっている状態として説明を続けていきます。 Eclipseに Laravelプロジェクトをインポートする ※ここの作業はEclipseにLaravelプロジェクトを読み込ませたい場合の手順なので、今ではなくLaravelプロジェクトのデプロイ後に実施しても大丈夫です。 1.  Eclipseのメニューバーから ファイル > インポートを選択 2.  PHP > 既存のComposerプロジェクト を選択 3.  作成したLaravelプロジェクトを参照で選択する。プロジェクト名に任意の名前を入力して完了を押すと、Eclipse上にLaravelプロジェクトがインポートされる 4. Google Cloud Platformの利用登録とGoogle App Engineのプロジェクト作成 参考サイト:ゼロから始める Google App Engine の使い方(2017年) 上記サイトを参考に、Google Cloud Platformの利用登録とGoogle App Engineのプロジェクト作成を行なってください(作成したプロジェクトについて、請求は有効にしてください)。 ここでGoogle Cloud PlatformとGoogle App Engineの概要について簡単に触れると、 Google Cloud Platform: Googleが提供するクラウド上のサービス群。データ解析や機械学習系など様々なサービスがある。利用登録後、90日間($300相当)無料トライアルで利用できる。 Google App Engine: Google Cloud Platformのサービスの1つで、Webアプリケーションを公開することができる。JavaやPython、PHPなどに対応している。無料枠が存在する。 Google Cloud Platformの利用登録をする際に支払い方法を設定する必要がありますが、利用登録後90日間は無料トライアルを利用できます。また無料トライアル期間が終了して有料アカウントに切り替えても、無料枠に収めて運用することができれば課金はされません。 ※無料トライアルが終了した後は有料アカウントに切り替える必要があります(切り替えない場合、プロジェクトのリソースが削除されてしまう)。 5. Google Cloud SDKのインストール 参考サイト:【Mac】gcloudコマンドのインストール $ curl https://sdk.cloud.google.com | bash 上記コマンドを実行してGoogle Cloud SDKをインストールし、ターミナル上でgcloudコマンドが使える状態にしてください(上記コマンドを実行すると対話形式で色々聞かれますが、基本的には全てEnter及びyで大丈夫です)。 $ exec -l $SHELL 上記コマンドでシェルを再起動した後、 $ gcloud -v を実行してGoogle Cloud SDKのバージョンが表示されれば正しくインストールされています。 Google Cloud SDKのインストール後、 $ gcloud init を実行して環境を初期化してください(ブラウザで認証を求められるので、Google Cloud Platformの利用登録を行なったGoogleアカウントで認証してください)。 ターミナル上で使用するアカウントを聞かれた場合は登録を行なったアカウントを、使用するプロジェクトを聞かれた場合は登録したプロジェクトを選択してください。 6. app.yamlの作成とbootstrap/app.phpの編集 参考サイト: Laravel6をGoogle App Engineで動かす Google App Engine(GAE)を無料枠で収めるための勘所 Laravelプロジェクト内にapp.yamlを作成します。一例ですが、内容は以下のようにします(環境変数の設定と、プロジェクトをできるだけ無料枠で収めるためにしておきたい設定を書いています)。 app.yaml runtime: php73 env: standard instance_class: F1 env_variables: ## Put production environment variables here. APP_KEY: YOUR_APP_KEY APP_STORAGE: /tmp VIEW_COMPILED_PATH: /tmp SESSION_DRIVER: cookie automatic_scaling: min_idle_instances: automatic max_idle_instances: 1 min_pending_latency: 3000ms max_pending_latency: automatic max_instances: 2 runtimeのphp**の値はPHPのバージョンに合わせて設定します(例:PHPのバージョンが7.2であれば72)。 またYOUR_APP_KEYの部分には $ php artisan key:generate --show --no-ansi の実行結果を書いてください(以下のコマンドを実行すると自動的に書き替えてくれます)。 $ sed -i '' "s#YOUR_APP_KEY#$(php artisan key:generate --show --no-ansi)#" app.yaml 次に、bootstrap/app.phpのreturn $app;の手前に以下の内容を追記します。 bootstrap/app.php /* |-------------------------------------------------------------------------- | Set Storage Path |-------------------------------------------------------------------------- | | This script allows you to override the default storage location used by | the application. You may set the APP_STORAGE environment variable | in your .env file, if not set the default location will be used | */ $app->useStoragePath(env('APP_STORAGE', base_path() . '/storage')); 7. Laravelプロジェクトをデプロイ 参考サイト:Laravel6をGoogle App Engineで動かす $ gcloud app deploy 上記コマンドを実行して、LaravelプロジェクトをGoogle App Engineにデプロイします。 途中でどのリージョンにデプロイするかを聞かれると思うので、任意のものを選択してください(リージョンによって無料枠を超えた場合にかかる費用が若干異なるみたいですが、大きな違いはないのであまり気にしなくて大丈夫だと思います。特別な理由がなければ、距離的に近い東京(asia-northeast1)または大阪(asia-northeast2)を選ぶと良いと思います)。 何もエラーが出なければデプロイ成功です。以下のコマンドを実行することで、ブラウザ上でページを表示することができます。 $ gcloud app browse なお、もし上記コマンドを実行してブラウザ上でページを表示させた時に Class 'NunoMaduro\Collision\Adapters\Laravel\CollisionServiceProvider' not found といったエラーが表示された場合、composer.jsonの "require-dev" 内にある"nunomaduro/larastan": "^{バージョン}"を "require" に移動してみてください(参考ページ)。 以降、ファイルを編集してApp Engine上にその内容を反映させたい場合は $ gcloud app deploy を実行してデプロイを行なってください。 ローカル環境でページを確認したい場合は $ php artisan serve を実行して表示されるURLにアクセスし、公開したページを表示したい場合は $ gcloud app browse を実行してください(App EngineのダッシュボードにURLが表示されているのでそこからアクセスしてもOKです)。 無料枠で運用するためにやっておきたいこと 参考サイト:App Engine の費用の管理 意図せぬ形で料金を請求されてしまうことがないよう、項目6で述べたようにapp.yamlにmax_instances等を設定したり、プロジェクトの設定画面から予算アラートを設定しておきましょう(設定次第では指定したしきい値を超えた場合にアプリを自動的に無効化することもできるみたいです)。 無料枠を超えてしまった等、アプリを停止させたい場合はApp Engineの設定画面の「アプリケーションを無効にする」を押すことで一時的に停止させることができます(後で再開させることもできます)。 万が一に備えて、無料枠で運用できているかこまめにApp Engineのダッシュボードは確認しましょう。 以上、Laravelプロジェクトの作成〜App Engineにデプロイするまでの手順をまとめてみました。最後まで読んでくださりありがとうございました!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む