Laravel環境構築時にNginx+php-fpmのPermissionエラー

Laravel環境構築で、
Nginx+php-fpmの時に、権限エラーが起きたので、
対応内容をメモ

前提

エラー概要

サーバーアクセス時に502エラーが発生しており、
そのエラー内容を追っていくとPermissionエラーが起きていた。

エラー内容

エラーログ

connect() to unix:/var/run/php/php7.2-fpm.sock failed (13: Permission denied)

対応内容

Nginxの実行ユーザー周りで、Laravelのフォルダのユーザーと合っておらず、エラーになっている。

Nginxの設定変更

user = username

php-fpmの設定変更

user = username
group = username
listen.owner = username
listen.group = username

エラー:[Vue warn]: Failed to mount component: template or render function not defined.

LaravelのVueコンパイルはうまくいくが、
画面の表示時に、JSのコンソールにエラーが起きた。

[Vue warn]: Failed to mount component: template or render function not defined.

前提

Laravelのバージョン

$ php artisan --version
Laravel Framework 5.8.36

エラー内容

コンパイルは

このように、問題ない。

ただ、JSコンソールのログに

[Vue warn]: Failed to mount component: template or render function not defined.

というエラーが発生。

対策

修正内容としては、
resource/js/app.jsのVueのコンポーネントの定義を変更。

Vue.component('sample', require('./components/Sample.vue'));
// 下記のように「default」をつける
Vue.component('sample', require('./components/Sample.vue').default);

エラー:No application encryption key has been specified.

Laravelのインストール後に、稀に起きるエラー。

前提

Laravelのバージョン

$ php artisan --version
Laravel Framework 5.8.36

エラー内容

エラー概要

コンパイルは問題なくできるが、500エラー。

エラーログ

production.ERROR: No application encryption key has been specified.

対応方法

対応としては、アプリケーションキーの設定がうまくいっていないので、アプリケーションキーの設定を行う。

公式リファレンスに書いているので、該当部分を抜粋。

インストール後に、アプリケーションキーを設定する必要があると書いてある。
また、Composer等のインストールで、すでに設定されているはずと書いてあるが、
うまくいかないこともあるらしいので、
その場合は、手動でそのコマンドを動かす。

php artisan key:generate

LaravelからSlack通知の基本

LaravelからSlackに通知することができます。

公式サイトにも記載がありますが、少しわかりにくいので、

色々と調べながらやったので、共有しておきます。

前提

Laravelのバージョン

$ php artisan --version
Laravel Framework 5.8.36

SlackのWebhook URLを準備

Slackへ通知を行うために、Slack APIの中で、
Incoming WebhooksをActiveにする必要がある。

公式リファレンスを確認

関係しそうなところをピックアップ

通知用のフォルダなどを作る

上記で、まずは、
必要なNotificationsのフォルダ、ファイルを作る

Slack通知用に必要なモジュール追加

Slack通知使うには、必要なので、composerで追加。

SlackのWebhook URLを設定

Slack通知のための「Webhook URL」を、
App\Userにメソッドを追加する。

送信内容の設定のためのメソッドを追加

最初に作ったNotificationsのファイル(クラス)に、
上のように「toSlackメソッド」を追加。

通知の送信

2パターンやり方があるらしいが、
「Notifiableトレイとの使用」
の方のやり方で自分は対応した。

上記の解釈としては、黄色と水色に分けるとわかりやすいと思う。

App\Userモデルのnotifyメソッドに、
Notificationsの中に作ったクラスのインスタンスを渡すだけ。

実際のソースコード

実際のソースコードがあった方が良いと思うので、
簡単に設定して通知確認したくらいのコードを載せておく

<?php

namespace App\Notifications;

use App\User;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\SlackAttachment;
use Illuminate\Notifications\Messages\SlackMessage;
use Illuminate\Support\Facades\Log;

class Slack extends Notification
{
    use Queueable;
      :
    public function toSlack($notifiable)
    {
      return (new SlackMessage)
            ->content('One of your invoices has been paid!');
    }
}
 :
use App\Notifications\Slack;
use App\User;
 :
