20210128のPHPに関する記事は9件です。

Docker + Symfonyで環境構築する

はじめに

仕事でSymfonyを扱うことになりそうなので、勉強用にDocker環境を構築しました。
SymfonyはPHPのメジャーフレームワークだけど、Laravelと比べると少し日本語の情報が少ないですね。
Laravelを使っているとSymfonyの日本語の情報の少なさに狼狽える自分ががg

対象者

Symfonyが動く環境をdockerですぐに作りたい方

前提

  • Docker
  • Git

少し前のアプデでWindows10 HomeでもDocker for Windowsが使えるようになったんですね。
とりあえず、DockerとGitが使えればOKです。

環境構築

docker symfonyとかでググると以下のリポジトリが出てきました。

https://github.com/eko/docker-symfony
https://github.com/dunglas/symfony-docker
https://github.com/joeymasip/docker-symfony4

一番最初のリポジトリがスター数が多かったのでそちらで進めます。

リポジトリをclone

$ cd 好きなディレクトリ
$ git clone https://github.com/eko/docker-symfony.git

コンテナ作成

$ cd docker-symfony
$ docker-compose up -d

hostsの書き換え

リポジトリのREADMEに書いてある通り進めていきます。
ローカルのhostsファイルに以下を追記。

127.0.0.1 symfony.localhost

hostsの場所

Windowsの場合

C:\Windows\System32\drivers\etc

macの場合

/private/etc/hosts

※違ってたらご指摘お願いします。

コンテナへ入る

$ docker exec -it php-fpm sh

symfonyプロジェクトのインストール

# composer create-project symfony/website-skeleton . 4.2.x

バージョンを変えたい方は末尾の数字を変えてください。
今回は4.2.xを指定しています。

確認

http://symfony.localhost/

image.png

終わりです!

これで環境構築は終わりです。
多分これが一番早いと思います。
kibanaとかxdebugはREADME読めばすぐにわかるハズ。

さいごに

チュートリアルでサンプルを作成しましたが、Symfony4の参考書も購入してみました。
とても読みやすいので最初はおすすめです。

https://www.amazon.co.jp/dp/B07NQ5WH6R/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

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

XAMPPのphpだけアップデートする -2021年版-

XAMPPのphpだけアップデートする -2021年版-

XAMPPのアップデートは面倒

まず全部アンインストールしてからインストールしないといけないのでバックアップが大変。俺はめんどくさがりなのでググって色々調べてできるだけ今の設定を維持したまま楽ちんにアップデートしたいわけです。

XAMPP 8.0.0 から 8.0.1

ああ、めんどうだ。めんどうだよこれ。ということでphpだけアップデートしようと思って調べたら、なんか「XAMPPのphpは32bit」という情報が。でも怪しいな?と思って調べました。いや、8.0.1にアップデートした後なんですけどね。

phpinfo

hoge.php
<?php
phpinfo();

実行結果:
phpinfo.png
あれ、これx64じゃない?

タスクマネージャーでもわかる

タスクマネージャーでは、32bitアプリはこのように(32 ビット)と表示されます。親切ですね。
タスク.png
なので、XAMPPのphp.exeを実行してタスクマネージャーで見てみました。php.exeをダブルクリックすればphpのコンソールが立ち上がります。この状態でタスクマネージャーを見ます。で、php.exeを探すと…
php8t.png
64bitだー!

結論

確認できたのは7.3.26からですが、XAMPP for Windowsのphpも64bitです。なので、windowsだと https://windows.php.net/download#php-8.0 あたりから VS16 x64 Thread Safeのzipを落としてきてphp.ini以外を上書きすれば良い。

参考

EXE、DLLが32bitなのか64ビットなのか確認する方法

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

Windows + mamp 環境で mb_send_mail を使って送信テストがしたい

はじめまして
mamenoといいます

今回は、あまり環境的にノーマルでない、
Windowsmampという環境でお問い合わせメールを送信する方法が
3日かかってようやくわかったのでメモがてら残しておきたいと思います

環境

  • windows10
  • mamp(php ver.7.4.1)

