20210410のlaravelに関する記事は15件です。

初学者がLaravelを学び始める1

はじめに ララベルでアプリにアクセスし処理を行うにはアドレスと処理を関連づけるルーティングと全体の制御を行うコントローラーが必要となる。 ルーティング 一般的なウェブサイトではwebサーバーの公開フォルダの中にファイルを用意しておくとそのままファイルが表示されます。例えばwebappというフォルダにhelo.htmlと言うファイルを用意すれば、http://〇〇/webapp/helo.htmlというアドレスにアクセスすると自動的にそのファイルが読み込まれ表示されます。 しかしLaravelを使っている場合はそうはできません。 Laravelでは特定のアドレスにアクセスされるとそのアドレスに割り振られたプログラムが実行されそれによって必要な処理や画面が表示されます。 このような〇〇アドレスにアクセスした場合に✖️✖️という処理を行うというのがルーティングです。 routesフォルダについて web.phpのファイルは一般的なwebページにアクセスするためのルーティングです。 基本的にwebページに後悔するものは全てこのweb.phpにルート情報を記述すると考えてよい。(当分の間はそれ以外のファイルは使用しない。) ルート情報の記述 <?php Route::get('/', function () { return view('welcome'); }); このようにweb.phpに書かれていた場合ですが 今回はトップページにアクセスした際の処理を記述しています。Laravelのアプリではデフォルトでトップページの処理が記述されています。 ルートの基本情報の見方ですが Route::get('アドレス', 関数など ); というふうになっています。 第一引数には割り当てられるアドレス、第二引数には処理を指定します。 ちなみに第二引数には関数以外にもコントローラーを指定することもあります。 getを使ってアドレスと処理を割り当てることがルートの情報設定の基本です。 トップページのルート情報 今回は第二引数には関数を指定しておりますが、引数なしの無名関数(グロージャ関数)となっております。 内部ではreturnで戻り値を指定しておりここで返される戻り値がそのアドレスにアクセスした際に表示される内容となります。ここではviewという関数を使って戻り値を用意しています。これは以下のように使用します。 view(テンプレート名) このviewは指定されたテンプレートファイルをロードしてレンダリングして返すという役割があリます。 要するに今回はwelcomeとあるのでwelcomeのviewが表示されることになります。(正確にはwelcome.blade.php) また、基本的にビューはHTMLのコードが書かれているように見えますが@マークから始まるような文も多く存在します。 これはbladeと呼ばれるテンプレートエンジンをつかて書かれたソースコードです。 ララベルではPHPをそのまま使ってウェブページを作ることもできますが、bladeテンプレートエンジンを使うことの方が多いです。 簡単に仕組みを解説するとviewフォルダの中にテンプレートファイルが用意され、それをview関数で読み込んで表示しているということになります。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

includeとrequireの違い

1つのファイルに共通するコードを書いておき、個別のファイルからそのファイルを読み込んでプログラムを効率的に作成する方法です。 includeとrequire 書き方は、下記のような書き方です。 これはどちらも変わりません。 include 'ファイル名'; include 指定されたファイルが読み込めない場合でも処理を継続します。 require 指定されたファイルが読み込めない場合は処理中止。 include_once すでに同じファイルが読み込まれている場合はincludeを実行しない。 require_once すでに同じファイルが読み込まれている場合はrequireを実行しない。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelでIntervention/Imageを使う際に、GD拡張機能を使えるようにするためのDockerfileの書き方

環境 ・Docker, docker-composeを用いてLEMP(laravel, php-fpm, nginx, MySQL)環境 ・php-fpm7.3 ・MySQL8.0 ・nginx1.8 概要 LaravelでIntervention/Imageを使って画像のアップロード機能を実装する際に、以下のエラーが出た。 エラー GD Library extension not available with this PHP installation 「このPHPインストール環境では、GD拡張機能は使えませんよ」という意味。 同様の事例 同様の事例を調べたところ、以下の記事がヒットした。 LaravelでGD Library extension not available with this PHP installation.のエラーが出た時の対処法 この記事によると、「Intervention/Image」はPHP5.4以上では、画像処理ライブラリのGDまたはImageMagickをインストールする必要があり、下記の対処を行えば良いとのこと。 apt-get update apt-get install php7.0-gd しかし、Dockerfileに上記apt-get install php7.0-gdを追記してもそんなパッケージはありませんと怒られてしまう。 対処 DockerでGD拡張機能を使うためにDockerfileをどのように書き換えれば良いか模索した結果以下の記事とその参考元のDockerfileの使い方の表記を発見。 ・ DockerでのGD拡張についてPHP/Laravel ・ https://hub.docker.com/_/php 上記を参考にphp実行環境のDockerfileを以下のように修正 Dockerfile FROM php:7.4-fpm-buster SHELL ["/bin/bash", "-oeux", "pipefail", "-c"] ENV \ COMPOSER_ALLOW_SUPERUSER=1 \ COMPOSER_HOME=/composer COPY --from=composer:2.0 /usr/bin/composer /usr/bin/composer RUN apt-get update RUN apt-get -y install git libicu-dev libonig-dev libzip-dev unzip locales \ + libfreetype6-dev libjpeg62-turbo-dev libpng-dev && \ //追記:GD拡張に必要なパッケージ apt-get clean && \ rm -rf /var/lib/apt/lists/* && \ locale-gen en_US.UTF-8 && \ localedef -f UTF-8 -i en_US en_US.UTF-8 && \ mkdir /var/run/php-fpm && \ mkdir /var/log/php && \ docker-php-ext-install intl pdo_mysql zip bcmath && \ + docker-php-ext-configure gd --with-freetype --with-jpeg && \ //追記 + docker-php-ext-install -j$(nproc) gd && \ //追記 composer config -g process-timeout 3600 && \ composer config -g repos.packagist composer https://packagist.org COPY ./php-fpm.d/zzz-www.conf /usr/local/etc/php-fpm.d/zzz-www.conf COPY ./php.ini /usr/local/etc/php/php.ini WORKDIR /work/backend 結論 GD拡張機能を使えるようにするためには、Dockerfileに下記コードを追記する必要がありました。 apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev docker-php-ext-configure gd --with-freetype --with-jpeg && \ docker-php-ext-install -j$(nproc) gd 参考 ・ LaravelでGD Library extension not available with this PHP installation.のエラーが出た時の対処法 ・ DockerでのGD拡張についてPHP/Laravel ・ https://hub.docker.com/_/php  →特に参考になりました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelでIntervention/Imageを使う際に、GD拡張機能を使うためのDockerfileの書き方