Artisan::command('slack', function () {
  $user = new User();
  $user->notify(new Slack());
});
php artisan slack

実行すると、こんな感じで通知がくる

これでうまく動いているので、オッケー

Laravelを書籍で学ぼう

  • 入門者にも分かりやすい文章
  • 基本から理解する
  • ルールも理解

エラー:SQLSTATE[23000]: Integrity constraint violation: 1048 Column ‘xxxxx’ cannot be null

前提

Laravelのバージョン

$ php artisan --version
Laravel Framework 5.7.28

事象

データベース更新時に以下のエラーが発生

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'xxxxx' cannot be null

更新画面で空文字(””)がNullになってエラーが起きていた。

フロントのVue側では、取得した値をRequestで渡している。

取得して、設定する側では、
以下のように、Requestの動的プロパティで取得しているが、
この取得でなぜかNullになっている。

class Xxxxx extends Controller
{
  public funciton insert(Request $request) {
    :
    insertData($request);
    :
  }
}
class XXXXXXX extends Model
{
  function insertData($request) {
    :
    ....... => $request->xxxxx,
    :
  {
}

解決方法

リファレンス

https://readouble.com/laravel/5.7/ja/requests.html

にその説明が書いてあった。

参考:Laravelリファレンスより引用

なので、

class Kernel extends HttpKernel
{
  protected $middleware = [
    :
    //以下をコメントアウト
    .......\Middleware\ConvertEmptyStringsToNull::class
    :
  ];
}

後は忘れずに再コンパイル。

エラー: Add [xxxx] to fillable property to allow mass assignment on [App\Database\xxx].

Laravelのinsert処理でエラーが起こった時の対応をメモ。

前提

Laravelのバージョン

$ php artisan --version
Laravel Framework 5.7.22

事象

やりたかったこと

Laravelの

./app/Database

のModelクラスを継承したクラスを使って、
MySQLへの更新処理(insert)を行う。

エラー

更新処理が行われるタイミングでエラーが発生。

エラー: Add [xxxx] to fillable property to allow mass assignment on [App\Database\xxx].

プログラム

Modelクラスを継承し、createメソッドにて、
MySQLへの追加処理を行おうとしていた。

class TestClass extends Model
{
  :
  省略
 :
  
  public function insertData($request)
  {
    $id = (integer)Auth::getUser()->id;
    $setData = array(
                   'xxxx' => $request->xxx,
                   'xxxx' => $id,
                   );
    // create メソッドでMySQLへの追加を実施
    TestClass::create($setData);
  }
}

解決方法

参考サイト

stackoverflowの以下のページを参考。

https://stackoverflow.com/questions/53793841/add-title-to-fillable-property-to-allow-mass-assignment-on-app-post

ちなみに、内容の該当部分は、

この部分を参考にしてうまくいった。

対応内容

先ほどの、createメソッドで更新処理を行なっているクラスの中に、

protected $fillable = ['xxxx'];

というfillable変数を定義した。

class TestClass extends Model
{
  :
  省略
 :
  
  public function insertData($request)
  {
    $id = (integer)Auth::getUser()->id;
    $setData = array(
                   'xxxx' => $request->xxx,
                   'xxxx' => $id,
                   );
    // create メソッドでMySQLへの追加を実施
    TestClass::create($setData);
  }
}
class TestClass extends Model
{
  // このfillable変数を追加
  protected $fillable = ['xxxxxxx'];
  :
  省略
 :
  
  public function insertData($request)
  {
    $id = (integer)Auth::getUser()->id;
    $setData = array(
                   'xxxx' => $request->xxx,
                   'xxxx' => $id,
                   );
    // create メソッドでMySQLへの追加を実施
    TestClass::create($setData);
  }
}

Laravelの多言語化(vuex-i18n)で文字列を実際に反映する方法

Laravelの多言語化を行なった際に、文字列ファイルを準備したけれど、それを実際に反映させる方法がわからな買ったのでメモ。

やろうとしたこと

実際にやろうとしたことは、

  1. Laravelに多言語化用のvuex-i18nをインストール
  2. vuex-i18n用の文字列を定義
  3. vuex-i18nをLaravel(Vue.js)で使うために設定
  4. Vueのtemplateで文字列を呼び出し
  5. VueのjavaScriptで文字列を呼び出し

これですが、この内容の全体の流れは、以下の記事に書きました。

これの中で、文字列ファイルを反映させる方法がわからなかった。

実際に文字列をLaravel内で反映する方法

文字列をgenerateする必要があった。

php artisan vue-i18n:generate

文字列を変更したら、これで反映させる。

Laravelの多言語化(vuex-i18n)でVue.jsのjavaScriptで文字列を取得する方法

Laravelで多言語化した時に、Componentのtemplateで文字列を取得することはできたが、javaScript側で値を取得する方法がわからず、調べたのでメモ。

前提:バージョン等

Laravelのバージョン

$ php artisan --version
Laravel Framework 5.7.22

vuex-i18n

GitHub情報はこちら

https://github.com/dkfbasel/vuex-i18n

やりたかったこと

以下の手順で進めようとしていた

  1. Laravelに多言語化用のvuex-i18nをインストール
  2. vuex-i18n用の文字列を定義
  3. vuex-i18nをLaravel(Vue.js)で使うために設定
  4. Vueのtemplateで文字列を呼び出し
  5. VueのjavaScriptで文字列を呼び出し

この中で、1−4はうまくいったが、5の文字列の取得方法がわからなかった。

最初から、Gitドキュメント見て設定すればよかったが、ネット上にあまり日本語の情報がなくて、英語の情報から、色々と試したらわかった。

実施手順

手順1:Laravelに多言語化用のvuex-i18nをインストール

今回はnpmでインストール

https://www.npmjs.com/package/vuex-i18n

$ npm install vuex-i18n

手順2:vuex-i18n用の文字列を定義

今回は、resource配下にlangフォルダを作って、そこで管理。

こんなフォルダ構成

  • resource
    • lang
      • ja
        • msg.php
      • en
        • msg.php

それぞれの「msg.php」の中身はこんな感じ。

<?php

return [
  'hello' => 'こんにちは'
]

手順3:vuex-i18nをLaravel(Vue.js)で使うために設定

Laravelのresource/js/app.js

import vuexI18n from 'vuex-i18n';
import Locales from './vue-i18n-locales.generated';

Vue.use(vuexI18n.plugin, store);

Vue.i18n.add('ja', Locales.ja);
Vue.i18n.add('en', Locales.en);

Vue.i18n.set('ja');

手順4:Vueのtemplateで文字列を呼び出し

templateでの呼び出しは$tを使用

<template>
  <div>
    <span>{{ $t('msg.hello') }}</span>
  </div>
</template>

手順5:VueのjavaScriptで文字列を呼び出し

vueのjavaScriptの呼び出しは、thisの$i18nで取得。

template時の$t がtranslateというメソッド名になっているので、それを使う。

<script>
export default {
  mounted() {
    // 現在のlocaleを取得
   console.log(this.$i18n.locale());
  // -> ja

    // 実際の文字列を取得
    console.log(this.$i18n.translate('msg.hello'));
    // -> こんにちは
  }
}
</script>

Laravelで where id is nullでUpdate処理がエラーになった事象

LaravelのUpdate処理で、なぜか、更新対象のキーが変わって、うまく更新処理ができず、エラーになりました。

フレームワーク内の細かなところまで、追っていないですが、とりあえずの対応は行なったので、その時の対応をメモしておきます。

前提条件

Laravelのバージョン

$ php artisan --version
Laravel Framework 5.7.22

テーブル定義
database/migrationのファイル

Schema::create('master_products', function (Blueprint $table) {
    $table->string('key_code');
    $table->string('product_name');
    $table->timestamps();
    $table->primary('key_code');
});

発生した事象

id以外で主キーになりうるカラムのテーブルで更新処理を行なっていたが、

なぜか、値を変更しようとすると、更新キーがidに変わって更新できない

という事象が発生しました。

where id is null

これが、エラーメッセージ内にありましたが、

主キーは別のキーにしており、同じ値のままであれば、
問題なく更新処理は行えていました。

修正前の更新処理

public function updateData($request)
{
  $data = MasterProducts::where('key_code', 
          $request->key_code)->first();
  $data->key_code = $request->key_code;
  $data->product_name = $request->product_name;
  $data->save();
}

修正後の更新処理

$data = MasterProducts::where('key_code', $request->key_code)
          ->update(array('key_code' => $request->key_code,
                       'product_name' => $request->product_name));

参考:公式ドキュメント

https://laravel.com/docs/5.7/eloquent

Laravel のroute設定でのエラー

まず、基本的な部分ではまった。環境周り。

Route::get(‘hoge‘, function () {
return view(‘welcome’);
});

localhost/hogeで403エラーになったので、確認したところ、
public/.htaccessがきちんと読めていないだけ。

AllowOverride none

AllowOverride All

CakePHP3のインストールメモ(Composer)

Composer使って入れてみたときのメモ。

PHPのバージョン確認>

5.5.9以上ってこと

php -v

PHP 5.5.9

<Composer のインストール>

下記に記載がある。

Composer

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === 'aa96f26c2b67226a324c27919f1eb05f21c248b987e6195cad9690d5c1ff713d53020a02ac8c217dbf90a7eacc9d141d') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

php composer.phar create-project –prefer-dist cakephp/app my_app_name

でエラー

f:id:shevhome:20161120182812p:plain

スーパーユーザーで実行するなとのこと。

一般ユーザーに変更して実行。

f:id:shevhome:20161120182520p:plain

パーミッションエラーが起きた。

パーミッションを調整して再実行。

f:id:shevhome:20161120182913p:plain

apt-cache search intl

で探してみると、

f:id:shevhome:20161120183302p:plain

らしきものがあるので、これを入れてみる。

php composer.phar create-project –prefer-dist cakephp/app my_app_name 

をもう1回実行すると動いた

f:id:shevhome:20161120185741p:plain

f:id:shevhome:20161120185951p:plain

パーミッションないと言っているので調整。