一般的なパターン

パターンA

windows + xampp
=>そもそもxamppにはFake Sendmailという設定ファイルがあり、その設定ファイルをいじれば送れるようになる

パターンB

mac +mamp
=>mampにはメールを送るための設定ファイルみたいなものはないが、macにデフォルトで備わっているPostfixというものの設定をすれば遅れるようになる

windiws + mamp でどうしてできないのか

windowsにはPostfixみたいなものはないし、mampにはFake Sendmailみたいなメール送信設定のファイルはない

じゃあwindowsにそういうファイルを別でいれればいいのでは?

ということで、

fake sendmail のみのダウンロードをする

ダウンロードはこちらを参考に

ダウンロード出来たら解凍してC:直下にsendmailフォルダを保存する

さて、あとは設定を変えるだけ

php.iniの[mail function]の設定

C\MAMP\conf\php7.4.1\php.ini の[mail function]を変更
(パスはあくまで一例)
変更箇所
SMTP = smtp.gmail.com
sendmail_from = 受け取りたいアドレス@gmail.com
sendmail_path = "\"C:\sendmail\sendmail.exe\" -t"
mail.log = "C:\MAMP\logs\php_mail.log"
→保存

さっきダウンロードしたsendmail.iniを変更

変更箇所
smtp_server=smtp.gmail.com
smtp_port=587
auth_username=受け取りたいアドレス@gmail.com
auth_password=Gmailのアプリパスワード
→保存

これでお問い合わせが届きました

超参考にしたサイト

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

PHP,MySQLで開発したアプリをFTPを使いデプロイする(備忘録)

FTPを使ったデプロイ手法

FTPを初めて使いデプロイした際、沼に入ったので備忘録として残します。

開発手法

MAMPのパッケージを使いPHP、MySQLを使用しアプリを実装しました。

FTPとは

サーバーにファイルをアップロード、またはその逆でファイルをダウンロードしたりしWebアプリやWebサイトをデプロイできるサービスです。
今回使用したのはFileZilaです。

サーバーの用意

サーバーは用意されていたものがあったのでそれを使用。

サーバーに接続

.FailZilaを開きローカルで開発したディレクトリに移動します
サーバーの接続
ファイル(F)をクリックしサイトマネージャー(F)をクリックし用意されてるサーバー情報を記入します。
ホスト名、ユーザー名、パスワードを記載し接続できたら
先ほどローカルで開発した、アップロードしたいファイルを右クリックしアップロードすればサーバーにファイルをアップロードできます。リモートにアップロードしたファイルを右クリックし[URLをクリップボードにコピー]を選択し
Googleに公開情報を確認

沼に落ちたmysql構文

よしこれでデプロイできる!!と思いきや...あれ?エラーが起きてる...
DB関係で...
色々調べたら、DBをlocalにしておりそれをリモート環境のDBに反映できていなかったです。
そりゃそうだ...DBはローカルでしか保存させてないもんな...ローカル構文でしか記述してないもんな...知識不足は恥ずかしい...
そこでDB構文の記述を書き換えました。構文にすごく時間をかけました。

dbconnect.php
try{
  $db = new PDO('mysql:dbname=用意しているdbname;host=ホスト名;port=webに表示させたいURL;charset=utf8','dbユーザー名','パスワード');
} catch(PDOException $e){
  print('DB接続エラー:' . $e->getMessage());
}

これでリモートに反映することができました。

知らないことを色々調べて論理付けて学べてよかった。

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

Composer を 1.x から 2.x へアップデートする方法

前書き

Composer のアップデート記事は多々あれど「最低限なにすれば良いの?」という疑問に答えてくれる記事が見当たらなかったので書いた

検証環境

  • Amazon Linux 2
  • PHP
    • 7.2.4

Composer 自身をアップデート

説明不要で、以下実行のこと

$ sudo composer self-update
Updating to version 2.0.9 (stable channel).
   Downloading (100%)         
Use composer self-update --rollback to return to version 1.9.2

念のため、バージョンを確認する

$ composer --version
Composer version 2.0.9 2021-01-27 16:09:27