環境 ・Docker, docker-composeを用いてLEMP(laravel, php-fpm, nginx, MySQL)環境 ・php-fpm7.3 ・MySQL8.0 ・nginx1.8 概要 LaravelでIntervention/Imageを使って画像のアップロード機能を実装する際に、以下のエラーが出た。 エラー GD Library extension not available with this PHP installation 「このPHPインストール環境では、GD拡張機能は使えませんよ」という意味。 同様の事例 同様の事例を調べたところ、以下の記事がヒットした。 LaravelでGD Library extension not available with this PHP installation.のエラーが出た時の対処法 この記事によると、「Intervention/Image」はPHP5.4以上では、画像処理ライブラリのGDまたはImageMagickをインストールする必要があり、下記の対処を行えば良いとのこと。 apt-get update apt-get install php7.0-gd しかし、Dockerfileに上記apt-get install php7.0-gdを追記してもそんなパッケージはありませんと怒られてしまう。 対処 DockerでGD拡張機能を使うためにDockerfileをどのように書き換えれば良いか模索した結果以下の記事とその参考元のDockerfileの使い方の表記を発見。 ・ DockerでのGD拡張についてPHP/Laravel ・ https://hub.docker.com/_/php 上記を参考にphp実行環境のDockerfileを以下のように修正 Dockerfile FROM php:7.4-fpm-buster SHELL ["/bin/bash", "-oeux", "pipefail", "-c"] ENV \ COMPOSER_ALLOW_SUPERUSER=1 \ COMPOSER_HOME=/composer COPY --from=composer:2.0 /usr/bin/composer /usr/bin/composer RUN apt-get update RUN apt-get -y install git libicu-dev libonig-dev libzip-dev unzip locales \ + libfreetype6-dev libjpeg62-turbo-dev libpng-dev && \ //追記:GD拡張に必要なパッケージ apt-get clean && \ rm -rf /var/lib/apt/lists/* && \ locale-gen en_US.UTF-8 && \ localedef -f UTF-8 -i en_US en_US.UTF-8 && \ mkdir /var/run/php-fpm && \ mkdir /var/log/php && \ docker-php-ext-install intl pdo_mysql zip bcmath && \ + docker-php-ext-configure gd --with-freetype --with-jpeg && \ //追記 + docker-php-ext-install -j$(nproc) gd && \ //追記 composer config -g process-timeout 3600 && \ composer config -g repos.packagist composer https://packagist.org COPY ./php-fpm.d/zzz-www.conf /usr/local/etc/php-fpm.d/zzz-www.conf COPY ./php.ini /usr/local/etc/php/php.ini WORKDIR /work/backend 結論 LEMP環境下でGD拡張機能を使えるようにするためには、Dockerfileに下記コードを追記する必要がありました。 apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev docker-php-ext-configure gd --with-freetype --with-jpeg && \ docker-php-ext-install -j$(nproc) gd 参考 ・ LaravelでGD Library extension not available with this PHP installation.のエラーが出た時の対処法 ・ DockerでのGD拡張についてPHP/Laravel ・ https://hub.docker.com/_/php  →特に参考になりました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】便利なService(サービス)の使い方を実際に使って理解する。ブレードやコントローラで使う実例。

LaravelのServiceを使うと、Servicesの配下に作成したphpファイルに記述した処理をブレードの中で実行することができる。 @injectディレクティブを使うと超簡単に呼び出せる。 目次 Serviceの用途 ファイルの作成 ブレードで呼び出す方法 コントローラで呼び出す方法 ブレードでifと組み合わせる方法 Serviceの用途 ブレードやコントローラの中で呼び出す関数やプロパティを定義できる。使い方は自由度が高く、例えば以下があげられる。 コントローラの処理をサービスに移行する ルート名によってmeta情報の適用を変更する メール送信用の本文を作成する チャットにメッセージを投げる APIのデータを取得する 仕組みはとても簡単なので、実際に使ってみるとわかりやすい。 1. ファイルの作成 サービスファイルは app > Services 配下に作成する。ファイル名はアッパーキャメルで記載する。 ファイルは冒頭に名前空間namespace App\Services;を記述してからクラスを記述する。 作成例 testServiceというサービスコンテナを作成する。 $ mkdir app/Services $ vi app/Services/testService.php testService.php <?php namespace App\Services; class TestService { public static function test() { return "staticメソッド in TestService"; } public function test1() { return "インスタンスメソッド in TestService"; } } 試しに、staticメソッド(test)とインスタンスメソッド(test1)を作成している。 ・staticメソッドとは、インスタンスを生成せずともクラスから直接呼び出せるメソッド。 ・インスタンスメソッドとは、生成したインスタンスから呼び出せるメソッド。 (参考)PHP staticの使い方と意味 2. ブレードで呼び出す方法 ・@inject( '変数名', 'サービスの名前空間' ) .blade.php @inject ( 'TestService', 'App\Services\TestService' ) これで、作成したサービスを$TestServiceとしてブレード内で呼び出せる。 メソッドの呼び出し PHPのルールに従って、staticメソッドを呼び出す場合はクラス名::メソッド名、インスタンスメソッドはインスタンス名::メソッド名。 @injectで読み込んだ変数はクラスとしてもインスタンス(オブジェクト)としても使える。 .blade.php @inject ( 'TestService', 'App\Services\TestService' ) {{-- staticメソッドの呼び出し --}} <div>{{ $TestService::test() }}</div> {{-- インスタンスメソッドの呼び出し --}} <div>{{ $TestService->test1() }}</div> {{-- --}}はコメントアウト。 ▼ブラウザの表示 サービスに記述した処理を簡単に呼び出すことができた。 3. コントローラで呼び出す方法 コントローラで呼び出す場合は冒頭でuse 名前空間で読み込めば使えるようになる。 Controller.php namespace App\Http\Controllers; use Illuminate\Http\Request; //サービスの読み込み use App\Services\TestService; class UserController extends Controller { public function index(TestService $instance) { //(1)サービスのstaticメソッド呼び出し dump( TestService::test() ); //(2)サービスのインスタンスメソッド呼び出し $obj = new TestService; dump( $obj->test1() ); //(3)サービスのインスタンスメソッド呼び出し(依存注入) dump( $instance->test1() ) return view('user'); } (2)(3)はインスタンスメソッドを呼び出すため、インスタンス(オブジェクト)を生成する必要がある。 (3)は関数の引数の中でクラスをインスタンス化し変数に注入している。依存注入と呼ぶ。 ▼ブラウザの表示 コントローラの中でサービスのメソッドを呼び出せている。 4. ブレードでifと組み合わせる サービスとif文を組み合わせれば、ルート名によってif文で処理を切り分けることも可能。 例えば、ページによってメタタグに渡す値を変更する処理を記述したmetaServiceというサービスを作成する。 中にエラーの場合の処理や、引数を渡した場合の処理などを記述しておくと、ページに合わせてメタ情報を切り替えることができる。 base.blade.php @inject('metaService', 'App\Services\metaService') @php if(isset($exception)){ $meta = $metaService::createMetaForError($exception); }elseif(Route::currentRouteName() === 'blog.show' || Route::currentRouteName() === 'blog.preview'){ $meta = $metaService::createMeta($article); }else{ $meta = $metaService::createMeta(); } @endphp <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"> <meta name="description" content="{{ $meta['description'] }}"> <meta name="keywords" content="{{ $meta['keywords'] }}"> <title>{{ $meta['title'] }}</title> 以下省略,,, サービスの例は以下。 metaService.php <?php namespace App\Services; use LaravelMicresArticle\Services\ItemService; class PageService { public static function createMetaForError($exception):array { $code = $exception->getStatusCode(); if(__('error.' . $code . '.message') === 'error.' . $code . '.message'){ $description = __('page.errors.common.description'); }else{ $description = __('error.' .$code. '.message'); } $meta['title'] = __('page.errors.common.title', ['code' => $code]) . ' | サイト名'; $meta['keywords'] = ' キーワード1, キーワード2 ' . __('page.errors.common.keywords', ['code' => $code]) ; $meta['description'] = $description; return $meta; } //$articleのデフォルト値はnull public static function createMeta($article = null):array { $meta = []; $routeName = \Route::currentRouteName(); $categorySlug = array_key_exists('category_slug', \Route::current()->parameters())? \Route::current()->parameters()['category_slug'] : null; if($categorySlug) $routeName .= '.' . $categorySlug; //title if(__('page.' . $routeName . '.title') === 'page.' . $routeName . '.title'){ $meta['title'] = 'サイト名'; }else{ $meta['title'] = __('page.' . $routeName . '.title') . ' | サイト名'; } //keywords $meta['keywords'] = ' キーワード1, キーワード2 ' . __('page.' . $routeName . '.keywords'); //description $meta['description'] = __('page.' . $routeName . '.description'); //article if(\Route::currentRouteName() === 'blog.show' && $article){ $meta['title'] = $article->title . ' | サイト名'; $meta['keywords'] = 'キーワード1, キーワード2, ' . $article->keywords; $meta['description'] = $article->desc; } return $meta; } 必要に応じて条件分岐や、メソッドを追加することでメンテできる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】php artisan migrateエラーが出た SQLSTATE[HY000] [2054]