 で、現時点でページにアクセスしてみるが500エラー。

f:id:shevhome:20161120190451p:plain

Apache側のエラーを確認

PHP Fatal error:  You must enable the intl extension to use CakePHP. in /var/www/html/cake/my_app_name/config/bootstrap.php on line 27 

ubuntuのapahceモジュールとしてintl.soファイルを読み込むように修正(/etc/apache2/mods-available)

で、次に表示されたのはこれ。

f:id:shevhome:20161120194639p:plain

src / Template / Page / home.ctpを独自のバージョンに置き換えない限り、デバッグモードをオフにするとこのページは表示されません。

これはデバッグモードをオフにしていないので出ているらしい。

ただ、CSSが適用されていないような・・・。

f:id:shevhome:20161121192020p:plain

こんなのを期待していたのだがな。

404エラーが出てた。

f:id:shevhome:20161121192051p:plain

対象はこれらか。

f:id:shevhome:20161121192113p:plain

画面上に出てたこれはmod_rewriteの設定漏れ?

f:id:shevhome:20161121192341p:plain

qiita.com

確認したがmod_rewriteは起動している・・・。

で、アクセス権限周りを修正

f:id:shevhome:20161121193823p:plain

 すると、表示された

f:id:shevhome:20161121193914p:plain

メモ_cakephpダウンロード

cakephpのダウンロード場所のメモ

Tags · cakephp/cakephp · GitHub

PHPのモジュールロードエラー

PHPからPostgreSQLへのコネクションをたてるための

確認をしようとした際に、モジュールロードエラーが発生した。f:id:shevhome:20151024203023p:plain

 

具体的には

f:id:shevhome:20151024203254p:plain

のようなエラーがバァ〜と表示された。

f:id:shevhome:20151024203220p:plain

 

とりあえず、忘れないうちにメモ。

 

extension_dir=”/usr/lib/php/modules”

となっているが、モジュールを検索するとパスが異なるため、

extension_dir=”/usr/lib64/php/modules”

に変更。

 

他の対処方法としては、

/etc/php.ini

/etc/php.d配下のiniファイルの

「extension=」ってのを

すべてコメントアウトする方法もあるらしい。

 

NetBeansでCakePHP_002_クラスのロード

クラスのロードに関しては、

概要は調べていた。

shevhome.hatenablog.jp

 

MVC」ということで、

M:モデル