無事、2.0.9 へ更新されていた

以上

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

【PHP初心者】Laravelを2週間触ってみて理解したこと④【blade】【コンポーネント】

はじめに

こんにちはnakaです?
この記事を書いてる間にLaravelを触って3週間ほどたちました。
正しくはこうかな・・・・・・・
【PHP初心者】Laravelを2週間触ってみて理解したこと④
【PHP初心者】Laravelを3週間触ってみて理解したこと④

コンポーネント

前回のセクションと似たような機能ですが、コンポーネントは部品をテンプレ化します。書いてる自分も(゜_゜)???となってきたのでまとめます笑

ビューのファイル連携のまとめ

@include → ほかのビューをごぞっと入れ替える
@sectioin → テンプレート(親)ファイルを作成し、テンプレートと違う箇所に@yieldを使って子を読み込む
@component → 部品ごとにテンプレート化する。例えば、webサイトのヘッダーやフッター、モーダルなどに使える。(@slotというディレクティブを使う)

うーんなるほど、コンポーネントは共通のパーツを作れるって認識かな。
とりあえず動きを見てみましょう。

ちなみに前回の記事はこちら↓↓↓
【PHP初心者】Laravelを2週間触ってみて理解したこと③【blade】【継承】

コンポーネントとスロットの実装方法

今回はモーダルをコンポーネント化しましょう。Bootstrap4のモーダルを使用しています。

必要なファイルはこんな感じ

//共通パーツを作るところ
resources/views/components/modal.blade.php

// 読み込むところ
resources/views/sample.blade.php

まずはパーツを作成します。
埋め込みたい値を{{ $~~ }} とする

modal.blade.php
<div class="modal" tabindex="-1" role="dialog" id="{{ $modal_id }}">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title">{{ $modal_title }}</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body">
        <p>{{ $modal_body }}</p>
        <p>{{ $slot }}</p>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-dismiss="modal">キャンセル</button>
        <button type="button" class="btn btn-primary">保存</button>
      </div>
    </div>
  </div>
</div>

表示するビューの設定です。@slot(‘変数名(componentで設定した{{$~~}})’, パラメータ) で値をコンポーネントに渡せます。
また@slot外に書いた@componentに囲まれた内容(下記でいう「slotの外に書かれた内容です。」)は{{$slot}}に出力されます。

(ややこし・・・・・(゜_゜))

sample.blade.php
@component('components.modal')
  @slot('modal_id', 'sample_modal')
  @slot('modal_title', 'sampleです')
  @slot('modal_body', '本文です。')
  @endslot
 slotの外に書かれた内容です
@endcomponent

コンポーネントの読み込んだビュー

sample.blade.php
<div class="modal" tabindex="-1" role="dialog" id="sample_modal">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title">sampleです</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body">
        <p>本文です。</p>
        <p>slotの外に書かれた内容です。</p>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-dismiss="modal">キャンセル</button>
        <button type="button" class="btn btn-primary">保存</button>
      </div>
    </div>
  </div>
</div>

最後に