今回、php artisan migrateでエラーが出て困ったので投稿します。 SQLSTATE[HY000] [2054] The server requested authentication method unknown 認証方式が知らんとか言われた。どうしよ、、、じゃあMySQLで確認しますか。 mysql> select user, host, plugin from mysql.user; 確認するとrootユーザーのパスワードの認証方式はcaching_sha2_passwordであった。なんかMySQL8.0ではデフォルトでこうなっているらしい??? なので変更しましょう! mysql> alter user 'root'@'localhost' identified with mysql_native_password by 'root'; これで変更して無事実行できました!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP・Laravel】クラス内のstaticの意味と使い方まとめ

LaravelなどPHPファイルのクラスの中で使われているstaticという記載の使い方について。 変数(プロパティ)に適用する場合と、メソッドに適用する場合の2パターンがある。 目次 staticの意味 staticはいつ使うか? staticの使い方 アクセス権限の種類 staticプロパティの設定例 staticメソッドの設定例 メソッドを呼び出す時の注意点 staticの意味 静的という意味。 通常クラスの中で定義した変数(プロパティ)やメソッドを呼び出すためにはインスタンスを生成する必要がある。元々存在しないものを生み出すのでこれはdynamic(動的)といえる。 一方、static(静的)では、インスタンスを生成せずクラスを直接指定して、変数やインスタンスを呼び出せるようにできる。(←★超重要) staticはいつ使うか? アプリケーションの中で複数回登場する関数やプロパティを定義するときに使える。 ヘルパーも似た機能だが、ヘルパーの場合は作成したメソッド名をどこでも呼び出せるのに対し、staticはそのクラスを呼び出した場合のみで使える。 プロパティ名やメソッド名が被りそうな場合や、ある特定の目的のプロパティやメソッドをまとめる場合に使うと便利。 (参考)Laravel:ヘルパ関数の作り方 staticの使い方 ・変数への適用 [アクセス権限] static $変数名 = 値; アクセス権限は必須。verで定義した場合はpublicになる。 ・メソッドへの適用 [アクセス権限] static function メソッド名(){}; アクセス権限がない場合はpublicと同じになる。 アクセス権限の種類 アクセス権限は縛りの強い順に以下のようになる。 private :定義したクラス内のみ protected :継承クラス(子クラス)からもアクセス可能 public :クラスの外からアクセス可能 記載なし(function) :publicと同じ 記載なし(プロパティをvarで定義) :publicと同じ staticプロパティの設定例 クラスを直接指定して呼び出した場合 TestClassを作成して、通常のクラスプロパティとstaticプロパティを作成し、それぞれをクラスの外から呼び出してみる。 testClass.php <?php class TestClass{ public $name = "名前"; public static $staticName = "staticな名前"; } //クラスの外で呼び出し echo TestClass::$staticName; staticな名前 echo TestClass::$name; //Warning: Uncaught Error: //Access to undeclared static property: //TestClass::$name in php shell code:1 ・TestClass::$staticName;は値を呼び出すことができた。 ・TestClass::$name;はエラーになった。(インスタンスを生成してないので存在しない) インスタンスを生成して呼び出した場合 今後はインスタンスを生成してそれぞれの値を呼び出してみる。 testClass.php class TestClass{ public $name = "名前"; public static $staticName = "staticな名前"; } //クラスの外でインスタンス生成し呼び出し $test = new TestClass; echo $test->staticName; //(何も表示されない) echo echo $test->name; 名前 ・staticNameはインスタンスの中にないので空。 ・nameはデフォルトの「名前」が呼び出される。 staticメソッドの設定例 メソッドの場合もstaticを付ければクラスの外からインスタンス(オブジェクト)を生成せずに呼び出せる。 testClass.php class TestClass{ public function test(){ echo "インスタンスメソッド"; } public static function testStatic(){ echo "staticメソッド"; } } //メソッドの呼び出し TestClass::testStatic(); //"staticメソッド" TestClass::test(); //インスタンスメソッドの呼び出し $obj = new TestClass; $obj->test(); //インスタンスメソッド メソッドを呼び出す時の注意点 staticメソッドの中でインスタンスプロパティを呼び出すことはできない。 static functionと$this->インスタンスプロパティ名の組み合わせはエラーになる。 NG例 class Static{ public $name = "名前"; public static $staticName = "static名前"; //staticメソッドの中にインスタンスプロパティが入っているとエラーになる。 public function static staticFunc(){ echo self::$staticName; echo $this->name; } } $obj = new Static; $obj->staticFunc(); //Warning: Uncaught Error: //Call to undefined method Dynamic::staticFunc() in php shell code:1 Static::saticFunc(); //Warning: Uncaught Error: //Call to undefined method Dynamic::staticFunc() in php shell code:1 ▼OK事例 メソッドにstaticがなければ、インスタンスプロパティを呼び出せる。 OK class Dynamic{ public $name = "名前"; public static $staticName = "static名前"; public function dynamicFunc(){ echo self::$staticName; echo $this->name; } } $obj = new Dynamic; $obj->dynamicFunc(); //static名前名前 Dynamic::dynamicFunc() //(出力なし・・・staticメソッドが存在しない) ・自分のクラスの中でクラス自身を呼び出す場合はself::を使う。 ・インスタンスプロパティを呼び出す場合はオブジェクトとして$thisを使う。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelのカスタムファイルシステムを使用してCloudStorageを統合する

Laravelのファイルストレージを利用してCloudStorageを扱えるようにしてみます。Laravelに統合するにあたってゼロからつくるのではなくすでにパッケージが有志の方によって作られているのでこれを利用したいと思います。 導入 READMEに書かれている通りcomposeをつかってインストールします。インストールした後は、.envとfilesystem.phpに必要な情報を追加してください。 エラーを回避する バケットのアクセスコントロールが「均一」になっているとlaravel-google-cloud-storageを使ってオブジェクトをアップロードすると失敗します。 Cannot insert legacy ACL for an object when uniform bucket-level access is enabled おそらく原因はgithubのissueのコメントに書かれていることなのではないかと思います。 https://github.com/Superbalist/laravel-google-cloud-storage/issues/80#issuecomment-616557477 なので、このままではバケットのアクセスコントロールが「均一」になっているとこのファイルシステムでのアプロード機能が使えなくなるので、少し手を加えます。 ServiceProviderを作成する エラーが起きる原因は、laravel-google-cloud-storageがアダプターとしてflysystem-google-cloud-storageを利用していることにあります。エラーを回避する方法がプルリクエストで提案されています。要は、GoogleStorageAdapterクラスのgetOptionsFromConfigメソッドをいじりたいので、GoogleStorageAdapterクラスを拡張したクラスを作成して、getOptionsFromConfigメソッドをオーバーライドしてアクセスコントロールが「均一」のバケットにも対応できるように処理を修正して、このクラス自身を返すというものです。これをLaravelのカスタムファイルシステムで実現させるために、独自のサービスクラスを作ります。作成したサービスプロバイダーの中身は下記になります。 app/providers/GoogleCloudStorageServiceProvider.php <?php namespace App\Providers; use Google\Cloud\Storage\StorageClient; use Illuminate\Support\Arr; use Superbalist\LaravelGoogleCloudStorage\GoogleCloudStorageServiceProvider as GCSProvider; use Superbalist\Flysystem\GoogleStorage\GoogleStorageAdapter; class GoogleCloudStorageServiceProvider extends GCSProvider { /** * Create a new StorageClient * * @param mixed $config * @return \Google\Cloud\Storage\StorageClient */ private function createClient($config) { $keyFile = Arr::get($config, 'key_file'); if (is_string($keyFile)) { return new StorageClient([ 'projectId' => $config['project_id'], 'keyFilePath' => $keyFile, ]); } if (! is_array($keyFile)) { $keyFile = []; } return new StorageClient([ 'projectId' => $config['project_id'], 'keyFile' => array_merge(["project_id" => $config['project_id']], $keyFile) ]); } public function boot() { $factory = $this->app->make('filesystem'); /* @var FilesystemManager $factory */ $factory->extend('gcs', function ($app, $config) { $storageClient = $this->createClient($config); $bucket = $storageClient->bucket($config['bucket']); $pathPrefix = Arr::get($config, 'path_prefix'); $storageApiUri = Arr::get($config, 'storage_api_uri'); $adapter = $this->resolveAdapter($storageClient, $bucket, $pathPrefix, $storageApiUri); return $this->createFilesystem($adapter, $config); }); } public function resolveAdapter($storageClient, $bucket, $pathPrefix = null, $storageApiUri = null) { return new class ($storageClient, $bucket, $pathPrefix, $storageApiUri) extends GoogleStorageAdapter { protected function getOptionsFromConfig(\League\Flysystem\Config $config) { $options = []; if (empty($this->bucket->info()['iamConfiguration']['uniformBucketLevelAccess']['enabled'])) { if ($visibility = $config->get('visibility')) { $options['predefinedAcl'] = $this->getPredefinedAclForVisibility($visibility); } else { $options['predefinedAcl'] = $this->getPredefinedAclForVisibility(AdapterInterface::VISIBILITY_PRIVATE); } } if ($metadata = $config->get('metadata')) { $options['metadata'] = $metadata; } return $options; } }; } } createFilesystemに渡す$adapterに、GoogleStorageAdapterを拡張したクラスを渡しています。またこのサービスクラスもlaravel-google-cloud-storageのGoogleCloudStorageServiceProviderを拡張しています。 作成したサービスプロバイダーをapp.phpに登録します。 config/app.php ... 'providers' => [ ... App\Providers\GoogleCloudStorageServiceProvider::class, ], ... 必要な作業は終わりました。これでアクセスコントロールが「均一」のバケットに対してもオブジェクトがアップロードできるようになります。 public function upload(Request $request) { $file = $request->file('test'); $disk = Storage::disk('gcs'); $disk->put('test.txt', file_get_contents($file)); } Laravelでカスタムファイルシステムを作成する方法については、下記の記事で解説しているのでぜひ参考にしてみてください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelの知識を資産化していく①

