20200704のlaravelに関する記事は8件です。

ChonohaVPSのCentOS7にLaravelアプリをデプロイ

さくらのレンタルーサーバで運用していたものをChonohaVPSに移管しようとしたらハマりまくったので、覚えていることをメモ。

コンポーザの入れ忘れ

プロジェクトフォルダだけ持っていってもLaravelは動かない。
開発は手元のローカル端末でやってGitにアップロードしたものをCloneするだけだから、サーバ側にはコンポーザはいらないかと勘違いしていた。
公開して閲覧できるようにするためにもコンポーザは必要なので、インストールする。

なんだかわからないけど500

500だからファイルはあるんだろうけど、ブラウザにはそれしか書いていないし、開発ツール開いても何もヒントがない。
付近のフォルダで、フレームワークのない単独のphpファイルが動いているのでlaravelの何かがおかしいと思うんだけどエラー内容がわからなくて途方にくれた。

最終的にはアパッチのエラーログをtail -fしてブラウザをリロードしたら問題のパスがログに出てきたので修正したら治った。

/var/log/httpd/ に ログがあるのでそれのどっかにあった。どれか忘れたけど、とにかく謎の500でハマったらこの辺のログを tail -f で監視するとヒントがあるかも。

アプリ名/public/index.php の中にララベルのpublic以外のフォルダへのパスが書いてあるのでそれを合わせる。
参考にしたページの通りに書いたのだが、ディレクトリ構成が自分と違ったのでパスがズレた。
その方の場合はpublicフォルダを公開フォルダの/var/www/html へ mv で移動して読めるようにするやり方だったのでindex.phpをいじる形になっていたけど、自分は ln -sで 公開フォルダからソフトリンクでパスをつなぐやり方にしたので、デフォルトのまま触ったらダメだった。

DBの設定が間違っている

ここで、見慣れたLaravelの綺麗なエラー画面になった。
whoops!とか出るやつ。
ここまできたら後一息って感じ。

.envの設定が間違っていた。
ホスト名にサーバのipアドレスを書いたけど、localhostが正しかった。
ただし私の場合はってだけで必ずしもそうではない。
私の場合、同じサーバにDBを構築しているので、そこのサーバ側から見るとlocalhostになるってことで、決して手元の操作端末という意味ではない。
phpMyAdminでDBを見ると接続しているホスト名が表示されているので、これに合わせると多分繋がるはず。
私の場合はここがlocalhostと表示されているのがヒントになって上記の対応をした。

トップページしか表示されない

紆余曲折してやっとトップページが表示できたと思ったら、今度はそこしか見れない。
/etc/httpd/conf を vi で開いて
/var/www/ と /var/www/html/
のところにある
AllowOverride None を AllowOverride All に変更する。
オーバーライドを許可するだから、多分 web.php でルーティングできるようにするって事かな?
あれが多分URLを上書きしているって事だろう。

これで動いた。
丸一日かかった・・

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP7.4】laravelで日付をフォーマットする方法

備忘録として

開発環境

・ゲストOS: Windows10 home10
・ホストOS: WSL2 Ubuntu20.04
・PHP7.4
・Laravel Framework 7.17.2

目標

・viewに日付を表示する際に(2020/07/03)という形で表示する

実装例

laravelでオブジェクトのcreated_atプロパティを表示すると、デフォルトでは以下のような形で出力されます。

コード

<span>{{$item->created_at}}</span>

出力結果

2020-07-03 04:34:04

これでも機能的には問題ないですが、できればフォーマットを整えて表示できるようにしたいです。以下のようにするとフォーマットを変えて出力できるようになります。

コード

<span>{{$item->created_at->format('yy/m/d')}}</span>

出力結果

2020/07/03

PHPの公式ドキュメントには日付のフォーマット方法が多数紹介されています。

参考資料

PHP公式ドキュメント

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel シンボリックリンクが切れた時の復旧方法

Laravel のStorage を使っていて、シンボリックリンクが切れてファイルの読み込みができなくなる時があります。

その時の復旧方法を備忘録的に残します。

シンボリックリンクの設定

php artisan storage:link

これでシンボリックリンクの設定ができます。