今回はコンポーネント化についてまとめました。
次回でbladeは最後にしようと思います;つД`)ナガカッタ
多分次の回が一番使うかな・・・・

参考文献

Laravel @extends @include コンポーネントの違いを知りたい人のために解説
【Laravel】Bladeでcomponentを利用する
componentを活用して再利用可能なviewを作成する【Laravel】

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

VichUploaderBundleを適用するEntityのプロパティはNULLを許容しないと削除ができない

はじめに

Symfonyのファイルのアップロードに、VichUploaderBundleを使っています。

Api Platformを使っていて、ファイルのアップロードは、ドキュメント通りに行って問題なし。

問題

Entityの削除(DELETE)を発行したら、以下のようによくあるエラーがでる。

"Expected argument of type "string", "null" given at property path "originalFileName"."

image.png

原因

Entityを作成した時は、たいがいデフォルト値を設定してしまうのですが、setOriginalFileNameメソッドを呼び出す時に、引数指定されたのが問題でした。

    /**
     * @ORM\Column(type="string", length=255, options={"default": ""})
     */
    private $originalFileName = '';

    public function getOriginalFileName(): ?string
    {
        return $this->originalFileName;
    }

    public function setOriginalFileName(string $originalFileName = ''): self
    {
        $this->originalFileName = $originalFileName;

        return $this;
    }

以下のように、nullを許容する「?」をstringの前につけて解決。

 public function setOriginalFileName(?string $originalFileName = ''): self
    {
        $this->originalFileName = $originalFileName;

        return $this;
    }

無事に削除ができるようになりました。

image.png

まとめ

NULL許容で実装した方が、他のバンドルとも連携があるのでよいのですね。
make:entityで作ったままがよいのかも?

参考文献

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

[Laravel6] 条件によってバリデーションの内容を変える方法

バージョン情報

  • PHP 7.4.2
  • Laravel 6.2

実現したいこと

こんな感じのラジオボタンとテキストの入力フォームがあり、
スクリーンショット 2021-01-28 2.00.41.png

index.html
<input type="radio" name="type" value="A"><label>A</label>
<input type="radio" name="type" value="B"><label>B</label>
<br>
<input type="text" name="text">
  • Aが選択されている時は、textが整数であること
  • Bが選択されている時は、textが文字列であること
  • type, textは必ず入力されていること

こんなバリデーションをしたい。

結論

PostTextRequest.php
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Validator;

class PostTextRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'type' => 'required',
            'text' => 'required'
        ];
    }
    public function withValidator(Validator $validator)
    {
        $validator->sometimes('text', 'required | integer', function ($input) {
            return $input->type === 'A';
        });

        $validator->sometimes('file_name', 'required | string', function ($input) {
            return $input->type === 'B';
        });
    }
}

重要なところ

public function withValidator(Validator $validator)
    {
        $validator->sometimes('text', 'required | integer', function ($input) {
            return $input->type === 'A';
        });

        $validator->sometimes('file_name', 'required | string', function ($input) {
            return $input->type === 'B';
        });
    }

解説

元のコード

元々はこんな感じの記述でした。

TextController.php
public function post(Request $request)
{
    // バリデーションルールの配列を呼び出す
    $validation_rules = $this->rules();

    // typeがAかBかによってバリデーションを追加する
    if ($request->input('type') === 'A') {
        $validation_rules['text'] .= '|integer'; 
    } elseif ($request->input('type') === 'B') {
        $validation_rules['text'] .= '|string';
    }
    // バリデーション実行
    $request->validate($validation_rules);

    // postの処理...
}

protected function rules() 
{
    return [
        'text' => 'requied',
        'type' => 'requied'
    ];
}

これでも期待通りの動きはしてくれるけど、Controllerに全部書いちゃってるし、if文でバリデーションを追加するとかなんかダサい。

withValidator()というのを使うといい感じにできるらしい。

ドキュメント
参考にした記事

書き方としては、

public function withValidator(Validator $validator)
    {
        $validator->sometimes('バリデーションを行うフィールド', 'バリデーション | バリデーション', function ($input) {
            return バリデーションをする条件;
        });
    }

なので、今回のパターンに当てはめると、

PostTextRequest.php
public function withValidator(Validator $validator)
    {
        // textが整数かどうかのバリデーションを追加したい
        $validator->sometimes('text', 'required | integer', function ($input) {
            // typeがAだった時に
            return $input->type === 'A';
        });
        // textが文字列かどうかのバリデーションを追加したい
        $validator->sometimes('file_name', 'required | string', function ($input) {
            // typeがBだった時に
            return $input->type === 'B';
        });
    }
TextController.php
public function post(PostTextRequest $request)
{
    // postの処理...
}

これでControllerはスッキリするし、スマートに書ける(気がする)。

ご指摘、アドバイスお待ちしております。

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

【初心者】RubyとPHPの基本的な書き方を比較してみた

この記事は…

プログラミング初心者学習向きのスクリプト言語として人気のあるRubyPHP
Ruby基礎の復習も兼ねて、PHPではどのように書くか比較したアウトプットです。

ファイルの拡張子

Rubyのファイルは「.rb」。PHPのファイルは「.php」

記述方法

Rubyには「拝啓〜敬具」みたいなプログラムの書き出しと締めの言葉はないけれど、PHPでは開始と終了に<?php 〜 ?>とタグを記述する必要があります。

hoge.php
<?php
  // ここ(タグの間)にプログラムを書く
?>

コメントアウトはRubyの場合は#を付与。

hoge.rb
# Rubyの1行コメントアウト 

=begin
  Rubyの
  複数行コメントアウト
  ですよ
=end

PHPでは1行コメントアウトの場合//(ダブルスラッシュ2個)、複数行は/* 〜 */のようにコメントアウトします。

hoge.php
<?php
  // 1行コメントアウト

  /* PHPの
     複数行コメントアウト
     ですよ
  */
?>

PHPはHTMLの中に埋め込むことができます。
たとえば以下のように強調の<b>タグを記述してブラウザ(HTML出力)すると、Hello worldを太文字で出力することができます。

helloworld.php
<b>
<?php
  echo "Hello world";
?>
</b>

そうそう、Rubyでは語尾に何もつかないけれど、PHPでは;(セミコロン)が無いとエラーになっちゃう。
語尾に;が必要なのは、CSSに似てる親近感。

変数

PHPでは変数名の頭に$(ドルマーク)をつけると変数名になります。
Rubyでは標準出力はputsコマンドで行います。

hoge.rb
hoge1 = "Hello"
hoge2 = "World!"

puts hoge1 + hoge2         # HelloWorld! 
puts "#{hoge1} #{hoge2}"   # Hello World! 

PHPではechoで出力できます。
PHPで文字列を繋げる場合は、変数の前後に.(ドット)を記述。
変数に代入する場合はRubyと同様に=(イコール)で代入。

hoge.php
<?php
  $hoge1 = "Hello";
  $hoge2 = "World!";

  echo $hoge1.$hoge2;      // HelloWorld! 
  echo $hoge1." ".$hoge2;  // Hello World! 
?>

標準入力はRubyではgetsで値を取得し、chompで改行コードを削除。

hoge.rb
  hoge = gets.chomp

PHPではfgets(STDIN)で値を取得。
改行を削って変数に代入したい場合、PHPではtrimを使います。

hoge.php
<?php
  $hoge = trim(fgets(STDIN));
?>

条件式(if文)

条件分岐のif文、Rubyで書くとこんな感じ。

hoge.rb
# 1〜3までランダムな数を選び、変数hogeに代入
# ランダム数値の生成はrandを使用。数の範囲は(From..To)のように表現
hoge = rand(1..3)

# 1ならコンニチワ、2ならサヨナラ、3ならマタネ
if hoge == 1
    puts "Hello"
elsif hoge == 2
    puts "Bye"
else
    puts "See you again"
end

同じ内容をPHPで書くとこんな感じ。
条件文は(カッコ)で囲みます。
ほか{カギカッコ};(セミコロン)を書き忘れそうになります(苦笑)
何回か条件を書く時、Rubyではelsif、PHPではしっかりeもつけてelseifと書きます。

hoge.php
<?php
  // 1〜3までランダムな数を選び、変数hogeに代入
  // ランダム数値の生成はrandを使用。数の範囲は(From,To)のように表現
  $hoge = rand(1,3);

  // 1ならコンニチワ、2ならサヨナラ、3ならマタネ
  if($hoge == 1){
    echo "Hello";
  }elseif($hoge == 2){
    echo "Bye";
  }else{
    echo "See you again";
  }
?>

まとめ

異なる言語だから当然異なる部分はあるけれど、RubyとPHPの基本的な構文は似ている書き方もあることを知りました。

同時に学ぶことで頭の中で書き方が混ざっちゃう可能性には注意しつつ、Rubyの復習・振り返りも兼ねて、PHPも学習していこうと思います。

PHPの基礎もやったら、Ruby on Railsの復習兼ねてPHPの主要フレームワークであるLaravelの学習も進めたいです。

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