前提として 自分が勉強してきた知識を保存するために書いています。 本当に初歩的な事から書いていってます。 万が一間違っている可能性もございますので、その時はご指摘頂ければ嬉しいです。 常時更新していく予定です。 アウトプット用ですので、MAMPを使用していきます。 Laravelのインストール ターミナル $ composer create-project laravel/laravel task_test --prefer-dist "6.0.*" 上記のコマンドでバージョンを指定してプロジェクトを作成していきます。 「task_test」の箇所がプロジェクト名になります。 この他にもいろいろな書き方があります。 ターミナル # バージョンの指定なし(最新版のLaravelをインストール, 初期値でmysqlを利用する) $ composer create-project --prefer-dist laravel/laravel プロジェクト名 # バージョンの指定あり(初期値でmysqlを利用する) $ composer create-project --prefer-dist "laravel/laravel=5.5.*" task_test #書き方はいろいろある $ composer create-project laravel/laravel task_test --prefer-dist "5.5.*" タイムゾーンを日本語に変更 config/app.php 'timezone' => 'UTC', #UTCをAsia/Tokyoに変更します 'timezone' => 'Asia/Tokyo', 言語を日本語に変更 config/app.php 'locale' => 'en', #enをjaに変更します 'locale' => 'ja', DBの文字設定 config/app.php 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', #mb4を消す(顔文字を不要) 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', デバッグバーのインストール ターミナル $ composer require barryvdh/laravel-debugbar 画面の下にデバッグバーが表示される メモリ割当などの設定を弄らないとダメな時は、 tinkerの導入 COMPOSER_MEMORY_LIMIT=-1 composer require barryvdh/laravel-debugbar 「COMPOSER_MEMORY_LIMIT=-1」で、メモリの制限を無しにする。 composer requireで"Allowed memory size of 1610612736 bytes exhausted"エラーが出た場合の対処法 画面上で非表示にするために、.envファイルを変更する .env APP_DEBUG=true #falseに変更します APP_DEBUG=false これをしても画面に残っている場合は、キャッシュを消す ターミナル php artisan cache:clear php artisan config:clear php artisan route:clear php artisan view:clear 何かと反映しない場合は、上記のコマンドでキャッシュを削除して反映させるので、このコマンドはよく使う。 Laravelデバッグバー を使ったデバッグ方法 データベース設定 .envファイル内の下記のDB設定における、DATABASE名、USERNAME名、PASSWORDを設定していく .env(初期設定) // アプリ名の変更 APP_NAME=Laravel //DB情報を変更する DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD= MAMPでデータベースを作成する MAMPでUSERを作成する 上の「特権」から、新規作成の「ユーザーアカウントを追加」をクリック ユーザー名とパスワードを入力する。 今回はテスト用として作成する ・ ユーザー名 : laravel_user ・ パスワード : password123 ・ 再入力  : password123 入力後、1番右下の「実行」をクリックする 新しく作成したユーザーが追加されたのを確認する 作成した情報を.envに記述する .env DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 //ここはMAMP上で設定されたlocalhostになる DB_DATABASE=laravel_task DB_USERNAME=laravel_user DB_PASSWORD=password123 データベースの接続確認 $ php artisan migrate 以下のように出れば接続できてます。 phpMyAdminでも確認してみる これでLaravelとphpMyAdmin(データベース)の接続が完了。 Laravelの概要 MVCモデル ・ Model : データベースとやりとり ・ View : 見た目 ・ Controller : 処理 ・ Routing : アクセスの振り分け ・ Migration : DBテーブルの履歴管理 Laravelのディレクトリ構造とMVCの処理の流れを理解する ルーティング なぜこの画面が表示できているのか?? この画面に行くルーティングを確認する routes/web.php <?php ・ ・ ・ Route::get('/', function () { //アドレスで処理をする('/'はトップ画面) return view('welcome'); //viewの中の welcome というファイルの中身が表示されるように指示する ビュー PHPフレームワーク「Laravel」におけるビューの使い方を理解しよう Laravel公式:Bladeテンプレート ビューの基本的な考え方① app.blade.phpなどの土台となるhtmlを用意する その中にコンテンツを入れたい場所に @yieid を記述する 他のbladeファイルは、 @extends で土台となるapp.blade.phpを呼び出す 呼び出したら、 @yieid の部分を @section で記述する 部分テンプレートが必要な場合は、 @include で呼び出す ビューの基本的な考え方② viewファイルの指定は、 layout.app のように、 「.」 で指定する 「.」で指定するのは、viewであったり、 web.php の name など。 ビューの基本的な考え方③ コントローラで変数を定義する コントローラ $test_1 = 1; $test_2 = 2; return view('posts.index', compact('test_1', ''_test_2)) コントローラから渡された変数は {{}} で使用する 変数をviewで使用する <div> {{ $test_1 }} </div> @yieid 指定した @section の内容を表示する。 つまり、 @section の内容を埋め込みたい場所 app.blade.php @yieid('content') index.blade.php @section('content', 'これが表示されます') @section('content') こんな書き方もあります @endsection @sectionの使い方 基本 ①@yieid の場所に @section ~ @endsection で記述を追加する ②@yieid なしでも、 @section ~ @show で表示可能。また、 @section で上書きをしたり、 @section ~ @parent ~ @endsection で @show の内容を残しつつ、さらに記述を追加できる @sectionの書き方 //① @endsectionを使わない場合 @section('title', 'アプリ名') //①で変数を渡す場合 @section('title', $post->title) //② @endsectionを使う場合 @section('content') <a></a> @endsection つまり、 @yieid を指定して @endsection を使って書くか、そうでないかのやり方が基本となる @includeは部分テンプレート まとめ // 呼び出すだけ @include('layouts.header') // 変数を渡して呼び出す @include('layouts.header', ['テンプレート内の変数' => 渡す値]) headerを別ファイルにまとめて、土台となるapp.blade.phpに読み込ませる layouts/app.blade.php <body> <div class="flex-center position-ref full-height"> @include('layouts.header') // views/layouts/header.blade.php を読み込む </div> </body> 変数を渡す場合 app.blade.php <body> <h1>All the items:</h1> @foreach ($items as $foo) @include('partials.item-display', ['item' => $foo]) @endforeach </body> item-display.blade.php <div> Name: {{ $item->name }}<br> Description: {{ $item->description }} </div> extends したテンプレートへ挿入したい section はどこに書いても良い extends 宣言の前でも後でも良い include したテンプレートへ挿入したい sectionは、 include するより先に section を書かないといけない section の記述後に include しないといけない Artisanコマンド artisanコマンドの一覧を表示 $ php artisan list モデルファイルの作成 ・ $ php artisan make:model ファイル名 //モデルファイルを作成 ファイル名は単数形で作る ・ $ php artisan make:model ディレクトリ名/ファイル名 //ディレクトリ作成後、直下にモデルファイルを作成 マイグレーション関係 マイグレーションファイルの作成 $ php artisan make:migration create_テーブル名_table //テーブル名は複数形で作る マイグレーションを実行 $ php artisan migrate マイグレーションの履歴を確認 $ php artisan migrate:status マイグレーションをロールバックする $ php artisan migrate:rollback // 1つ前に戻る $ php artisan migrate:rollback --step=5 // 5つ前まで戻る コントローラーファイルを作成 $ php artisan make:controller ファイル名Controller ルーティングの一覧を確認する ・ $ php artisan route:list // ターミナルで確認 ・ $ php artisan route:list > route.text // ファイルで確認 モデル DBのやり取りをPHPで書ける ORM(Object-Relational Mapping)/ORマッパーなど Laravelでは「Eloquent(エロクアント)」がORマッパーの役割をする。 Laravel公式:Eloquent ORM モデルファイルを作成する $ php artisan make:model Models/Test // Modelsディレクトリ作成後、直下にTest.php というModelファイルが作成される app/Models/Test.php <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Test extends Model { // } マイグレーション(Migration) DBテーブルの履歴を管理する 新しくテーブルを作るのはもちろん、カラムを追加、削除したりと、履歴が分かる仕組み。 作成のやり方 $ php artisan make:migration create_tests_table database/migrations/****_**_**_******_create_tests_table.php <?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateTestsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('tests', function (Blueprint $table) { $table->bigIncrements('id'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('tests'); } } 「*」には作成した日付(年・月・日・時間)が入る カラムを作成するにはいくつか型式があるので、公式を確認する Laravel公式:データベース:マイグレーション 使用できるカラムタイプ カラムを追加してみる database/migrations/****_**_**_******_create_tests_table.php <?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateTestsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('tests', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('text', 100); //カラムを追加 $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('tests'); } } マイグレーションを実行する マイグレーションを実行 $ php artisan migrate testsテーブルが追加されたかデータベースを確認する カラムも確認する tinker(DB簡易接続) DBと簡単に接続できる仕組み。 Laravelのtinkerを使えるとちょっと幸せになれる Laravel 標準搭載のデバッグ機能 tinker コマンドのご紹介 tinkerの導入 $ composer require laravel/tinker 実際に使う tinker起動コマンド $ php artisan tinker Psy Shell v0.9.12 (PHP 7.4.12 — cli) by Justin Hileman >>> >>> $test = new App\Models\Test; //モデルをインスタンス化して使う => App\Models\Test {#3241} >>> $test->text = "aaa"; //textカラムに「aaa」と文字を打ってみる => "aaa" >>> $test->save(); //保存する => true //保存成功 >>> App\Models\Test::all(); //Testに入っているデータを全て表示できる => Illuminate\Database\Eloquent\Collection {#3964 all: [ App\Models\Test {#3963 id: 1, text: "aaa", created_at: "2021-04-09 14:22:48", updated_at: "2021-04-09 14:22:48", }, ], } データベースを確認すると、データが反映されている コントローラー ファイルを作成する $ php artisan make:controller TestController app/Http/Controllers/TestController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class TestController extends Controller { // } MVCモデルの書き方 ルーティングからコントローラーに飛ばす routes/web.php <?php // tests/test にアクセスしたら、TestControllerのindexメソッドに飛ばす Route::get('tests/test', 'TestController@index'); コントローラに処理を書く app/Http/Controllers/TestController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class TestController extends Controller { public function index() //ルーティングから飛んできた処理をここで受け取る { return view('tests.test'); //testsディレクトリのtestファイルに飛ばす } } ビューにファイルを作成し、testファイルの中身を表示する ※ビューファイルは基本的に、○○.blade.php とファイル名をつける resources/views/tests/test.blade.php test 簡易サーバーを立ち上げ、「test」と出力されているのを確認する データベースから中身を持ってきて表示してみる app/Http/Controllers/TestController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Test; //ModelsのTest.phpを持ってくる class TestController extends Controller { // public function index() { $values = Test::all(); // $dd($values); //dd は、変数の処理を止めて中身を確認する // コントローラーからビューファイルに $values の変数を渡す return view('tests.test', compact('values')); //compactで変数を渡す } } Laravelのdd() foreachで1つずつ表示させる resources/views/tests/test.blade.php test<br> @foreach($values as $value) {{ $value->id }}<br> {{ $value->text }}<br> @endforeach // データベースに入っている内容が表示される ヘルパ関数 Laravelが用意している便利な関数 Laravel公式:ヘルパ関数 全142種類!Laravelヘルパー関数実例 こちらは種類が多いので別でアウトプット記事書きます。 コレクション型 配列を拡張した型 ・ データベースからデータ取得時はコレクション型になっている ・ コレクション型専用の関数は多数ある ・ メソッドチェーンで記述可能 Laravel公式:コレクション 全117種類!Laravel 5.6〜7.xのコレクション実例 こちらは種類が多いので別でアウトプット記事書きます。 クエリビルダ クエリをPHPで書ける ・ Select, where, groupbyなど、SQLに近い構文 ・ DB::table(テーブル名)-> というようにつなぐ Laravel公式:クエリビルダ LARAVEL クエリビルダでDB操作 DBファサードを使用する app/Http/Controllers/TestController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Test; use Illuminate\Support\Facades\DB; class TestController extends Controller { // public function index() { $values = Test::all(); // 静的メソッド // select で id を指定して、get で値をとる $tests = DB::table('tests')->select('id')->get(); // dd($values); return view('tests.test', compact('values')); } } こちらは種類が多いので別でアウトプット記事書きます。 ファサード config/app.phpの'aliases' で定義されているのが使える。 Laravel公式:ファサード PHPによるデザインパターン入門 - Façade〜シンプルな唯一の窓口 こちらは種類が多いので別でアウトプット記事書きます。 DI(Dependency injection) 依存性の注入。 クラスの内部でインスタンス生成(new)するのではなく、外部で用意して注入すること。 ↓ クラスの中で new をしない。 お問い合わせフォームを作るときに使う。 Laravelワカンネ(゚⊿゚)から「完全に理解した()」までステップアップ Blade テンプレートエンジンのこと。 ・ {{}} でエスケープ処理して表示する ・ @csrfでCSRF(cross-site request forgeries)対策 ・ @foreach @endforeach で配列表示 ・ @section @yield などでテンプレート読み込み welcomeページのファイルを確認してみる resoureces/views/welcome.blade.php // @で書かれたものがbladeの構文 <?php ・ ・ ・ <body> <div class="flex-center position-ref full-height"> @if (Route::has('login')) //テンプレート構文 <div class="top-right links"> @auth //ログイン機能をつけていると、ログイン後に表示 <a href="{{ url('/home') }}">Home</a> @else <a href="{{ route('login') }}">Login</a> @if (Route::has('register')) <a href="{{ route('register') }}">Register</a> @endif @endauth </div> @endif <div class="content"> <div class="title m-b-md"> Laravel </div> <div class="links"> <a href="https://laravel.com/docs">Docs</a> <a href="https://laracasts.com">Laracasts</a> <a href="https://laravel-news.com">News</a> <a href="https://blog.laravel.com">Blog</a> <a href="https://nova.laravel.com">Nova</a> <a href="https://forge.laravel.com">Forge</a> <a href="https://vapor.laravel.com">Vapor</a> <a href="https://github.com/laravel/laravel">GitHub</a> </div> </div> </div> </body> ※ {{}} はXSS攻撃を防ぐため、自動的にPHPの htmlspecialchars 関数を通される。 Laravel公式:Bladeテンプレート クロスサイトスクリプティング(XSS)とは|攻撃の仕組みと対策方法を解説 フロントエンド Laravelで設定が必要なもの ・ laravel-ui // Laravel6.xから ・ laravel-mix // webpackのラッパー ・ webpack.mix.js // laravel-mixの設定ファイル ・ package.json, package.lock //設定管理ファイル ・ Node.js/npm // 別途インストール Laravel-ui 認証 Laravel/uiパッケージをインストール(laravel6の場合) $ composer require laravel/ui:^1.0 --dev $ composer require laravel/ui "1.*" フロントエンドのスカフォールドをインストール // 基本的なスカフォールドを生成 $ php artisan ui bootstrap $ php artisan ui vue $ php artisan ui react // ログイン/ユーザー登録スカフォールドを生成 $ php artisan ui bootstrap --auth $ php artisan ui vue --auth $ php artisan ui react --auth 今回はログイン・ユーザー登録スカフォールドをインストールしていく $ php artisan ui bootstrap --auth ログイン、ユーザー登録関連などのファイルがそれぞれ作成される ブラウザで確認してみる $ php artisan serve 右上に「ログイン」と「ユーザー登録」のボタンができている Bootstrapをインストールしていく package.json ファイルの "devDependencies" 内にあるバージョンをインストールしていく 依存パッケージのインストール $ npm install 「node_modules」というファイルができればOK コンパイルをしていく $ npm run dev 毎回コンパイルをしないといけなくなるので、常に監視しているようにする $ npm run watch ※ ターミナルを3つ起動しておき、 ・ 監視用(npm run watch) ・ ブラウザ用(php artisan serve) ・ 作業用 この画面出たらコンパイルできてます!! ブラウザで「ログイン画面」と「ユーザー登録画面」を確認する ・ ログイン画面 ・ ユーザー登録画面 Laravel公式:JavaScriptとCSSスカフォールド エラーメッセージの日本語化 ①下記のリンクを開く https://github.com/minoryorg/laravel-resources-lang-ja ②ファイルのダウンロード ③ダウンロードしたフォルダを開いて、「ja」というフォルダを確認する ④resources/langフォルダに、ダウンロードしたjaフォルダを追加 ※passwordなどの英語表記のものを日本語にするには、'attributes'内に項目を追加する resources/lang/ja/validation.php 'attributes' => [], //1番下の attributes にパスワードの項目を追加する 'attributes' => [ 'password' => 'パスワード' ], 設定後に確認すると、エラーメッセージが日本語になる。 今後も随時更新していきます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[ Laravel + Vue.js + MySQL ] Herokuにデプロイする方法