Storage フォルダがroot直下にでき、/public 直下からリンクが張られます。

それでうまくいっていたはずが、色々やるうちに変わったり外れてしまった場合の対処法です。

シンボリックリンクの確認

ローカルの場合、仮想環境のサーバにログインします。

プロジェクトのフォルダまで移動し、ls -la でシンボリックリンクを確認します。

vagrant@homestead:~/code/project$ cd public
vagrant@homestead:~/code/project/public$ ls -la
total 24
drwxr-xr-x 1 vagrant vagrant  384 Jul  4 02:52 .
drwxr-xr-x 1 vagrant vagrant  960 Jun 28 07:37 ..
drwxr-xr-x 1 vagrant vagrant   96 Jun 16 11:26 css
-rw-r--r-- 1 vagrant vagrant 6148 May 15 06:23 .DS_Store
-rw-r--r-- 1 vagrant vagrant    0 Apr 10 07:56 favicon.ico
-rw-r--r-- 1 vagrant vagrant  603 Apr 10 07:56 .htaccess
-rw-r--r-- 1 vagrant vagrant 1823 Apr 10 07:56 index.php
drwxr-xr-x 1 vagrant vagrant   96 Jun 16 11:26 js
-rw-r--r-- 1 vagrant vagrant   71 Jun 28 07:38 mix-manifest.json
-rw-r--r-- 1 vagrant vagrant   24 Apr 10 07:56 robots.txt
lrwxr-xr-x 1 vagrant vagrant   45 Jul  4 02:52 storage -> /User/hogehoge/code/project/storage/app/public/
drwxr-xr-x 1 vagrant vagrant  128 May 15 08:02 voice

仮想環境なのに /User/hogehoge/code/project/storage/app/public/ みたいなパスになっていたら間違いです。

シンボリックリンクを削除する

リンクが間違っていたら、unlink でリンクを削除します。

vagrant@homestead:~/code/project/public$ unlink storage

正しいパスでシンボリックリンクを設定する

シンボリックリンクの設定は ln -s [正しいパス] [storage] です。

正しいパスは、$pwd でプロジェクトrootのパスを確認し、/project/storage/app/public/ を設定。

vagrant@homestead:~/code/project/public$ ln -s /home/vagrant/code/project/storage/app/public/ storage

ついでに: 本番環境でシンボリックリンクが繋がらないとき

単純に繋がっていないだけのことが多いので、サーバにログインして、storage:link しましょう。

php artisan storage:link

参考

https://qiita.com/YasuhaF/items/9a897e83afe1819d97af

https://www.wakuwakubank.com/posts/342-linux-ln-unlink/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker&LaravelでSQLSTATE[HY000] [2002] Connection refusedが出た時の対処法

はじめに

こんなエラーでた。

terminal
  SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = laravel and table_name = migrations and table_type = 'BASE TABLE')

  at vendor/laravel/framework/src/Illuminate/Database/Connection.php:671
    667|         // If an exception occurs when attempting to run a query, we'll format the error
    668|         // message to include the bindings with SQL, which will make this exception a
    669|         // lot more helpful to the developer instead of just the database's errors.
    670|         catch (Exception $e) {
  > 671|             throw new QueryException(
    672|                 $query, $this->prepareBindings($bindings), $e
    673|             );
    674|         }
    675| 

      +37 vendor frames 
  38  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

結論

configがしっかり反映されていなかったので、以下のコマンドでconfigに.envの内容を反映させると解消された。

terminal(Docker内)
$ php artisan cache:clear
$ php artisan config:cache

対処法

php artisan tinkerで.envの内容が反映されているか確かめる

terminal(Docker内)
$ php atisan tinker