 V:ビュー

C:コントローラー

に分ける際に、MとCにどこまでの処理を

負担させるかは、プロジェクト等でも異なる。

 

その辺はプロジェクトに参画した時点で、

そこの方針に従うか、議論すれば良いと思う。

 

そして、とりあえずモデルとして簡易なクラスを

作成してロードする処理を行ってみる。

 

=====================================

 プログラムの記載

=====================================

<M:モデル>

f:id:shevhome:20150923140225p:plain

<V:ビュー>

f:id:shevhome:20150923140235p:plain

<C:コントローラー>

f:id:shevhome:20150923140239p:plain

 

=====================================

 実行結果

=====================================

うまくモデルとして作成したクラス内の値が

渡っていることが確認できた。

f:id:shevhome:20150923140410p:plain

NetBeansでCakePHP_001_HelloWorldの表示

まずは、定番の「HelloWorld」を表示してみようと思う。

 

===============================================

 参考にした内容

===============================================

NetBeansの操作方法>

英語で全部入っていることがわからなくても、

動画なので何をしたいのかはわかるかと思います。

3:00〜6:40くらいで、MySQLのDB作成〜CakePHP

プロジェクトまでを行っています。

 

===============================================

 実施時のメモ(プロジェクトの作成)

===============================================

MAMPでのDB作成は省きます。

 

Projectタブで右クリックして「New Project…」を選択

f:id:shevhome:20150923113615p:plain

PHP Application」を選択し、「Next >」をクリック

f:id:shevhome:20150923113629p:plain

任意のプロジェクト名を指定して「Next >」をクリック

f:id:shevhome:20150923113645p:plain

ここでは特に変更の必要がないため「Next >」をクリック

localhost:8888となっているのは、MAMPの初期ポートが