執筆動機 Twitterにて個人的にフォローさせていただいているゆーたろーさん(@shimotaroo)の記事を拝見しました。 当記事ではPosgreを使用したものになっていましたが、MySQLの場合ばどうすればいいか知りたくなり、本記事を作成しました。 ゆーたろーさんの記事は初心者でも直感的にわかりやすくなっています。ぜひそちらも参考にデプロイを検討してみてください:) 前提 ・Laravelアプリが作成済み ・Herokuアカウント取得済み ・Heroku CLI導入済み ・DBはMySQLを利用 $ composer -V Composer version 2.0.11 2021-02-24 14:57:23 $ php artisan --version Laravel Framework 8.36.2 $ npm -v 7.8.0 Herokuアプリの作成 ①Herokuのログイン $ heroku login まず初めに、Herokuにログインします。 作成したアプリケーションのディレクトリに移動し、以下のコマンドを打ちます。 ②アプリの作成 $ heroku apps:create [アプリ名] 適当にアプリ名を決めてアプリを作成します。 この時、ユニークな名前でなくてはいけません。 エラーが出る場合は、Heroku上に存在しない名前をつけて再度コマンドを叩いてください。 ③MySQL(ClearDB)の追加 $ heroku addons:create cleardb:ignite その後、Heroku上で使えるMySQL(ClearDB)を追加します。 Cleardbのignite版は、無料で使用する事が可能です。 ただし、クレカを登録する必要があるので、ブラウザ上のHerokuからAccountSettings -> Billingでクレカを登録してください 。 ④Buildpackの追加 $ heroku buildpacks:add heroku/php $ heroku buildpacks:add heroku/nodejs 順番はどっちでも良いです。 DBの環境設定 .envファイルはアップされないので、手動でHerokuに環境変数を登録する必要があります。 ①ClearDBの情報を確認する $ heroku config:get CLEARDB_DATABASE_URL mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true ②Herokuに環境変数を登録 ①を参考に、環境変数を登録していきます。 $ heroku config:set DB_DATABASE=[データベース名] $ heroku config:set DB_HOST=[ホスト名] $ heroku config:set DB_USERNAME=[ユーザー名] $ heroku config:set DB_PASSWORD=[パスワード] $ heroku config:set APP_KEY=$(php artisan key:generate --show) 一番下はそのままコピペでうまくいきます。 最低限これだけ登録できれば、動きます。 ファイルの変更、追加 ①Procfileの追加 ルートディレクトリにProcfileを追加します。 ./Procfile web: vendor/bin/heroku-php-apache2 public/ 上記を記入して終わりです。 ②本番環境でのHTTPS化 AppServiceProvider.app public function boot() { if (\App::environment('production')) { \URL::forceScheme('https'); } } 本番環境でのhttpsを強制します。 AppServiceProvider.appに追加してください。 ③DBの文字数設定 Herokuではvarchar型の文字数はデフォルトの255では大きすぎるため191に設定します。 AppServiceProvider.app use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); } 同じくAppServiceProvider.appのbootに追加してください。 また、useで名前空間をインポートします。 デプロイ ①ローカルリポジトリにHerokuアプリ用のリモートリポジトリを登録 git管理をしていなかった場合 $ git init $ heroku git:remote -a {アプリ名} git管理をすでにしている場合 $ heroku git:remote -a {アプリ名} アプリ名は自分で名付けたものを使用してください。 ②デプロイする $ git checkout -b 'main' $ git add . $ git commit -m 'first commit' $ git push heroku main ③マイグレーションやシーディングの実行 $ heroku run php artisan migrate --seed シーディングを用意していない場合は、--seedを除いてコマンドを叩いてください 。 このように表示されるのでyesと入力してください。 アプリを開いてみる $ heroku open エラーなく表示されたら成功です!! お疲れ様です^^ アドバイス もし上記のようにデプロイしてもうまく表示されない場合は、 herokuのログを確認したり、Laravelのデバックモードをオンにしてみたらいいかも ログの確認 $ heroku logs -t ターミナルからログを確認できます。 詳細なエラーを確認するには、Herokuの環境変数にLOG_CHANNEL=errorlogを設定します。 デバックモード app.php /* |-------------------------------------------------------------------------- | Application Debug Mode |-------------------------------------------------------------------------- | | When your application is in debug mode, detailed error messages with | stack traces will be shown on every error that occurs within your | application. If disabled, a simple generic error page is shown. | */ 'debug' => env('APP_DEBUG', true), 変更したのちにデプロイの手順を取り、エラーを確認できます。 うまく動いたら、デバックモードをfalseにしておきましょう。 参考にさせていただいた記事、ドキュメント
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel + Vue.js + MySQL】 Herokuにデプロイする方法

