- 投稿日:2021-01-28T23:12:01+09:00
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 -dhostsの書き換え
リポジトリのREADMEに書いてある通り進めていきます。
ローカルのhostsファイルに以下を追記。127.0.0.1 symfony.localhosthostsの場所
Windowsの場合
C:\Windows\System32\drivers\etcmacの場合
/private/etc/hosts※違ってたらご指摘お願いします。
コンテナへ入る
$ docker exec -it php-fpm shsymfonyプロジェクトのインストール
# composer create-project symfony/website-skeleton . 4.2.xバージョンを変えたい方は末尾の数字を変えてください。
今回は4.2.xを指定しています。確認
終わりです!
これで環境構築は終わりです。
多分これが一番早いと思います。
kibanaとかxdebugはREADME読めばすぐにわかるハズ。さいごに
チュートリアルでサンプルを作成しましたが、Symfony4の参考書も購入してみました。
とても読みやすいので最初はおすすめです。https://www.amazon.co.jp/dp/B07NQ5WH6R/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1
- 投稿日:2021-01-28T22:45:33+09:00
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();タスクマネージャーでもわかる
タスクマネージャーでは、32bitアプリはこのように(32 ビット)と表示されます。親切ですね。
なので、XAMPPのphp.exeを実行してタスクマネージャーで見てみました。php.exeをダブルクリックすればphpのコンソールが立ち上がります。この状態でタスクマネージャーを見ます。で、php.exeを探すと…
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以外を上書きすれば良い。
参考
- 投稿日:2021-01-28T21:57:58+09:00
Windows + mamp 環境で mb_send_mail を使って送信テストがしたい
はじめまして
mamenoといいます今回は、あまり環境的にノーマルでない、
Windowsとmampという環境でお問い合わせメールを送信する方法が
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のアプリパスワード
→保存これでお問い合わせが届きました
超参考にしたサイト
- 投稿日:2021-01-28T21:24:04+09:00
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.phptry{ $db = new PDO('mysql:dbname=用意しているdbname;host=ホスト名;port=webに表示させたいURL;charset=utf8','dbユーザー名','パスワード'); } catch(PDOException $e){ print('DB接続エラー:' . $e->getMessage()); }これでリモートに反映することができました。
知らないことを色々調べて論理付けて学べてよかった。
- 投稿日:2021-01-28T16:52:40+09:00
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 へ更新されていた
以上
- 投稿日:2021-01-28T10:51:16+09:00
【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">×</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">×</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】
- 投稿日:2021-01-28T10:12:52+09:00
VichUploaderBundleを適用するEntityのプロパティはNULLを許容しないと削除ができない
はじめに
Symfonyのファイルのアップロードに、VichUploaderBundleを使っています。
Api Platformを使っていて、ファイルのアップロードは、ドキュメント通りに行って問題なし。
問題
Entityの削除(DELETE)を発行したら、以下のようによくあるエラーがでる。
"Expected argument of type "string", "null" given at property path "originalFileName"."原因
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; }無事に削除ができるようになりました。
まとめ
NULL許容で実装した方が、他のバンドルとも連携があるのでよいのですね。
make:entityで作ったままがよいのかも?参考文献
- 投稿日:2021-01-28T02:26:39+09:00
[Laravel6] 条件によってバリデーションの内容を変える方法
バージョン情報
- PHP 7.4.2
- Laravel 6.2
実現したいこと
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.phppublic 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.phppublic 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.phppublic function post(PostTextRequest $request) { // postの処理... }これでControllerはスッキリするし、スマートに書ける(気がする)。
ご指摘、アドバイスお待ちしております。
- 投稿日:2021-01-28T00:36:39+09:00
【初心者】RubyとPHPの基本的な書き方を比較してみた
この記事は…
プログラミング初心者学習向きのスクリプト言語として人気のあるRubyとPHP。
Ruby基礎の復習も兼ねて、PHPではどのように書くか比較したアウトプットです。ファイルの拡張子
Rubyのファイルは「.rb」。PHPのファイルは「.php」
記述方法
Rubyには「拝啓〜敬具」みたいなプログラムの書き出しと締めの言葉はないけれど、PHPでは開始と終了に<?php 〜 ?>とタグを記述する必要があります。
hoge.php<?php // ここ(タグの間)にプログラムを書く ?>コメントアウトはRubyの場合は#を付与。
hoge.rb# Rubyの1行コメントアウト =begin Rubyの 複数行コメントアウト ですよ =endPHPでは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.rbhoge1 = "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.rbhoge = gets.chompPHPでは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の学習も進めたいです。