  8888であり、初期値のまま変更していないため。

f:id:shevhome:20150923113845p:plain

フレームワークで「CakePHP」を選択。

CakePHPは既にVer3.xがリリースされていますが、

  現時点でのBaserCMSがCakePHP3の導入が2016年秋?って

  なっていたので、とりあえず、CakePHP2.xでの理解を進めます。

f:id:shevhome:20150923120830p:plain

また、Create Databaes.phpで「SetDetail」で詳細設定。

詳細設定はそれぞれの環境で異なるかと思います。

※おそらく、HelloWolrdの表示ではDB接続は使用しないと思いますが、

  後々、DB接続を試すなどの際に必要となると思います。

f:id:shevhome:20150923115057p:plain

上記の詳細画面で入力後、元の画面に戻り、「Next >」をクリック。

そして、下記の画面が表示されるので、「Finish」をクリック。

f:id:shevhome:20150923115239p:plain

するとプロジェクトが作成されます。

f:id:shevhome:20150923121520p:plain

Source Filesフォルダの下にappフォルダ等が

作成されていることがわかります。

f:id:shevhome:20150923121527p:plain

 

ちなみVer3.xでプロジェクトを作成すると

フォルダ構成が異なります。

f:id:shevhome:20150923121741p:plain

このフォルダ構成の違いに関しては、

Qiitaに記載があったので、リンクをメモしておきます。

qiita.com

 

===============================================

 実施時のメモ(プログラムの追加)

===============================================

とりあえず、プロジェクトは作成できたので、

Hello World」の表示のために

 ・コントローラーの作成

・ビューの作成

の2つを行います。

 

<コントローラーの作成> 

f:id:shevhome:20150923122750p:plain

<ビューの作成>

f:id:shevhome:20150923122817p:plain

 

===============================================

 実施時のメモ(実行確認)

===============================================

f:id:shevhome:20150923123257p:plain

独学向け(勉強方法)
独学向け(プログラミング)
独学向け(Webデザイン)
独学向け(javaScript)
独学向け(PHP/Laravel)
独学向け(Ruby/Rails)