執筆動機 Twitterにて個人的にフォローさせていただいているゆーたろーさん(@shimotaroo)の記事を拝見しました。 当記事ではPosgreを使用したものになっていましたが、MySQLの場合ばどうすればいいか知りたくなり、本記事を作成しました。 ゆーたろーさんの記事は初心者でも直感的にわかりやすくなっています。ぜひそちらも参考にデプロイを検討してみてください:) 前提 ・Laravelアプリが作成済み ・Herokuアカウント取得済み ・Heroku CLI導入済み ・DBはMySQLを利用 $ composer -V Composer version 2.0.11 2021-02-24 14:57:23 $ php artisan --version Laravel Framework 8.36.2 $ npm -v 7.8.0 Herokuアプリの作成 ①Herokuのログイン $ heroku login まず初めに、Herokuにログインします。 作成したアプリケーションのディレクトリに移動し、以下のコマンドを打ちます。 ②アプリの作成 $ heroku apps:create [アプリ名] 適当にアプリ名を決めてアプリを作成します。 この時、ユニークな名前でなくてはいけません。 エラーが出る場合は、Heroku上に存在しない名前をつけて再度コマンドを叩いてください。 ③MySQL(ClearDB)の追加 $ heroku addons:create cleardb:ignite その後、Heroku上で使えるMySQL(ClearDB)を追加します。 Cleardbのignite版は、無料で使用する事が可能です。 ただし、クレカを登録する必要があるので、ブラウザ上のHerokuからAccountSettings -> Billingでクレカを登録してください 。 ④Buildpackの追加 $ heroku buildpacks:add heroku/php $ heroku buildpacks:add heroku/nodejs 順番はどっちでも良いです。 DBの環境設定 .envファイルはアップされないので、手動でHerokuに環境変数を登録する必要があります。 ①ClearDBの情報を確認する $ heroku config:get CLEARDB_DATABASE_URL mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true ②Herokuに環境変数を登録 ①を参考に、環境変数を登録していきます。 $ heroku config:set DB_DATABASE=[データベース名] $ heroku config:set DB_HOST=[ホスト名] $ heroku config:set DB_USERNAME=[ユーザー名] $ heroku config:set DB_PASSWORD=[パスワード] $ heroku config:set APP_KEY=$(php artisan key:generate --show) 一番下はそのままコピペでうまくいきます。 最低限これだけ登録できれば、動きます。 ファイルの変更、追加 ①Procfileの追加 ルートディレクトリにProcfileを追加します。 ./Procfile web: vendor/bin/heroku-php-apache2 public/ 上記を記入して終わりです。 ②本番環境でのHTTPS化 AppServiceProvider.app public function boot() { if (\App::environment('production')) { \URL::forceScheme('https'); } } 本番環境でのhttpsを強制します。 AppServiceProvider.appに追加してください。 ③DBの文字数設定 Herokuではvarchar型の文字数はデフォルトの255では大きすぎるため191に設定します。 AppServiceProvider.app use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); } 同じくAppServiceProvider.appのbootに追加してください。 また、useで名前空間をインポートします。 デプロイ ①ローカルリポジトリにHerokuアプリ用のリモートリポジトリを登録 git管理をしていなかった場合 $ git init $ heroku git:remote -a {アプリ名} git管理をすでにしている場合 $ heroku git:remote -a {アプリ名} アプリ名は自分で名付けたものを使用してください。 ②デプロイする $ git checkout -b 'main' $ git add . $ git commit -m 'first commit' $ git push heroku main ③マイグレーションやシーディングの実行 $ heroku run php artisan migrate --seed シーディングを用意していない場合は、--seedを除いてコマンドを叩いてください 。 このように表示されるのでyesと入力してください。 アプリを開いてみる $ heroku open エラーなく表示されたら成功です!! お疲れ様です^^ アドバイス もし上記のようにデプロイしてもうまく表示されない場合は、 herokuのログを確認したり、Laravelのデバックモードをオンにしてみたらいいかも ログの確認 $ heroku logs -t ターミナルからログを確認できます。 詳細なエラーを確認するには、Herokuの環境変数にLOG_CHANNEL=errorlogを設定します。 デバックモード app.php /* |-------------------------------------------------------------------------- | Application Debug Mode |-------------------------------------------------------------------------- | | When your application is in debug mode, detailed error messages with | stack traces will be shown on every error that occurs within your | application. If disabled, a simple generic error page is shown. | */ 'debug' => env('APP_DEBUG', true), 変更したのちにデプロイの手順を取り、エラーを確認できます。 うまく動いたら、デバックモードをfalseにしておきましょう。 参考にさせていただいた記事、ドキュメント
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel MIMEのimage/jpegの配列が変化しているので注意する