>> config('database')
=> [
     "default" => "mysql",
     "connections" => [
       "sqlite" => [
         "driver" => "sqlite",
         "url" => null,
         "database" => "xxx",
         "prefix" => "",
         "foreign_key_constraints" => true,
       ],
       "mysql" => [
         "driver" => "mysql",
         "url" => null,
         "host" => "mysql", // この辺に注目
         "port" => "3306",
         "database" => "xxx", // この辺に注目 
         "username" => "xxx", // この辺に注目
         "password" => "xxx", // この辺に注目
         "unix_socket" => "",
         "charset" => "utf8mb4",
         "collation" => "utf8mb4_unicode_ci",
         "prefix" => "",
         "prefix_indexes" => true,
         "strict" => true,
         "engine" => null,
         "options" => [],
       ],

       # 以下省略

configに、.envの内容が反映されてなかったら結論で示したコマンドでどうにかなるかも(自分は解決した)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】PortGallery作成日誌 2020-07-04

現在作成中のアプリの外観

こんな感じです↓
twitter070401.gif

この記事について

僕は現在PortGalleryと言うWebアプリを作成しています。
使用言語はphp(Laravel)です。
どうして記事にしたのかと言うと、Twitter転職を始めたものの
中々良い結果に結びついていない事から生じた焦りと、アプリを開発する過程での
リアクションをどなたかから頂きたかった、そしてやらざるを得ない状況を
作るという3つの理由からです。
このアプリの現時点でのコードはこちらです↓
https://github.com/otake619/PortGallery

PortGalleryについて

PortGalleryは、ポートフォリオ投稿型SNSです。
具体的には、各アカウントが自分のポートフォリオの切り取り画像とリンクを
PortGalleryにアップします。
そのポートフォリオについてユーザー間で評価したり、
コメントを付けたりすることで自身のポートフォリオ
への「客観性」が持てるというメリットがあります。

完成までの工程について

・要件定義
・UI設計
・コードを書く ←今ここ
・コードを綺麗に(リファクタリング)する
・テスト
・デプロイ
という流れになっています。

コードを書く、と言う段落が今回の制作では
一番比重が大きくなっているので、コーディング
の段階を更に細分化して

コーディング
・MDBootstrapでUIを作成 ←今ここ
・検索機能の実装
・イイね機能の実装
・評価機能の実装

といった流れになります。
※MDBootstrapとは、MaterialDesignBootstrap(マテリアルデザインブートストラップ)の事で、
詳しい使い方は省きますが、導入するとGoogleが提唱したデザインシステムの1種である「マテリアルデザイン」でUIを設計することが出来ます。
公式へのリンクはこちらです→ https://mdbootstrap.com/

2020/07/04に学んだこと

アプリを作成している中で学んだことを毎回この段落に書くことにします。

・認証系(新規登録、ログインなど)の画面でのエラーをユーザーに伝えるとき(パスワード間違い、メールアドレス間違いetc...)Laravelではどうやって伝えるのか悩んでいて、validation.phpのエラーメッセージ"This name field is required."などの値を直接書き換えればよいのかと思っていたところ、この記事を友人に共有してもらい解決した↓
https://qiita.com/samuraibrass/items/d71c08e144dbbf98e348

解決策としては、日本語化のパッケージを作成された方がいらっしゃるので、そのパッケージをダウンロードして表示するようにする、でした。

2020/07/06に学んだこと

・Gitをなるべく活用する姿勢がついてきた。pushはともかく、自分の尺度ではあるけど
一定の間隔でコミットしている。コミットをせず、プロダクトが出来たと思った段階で
コミット→プッシュという全然gitの旨味を活かせてない活用の仕方はやめた。
gitで定期的にコミットするメリットとしては、いつでもコミットした段階に
戻れる、という事がメリットとして大きいと感じた。例えばある機能Xを追加で作成していた際に
そのX機能を追加する前までは上手く動いていた機能Yが突然かみ合わなくなってうまく動かなくなった、なんて時にはgitでバージョンを戻すのがGoodだと思った。

・aタグに変数Xを載せて、別ページでその変数Xを受け取りたい場合がある。
そうした時は、コントローラーでリクエストを受け取り別ページに変数Xを渡す、と言う手段を今日採った。
例として、ユーザーXのuser_id=1とする。Twitterとかでよく見かける別ユーザーのアイコンやTweetをクリックした際にユーザーXに関する情報を表示させたいとき、コントローラーにて”どのユーザーの情報を表示させたいのか?”が分からないと(対象のuser_idが不明の時)データベースからユーザーXに関する情報は持ってくることが出来ない。そうした場合はGETを利用して、aタグに載せた値をコントローラーで受け取って、
別ビューに渡す方法がよいのでは、と思っている。
具体的なコードは、

php(timeline.blade.php)
<a href="/evaluation/post_eval?user_id={{$portfolio->user_id}}"></a>

のaタグをクリックした際に、対象のユーザーXのuser_idを載せてコントローラーへと渡して

php(EvaluationController.php)
public static function show(Request $request)
{
       $user_id = $request->input('user_id');
       return view('PortGallery.evaluation_post', ['user_id' => $user_id]);
}

viewメソッドでevaluation_post.blade.phpにユーザーXのuser_idを渡している。
デモgifだとこんな感じになります↓
キータでも.gif

※評価アイコンをクリックした後、ジャンプしたページに表示されている
2や3と言う数値が対象のuser_idです。この値をもとにして、対象ユーザーの情報をデータベースから取り出してきて表示する、という流れです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laradock でLaravel + SQLServerの環境を用意する

Laradockの取得

基本は 公式ドキュメント を参照

// 作業用ディレクトリにlaradockをクローンする
git clone https://github.com/Laradock/laradock.git

// envファイルをコピーする
cd laradock
cp env-example .env

本記事は公式ドキュメントの新規作成用のプロジェクト手順に従い、次のディレクトリ構成となる想定です。

作業用フォルダ
  ├ laradock
  └ lara-test(新規プロジェクトフォルダ)

dockerをビルドする前に行う設定

.envの修正

基本設定

APP_CODE_PATH_HOSTに作成予定のプロジェクト名を入力する

APP_CODE_PATH_HOST=../lara-test/

SQL Server用設定

DB名、SA用パスワード、ポート番号を設定する。
パスワードは8文字以上で大文字小文字記号数字の4種類から3種以上含んでいる必要があります。パスワード ポリシー

### MSSQL #################################################

MSSQL_DATABASE=master
MSSQL_PASSWORD="yourStrong(!)Password"
MSSQL_PORT=1433

WORKSPACE用のインストールオプション、PHP_FPM用のインストールオプションをtrueに変更する。

### WORKSPACE #############################################

WORKSPACE_INSTALL_MSSQL=true

### PHP_FPM ###############################################

PHP_FPM_INSTALL_MSSQL=true

それぞれtrueにしないとDB接続時に次のようなエラーが発生します。

Illuminate\Database\QueryException
could not find driver

docker-compose.ymlの修正

ボリュームコンテナーを使用するための修正(Macでのみ必須)

デフォルトでは ${DATA_PATH_HOST} のディレクトリにマウントするように設定されていますが、Macの場合はそのままだとエラーが出ます。

エラー内容
2020-05-08 06:49:33.62 Server      Error: 17113, Severity: 16, State: 1.
2020-05-08 06:49:33.62 Server      Error 87(パラメーターが間違っています。) occurred while opening file '/var/opt/mssql/data/master.mdf' to obtain configuration information at startup. An invalid startup option might have caused the error. Verify your startup options, and correct or remove them if necessary.

2020年6月時点ではMac上ではホストのディレクトリマウントがサポートされていないためです。
https://docs.microsoft.com/ja-jp/sql/linux/sql-server-linux-configure-docker?view=sql-server-ver15#mount-a-host-directory-as-data-volume

現時点では、SQL Server on Linux イメージを使用した Mac 上の Docker のホスト ボリューム マッピングはサポートされていません。 代わりにデータ ボリューム コンテナーを使用してください。

回避するためにはデータボリュームコンテナを用意してそちらを使用する必要があります。

volume定義例
volumes:
  mssqlvolume:
    driver: local
       volumes:
#        - ${DATA_PATH_HOST}/mssql:/var/opt/mssql
        - mssqlvolume:/var/opt/mssql

インストール時に使用される環境変数の変更

設定可能な環境変数はこちら

### MSSQL ################################################
    mssql:
      build:
        context: ./mssql
      environment:
        - MSSQL_PID=Express
        - MSSQL_DATABASE=${MSSQL_DATABASE}
        - SA_PASSWORD=${MSSQL_PASSWORD}
        - ACCEPT_EULA=Y

Developerエディションにするなら MSSQL_PID=Developer に変更、言語を日本語にしたいなら MSSQL_LCID=1041 に変更など。

以降は基本的にMySQLの場合などと同様。
失敗したら、画面に表示されるエラーログや dokcer logsでログを確認する。

コンテナを立ち上げてプロジェクトを作成する

docker-compose up -d workspace nginx mssql php-fpm

でコンテナをビルド & 立ち上げて

docker-compose exec workspace bash

でコンテナに入って

composer create-project --prefer-dist laravel/laravel .

でプロジェクトを作成する。
コンテナ上では /var/www 下にファイルが配置され、ホストPC上ではAPP_CODE_PATH_HOST で設定したプロジェクトフォルダに各ファイルが配置されている状態となります。

コンテナ上にLaravelのファイルが作成される
/var/www# ls -a
.    artisan        composer.lock  .editorconfig  .gitattributes  phpunit.xml  resources   storage       vendor
..   bootstrap      config         .env           .gitignore      public       routes      .styleci.yml  webpack.mix.js
app  composer.json  database       .env.example   package.json    README.md    server.php  tests

この状態で http://localhost を開くとlaravelのデフォルトページが表示されることが確認できます。
image.png

Laravel側のDB設定と疎通確認

Laravel用の.envでSQL Server用の設定をする

新規作成されたlaravelのプロジェクトの.envを編集

DB_CONNECTION=sqlsrv
DB_HOST=laradock_mssql_1
DB_PORT=1433
DB_DATABASE=master
DB_USERNAME=SA
DB_PASSWORD='""yourStrong(!)Password""'

docker-compose.yml のデフォルトのパスワードではダブルクォートが入っていますが、そのまま.envに記載すると除外されてしまうので、上記のような対応が必要です。

疎通確認

routes/web.php

Route::get('/test/', function () {
    return json_encode(\Illuminate\Support\Facades\DB::select("select @@version"));
});

を追加して、 http://localhost/test/ でSQL Serverのバージョン情報が表示されたらSQL Serverに接続ができています。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】 チェックアウト時に実行すべきコマンド集

はじめに

チェックアウトした際に,Laravelでエラーが発生したときのための対処法.

コマンド集

テーブルを削除してマイグレーション

php artisan migrate:fresh --seed

キャッシュをクリア

php artisan config:cache

パスを再取得

composer dump-autoload
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerのmariaDBにログインできずに困った話

目的

  • Docker環境のmariaDBにログインできず困った話をまとめる。

実施環境

  • ハードウェア環境
項目 情報
OS macOS Catalina(10.15.5)
ハードウェア MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)
プロセッサ 2 GHz クアッドコアIntel Core i5
メモリ 32 GB 3733 MHz LPDDR4
グラフィックス Intel Iris Plus Graphics 1536 MB

前提条件

困るまでの経緯

  1. 下記の手順を実行してDockerにてLaravelの開発環境を構築した。
  2. マイグレーションの結果を確認するためにMacのターミナルから下記コマンドを実行してPHPのdockerコンテナに入った。

    $ docker exec -it PHPのコンテナ名 bash
    
  3. Dockerコンテナ内で下記コマンドを実行してmariaDBにログインを試みた

    $ mysql -u ログインmariaDBユーザ名 -p
    

困った現象

  • 先のコマンドを実行してmariaDBにログインを試みたが下記のエラーが出力された。

    >bash: mysql command not found
    
  • アプリ側でマイグレーションをしたことがあったためこの時点で混乱してしまった。

解決までの経緯

  1. 別のターミナルのウインドウにて下記コマンドを実行してmariaDBのコンテナに入った。

    $ docker exec -it PHPのコンテナ名 bash
    
  2. mariaDBのDockerコンテナ内で下記コマンドを実行してmariaDBにログインを試みた

    $ mysql -u ログインmariaDBユーザ名 -p
    
  3. 正常にログインすることができた。

何が間違えていたのか

  • PHPのコンテナ内でmariaDBにログインしようとしていた。
  • mariaDBはmariaDBのコンテナからでないとログインすることはできない。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む