目的 Laravelの内部ファイルの仕様が一部変更になっていたので注意喚起のための自分メモとして残す 詳細 アプリ名ディレクトリ/vendor/symfony/mime/MimeTypes.phpの'image/jpeg' => ['jpeg', 'jpg', 'jpe'],が'image/jpeg' => ['jpg', 'jpeg', 'jpe'],に変更になった。 コミットへのリンク https://github.com/symfony/symfony/pull/38407/files
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】ルーティングファイル(web.php)の中でリダイレクト設定する方法(パラメータ付きURLに条件分岐で適用する実例)

使わなくなったページをweb.phpの中でリダイレクトする方法について。比較的自由度が高いので、同じ処理でも書き方がいくつか存在する。 302転送と301転送それぞれの指定方法および、 パラメータ付きのURIの転送設定をする場合は、意図しない転送を防ぐために個別にURLを指定することが推奨となる。これを配列とforeachを使って簡潔に記述する方法について。 目次 リダイレクト先をURIで指定する方法 リダイレクト先をルート名で指定する方法 Route::getとreturnを使う方法 パラメータ付きURIの転送設定(条件の設定) 1. リダイレクト先をURIで指定する方法 デフォルトの転送設定は302(一時的な転送)。 301(永続的な転送)にしたい場合は記述する必要がある。 web.php(302転送) Route::redirect('/old-url', '/new-url'); 301転送の設定 web.php(301転送) Route::redirect('/old-url', '/new-url', 301); またはpermanentRedirectメソッドを使う。 web.php(301転送) Route::permanentRedirect('/old-url', '/new-url'); 2. リダイレクト先をルート名で指定する方法 web.php(302転送) //転送先ルート Route::get('/user', 'UserController@index')->name('user'); //リダイレクト設定 Route::redirect('/old-url', route('user') ); 301転送の設定 web.php(301転送) //転送先ルート Route::get('/user', 'UserController@index')->name('user'); //リダイレクト設定 Route::redirect('/old-url', route('user'), 301 ); またはpermanentRedirectメソッドを使う。 web.php(301転送) //転送先ルート Route::get('/user', 'UserController@index')->name('user'); //リダイレクト設定 Route::permanentRedirect('/old-url', route('user') ); 3. Route::getとreturnを使う方法 コントローラ@アクションや、retun viewを指定している部分の戻り値にredirectを指定する。 web.php(302転送) Route::get('/old-url', function(){ return redirect('/new-url'); }); ルート名で指定する場合 web.php(302転送) //転送先ルート Route::get('/user', 'UserController@index') -> name('user'); //リダイレクト設定 Route::get('/old-url', function(){ return redirect() -> route('user'); }); または web.php(302転送) //リダイレクト設定 Route::get('/old-url', function(){ return redirect( route('user') ); }); 301転送の設定 web.php(301転送) Route::get('/old-url', function(){ return redirect( '/new-url', 301 ); }); ルート名で指定する場合 web.php(301転送) //転送先ルート Route::get('/user', 'UserController@index') -> name('user'); //リダイレクト設定 Route::get('/old-url', function(){ return redirect( route('user'), 301 ); }); 4. パラメータ付きURLの転送設定(条件の設定) パラメータ付きのURIの転送設定をする場合は、個別にURLを指定することが推奨される。 ▼個別に指定する理由 リダイレクト対象のURLを明確にする。 意図しないリダイレクトが発生するリスクを防ぐ。 実例 例えば、以下のようにproduct/{prd_slug}で特定の製品名の詳細ページを/productにリダイレクトする処理は以下のようになる。 web.php(元のルーティング) Route::get('product/{prd_slug}', 'ProductController@show') -> name('product.show'); リダイレクトの設定 1. 正規表現で指定する whereメソッドと正規表現を使って指定する。 ->where( 'パラメータ名', '正規表現' ) 正規表現の例 Route::get('user/{name}', function ($name) { // })->where('name', '[A-Za-z]+'); Route::get('user/{id}', function ($id) { // })->where('id', '[0-9]+'); Route::get('user/{id}/{name}', function ($id, $name) { // })->where(['id' => '[0-9]+', 'name' => '[a-z]+']); 配列から正規表現を作成する方法 対象のslugが複数ある場合は配列から正規表現を作成すると簡単。 web.php $removed_slugs = [ 'iphone5', 'iphon6', 'iphone6s' ]; $removed_slugs = implode( '|', $removed_slugs ); $regexs['removed_slugs'] = '(' . $removed_slugs . ')'; ・implode( '繋ぐ文字列', 配列 ) 配列を指定した文字列で繋ぎ合わせて、一つの文字列に変換する。 この処理で、[ 'iphone5', 'iphon6', 'iphone6s' ]を( 'iphone5' | 'iphon6' | 'iphone6s' )に変換できる。 正規表現で( 'aaa' | 'bbb' )の形は、aaaかbbb という意味。 これをwhereメソッドの第2引数で指定する。 web.php $removed_slugs = [ 'iphone5', 'iphon6', 'iphone6s' ]; $removed_slugs = implode( '|', $removed_slugs ); $regexs['removed_slugs'] = '(' . $removed_slugs . ')'; Route::get('product/{product_slug}', function() use ($regexs) { return redirect( route('product'), 301 ); })->where('product_slug', $regexs['removed_slugs'] ); }); ・function() use ($変数名) functionの外で定義した変数を使う場合にはuse ($変数名)で宣言する必要がある。 これがないとエラーになる。 2. foreachで指定する おすすめではないがforeachを使って記述することも可能。 リダイレクト対象となるパラメータの値を配列に入れて、foreachで抜き出し一つ一つリダイレクト設定をかける。 web.php(リダイレクト設定301) //転送先ルート Route::get('/product', 'ProductController@index') -> name('product'); //リダイレクト設定 $removedSlugs = [ 'iphone5', 'iphon6', 'iphone6s' ]; foreach ( $removedSlugs as $removedSlug ){ Route::get('product/' . $removedSlug, function(){ return redirect( route('product'), 301 ); }); }; 以下と同じになる。 web.php(リダイレクト設定301) Route::get('product/iphone5', function(){ return redirect( route('product'), 301 ); }); Route::get('product/iphone6', function(){ return redirect( route('product'), 301 ); }); Route::get('product/iphone6s', function(){ return redirect( route('product'), 301 ); }); 対象ページが多い場合は、配列とforeachを使うことで記述をかなり省略できる。 よくない事例 パラメータ付きルート自体にリダイレクト設定をかけてしまうと、本来リダイレクト対象でないページまで301転送がかかってしまう。 web.php Route::get('product/{prd_slug}', function(){ return redirect( route('product'), 301 ); }); 参考リンク 以上。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】{{ mix() }}とは?JavaScriptファイルを読み込む最適な方法(Laravel Mixの活用)

LaravelでJavaScriptファイルを読み込む場合に、Laravel Mixを使うと軽量化したファイルを読み込むことができる。 Laravel MixとはLaravelの中でWebpackを使ってsass, scc, javascriptファイルなどをコンパイルできるAPIのこと。 ブレードの中で以下の記述があった場合はLaravel Mixでコンパイルしたjavascriptファイルを読み込んでいる。 <script src="{{ mix('ファイルパス') }}"></script> 目次 Laravel Mixのインポート コンパイルの設定(Webpack.mix.js) コンパイル対象ファイルの編集 コンパイル対象のjsファイルでimportする コンパイル対象のファイルを直接読みこむ globを使ってコンパイル対象をワイルドカードで指定する コンパイルの実行 ブレードで呼び出し (補足)assetヘルパを使った通常の読み込み Laravel MixでJSファイルコンパイルしてビューで使う方法 1. Laravel Mixのインポート Laravelのプロジェクトを起動したときに、package.jsonに記載されているので、インポートする。 #nodeとnpmの存在確認 ##インストールされてない場合はインストール node -v npm -v npm install pacakge.jsonに記述してあるライブラリをインストール。 2. コンパイルの設定(Webpack.mix.js) Webpackのコンパイル設定が書かれたWebpack.mix.jsを編集する。 Javascriptのコンパイル設定は以下のように記述する。 ・mix.js('コンパイル対象のjsファイルパス', 'コンパイル後のファイル出力先'); Webpack.mix.js const mix = require('laravel-mix'); mix.js('resources/js/app.js', 'public/js'); resources > js > app.jsファイルをコンパイルして、public > jsディレクトリ配下にapp.jsとして出力する。 3. コンパイル対象ファイルの編集 対象のJavascriptファイルを読みこむ方法はいくつかある。 3-1. コンパイル対象のjsファイルでimportする ブレードで読み込む対象ためのファイルとしてscritpt.jsをresources > jsディレクトリ配下に作成する。 コンパイル対象はapp.jsのため、このファイルの中でインポートする。 app.js import "script.js" 3-2. コンパイル対象のファイルを直接読みこむ コンパイル対象のファイルを直接読み込むようにすることもできる。 Webpack.mix.js const mix = require('laravel-mix'); mix.js('resources/js/app.js', 'public/js') .js('resources/js/script.js', 'public/js'); 3-3. globを使ってコンパイル対象をワイルドカードで指定する Webpack.mix.js const mix = require('laravel-mix'); const glob = require('glob'); glob.sync('resources/js/*.js').map(function(file) { mix.js(file, 'public/js').version() }); 詳細はglobの使い方を参照。 4. コンパイルの実行 npm run dev もしくは以下を実行しておくと、変更を検知して自動コンパイルしてくれる。 npm run watch 5. ブレードで呼び出し </body>の直前に以下を記述する。 ・<script src="{{ mix('ファイルパス') }}"></script> ファイルパスはresourcesディレクトリ配下を指定する。 ▼resources > js > script.jsの場合 <script src="{{ mix('js/script.js') }}"></script> Laravel Mixを使ってブレードの中でJSファイルを呼び出す処理が完了。 (補足)assetヘルパを使った通常の読み込み Laravel Mixを使わずに、通常通りpublicディレクトリ配下にあるリソースを読み込む場合はassetヘルパを使う。 ▼public > js > app.js を読み込む場合の例 <script src="{{ asset('js/app.js') }}"></script> 以上。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelでよく使うターミナル・artisanコマンド

Laravel開発で自分がよく使っているコマンドのメモです。 ガッツリLaravel開発してるわけではないので、全部を網羅してないのはご容赦ください。 他の記事ではよくPHP7.4のインストールなどを書かれてますが、当方はMAMPを使ってるので、PHPについてはスルーします。 もちろんコンソールからローカルサーバーを起動させる人は、他の方の記事を参考にしてください。 開発環境の構築 ################### ## #Homebrewの確認 $ brew -v #Homebrewをインストール $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" #Composerの確認 $ brew search composer #Composerをインストール $ brew install composer Laravel導入 #プロジェクトフォルダを作る階層に移動(ここではMAMPのhtdocs) $ cd /applications/mamp/htdocs #プロジェクト作成 $ composer create-project --prefer-dist laravel/laravel project-name #プロジェクトフォルダに移動 $ cd project-name/
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む