Laravel5.7 でバリデーションメッセージを表示する

Laravel5.7 でバリデーションメッセージを表示したいと思います。

Controllerの編集
まずformの確認画面のcontrollerで、送られてきたリクエストに対し、’required’として入力必須にします。

class CompanyConfirmController extends Controller
{
    public function confirm(Request $request){
    	$validatedData = $request->validate([
            'company_name' => 'required',
            'agent_name' => 'required',
        ]);
    	$confirm = new Company($request->all());

    	return view('companyconfirm', compact('confirm'));
    }
}

View(*.blade.php)の編集
デフォルトのメッセージを表示させます。

<span>{{$errors->first('company_name')}}</span>
<span>{{$errors->first('agent_name')}}</span>

特にメッセージをカスタマイズしなければ、英語のメッセージが表示されます。
これでもいいような気はします。

httpd start/restart と httpd gracefulの違い

httpd restart/gracefulはapacheのプロセス停止・再開を行うが、方法が異なる。

httpd restart
restartの場合は、以下のように、完全にhttpdプロセスを一旦停止してから再起動しています。

[vagrant@localhost ~]$ sudo service httpd restart
httpd を停止中: [ OK ]
httpd を起動中: [ OK ]

httpd graceful
httpdの通信が終わるのを待って、順次新しい設定を反映したhttpdを起動させる方法。
[vagrant@localhost ~]$ sudo service httpd graceful

サービスの停止ができない場合は「graceful」の使用をおすすめ。

apache公式ドキュメントを見てみましょう。
https://httpd.apache.org/docs/2.4/stopping.html
Apache HTTP Serverの再起動には、実行されている httpd プロセスにシグナルを送る必要がある。

公式ドキュメントのrestart
restart シグナルを親プロセスに送ると、 TERM と同様に子プロセスを kill しますが、 親プロセスは終了しません。 設定ファイルを再読込して、ログファイル全てを開き直します。 その後、新しい子プロセスを起動して応答を続けます。

公式ドキュメントgraceful
graceful シグナルを受け取ると、子プロセスに現在のリクエストの処理の後に終了する (あるいは何もしていなければすぐに終了する) ように助言します。 親プロセスは設定ファイルを再読込して、ログファイルを開き直します。 子プロセスが徐々になくなるに従って、 新しい世代の設定による子プロセスに置き換えていきます。 そして、これらが新たなリクエストに即座に応答し始めます。

公式には、どんな時にどのコマンドを推奨などは書かれていませんが、サービス運用者およびコンピュータサイエンスとしての考え方は、急にkillするのではなく、緩やかに停止した方が良さそうに見えます。

TSVファイルとは?

TSVファイルとはなにか?
– テキストファイル
– 項目間がタブ区切りになっている
– CSVファイルに近い

例えば、適当にテキストファイルを開き、名前を付けて保存で、.tsvファイルとする。

すると、保存したファイルがTSVファイルになっていることがわかる。

CSVファイルとは?
– CSVファイルのカンマがタブになった版
csvファイル
php,ソーシャル開発,データベース移行
TSVファイル
php ソーシャル開発 データベース移行

タブ記号(タブ文字)を間に挟んでいます。
また、このtsvファイルをExcelで開くこともできます。

Laravel5.7 バリデーションエラー表示

まず公式を見ます。
https://readouble.com/laravel/5.7/ja/validation.html

リクエストの入力が指定したバリデーションルールに当てはまらなかった場合はどうなるか?
→自動的にユーザを以前のページへリダイレクトする。加えて、バリデーションエラーは自動的にフラッシュデータとしてセッションへ保存される。

ん?フラッシュデータって何?
>セッションにアイテムを保存したいことは良くあります。flashメソッドを使ってください。flashメソッドは直後のHTTPリクエストの間だけセッションにデータを保存します。それ以降は削除されます

なるほど、セッションに保持されるデータのことね。$errors変数はIlluminate\Support\MessageBagのインスタンス

う、う、急激に眠くなってきた。

続けて、エラー表示の例
$errors->all()で表示しています。

<h1>ポスト作成</h1>

@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

Laravel5.7 バリデーションの種類

Laravel5.7のバリデーションにはどんなものがあるのか?
Webの記事を見ていてもよくわからない。。

ということで、公式ドキュメントを読み進めて行きたいと思います。
https://readouble.com/laravel/5.7/ja/validation.html

– イントロダクション
ValidatesRequestsトレイトをデフォルトで使用
→ なんじゃそりゃ? とりあえず、phpのマニュアルを見てみよう。凄いな、ループだ。キリがないな。 

トレイトは、PHP のような単一継承言語でコードを再利用するための仕組みのひとつです。 トレイトは、単一継承の制約を減らすために作られたもので、 いくつかのメソッド群を異なるクラス階層にある独立したクラスで再利用できるようにします。

トレイトの例
http://php.net/manual/ja/language.oop5.traits.php

trait ezcReflectionReturnInfo {
    function getReturnType() { /*1*/ }
    function getReturnDescription() { /*2*/ }
}

class ezcReflectionMethod extends ReflectionMethod {
    use ezcReflectionReturnInfo;
    /* ... */
}

class ezcReflectionFunction extends ReflectionFunction {
    use ezcReflectionReturnInfo;
    /* ... */
}

バリデーションに戻ります。
1.ルート定義
ここは想定通り。

Route::get('post/create', 'PostController@create');
Route::post('post', 'PostController@store');

コントローラ作成
getとstoreのメソッドを書いています。これも想定通り。

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class PostController extends Controller
{
    public function create()
    {
        return view('post.create');
    }
    public function store(Request $request)
    {
    }
}

バリデーションロジック
Illuminate\Http\Requestオブジェクトが提供する、validateメソッドを使用する。バリデーションに失敗すると、例外が投げられ、ユーザーに対し自動的に適切なエラーレスポンスが返される。
公式ドキュメントの例

public function store(Request $request)
{
    $validatedData = $request->validate([
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ]);
}

最初のバリデーション失敗時に停止

$request->validate([
    'title' => 'bail|required|unique:posts|max:255',
    'body' => 'required',
]);

とりあえず、ここまででやってみましょうか。

public function store(Request $request){
        $request->validate([
            'company_name' => 'required',
            'agent_name' => 'required',
        ]);
    	$company = new Company([
    		'company_name' => $request->get('company_name'),
    	]);
    	$company->save();
    	$agent_mst = new Agent_mst([
    		'agent_name' => $request->get('agent_name'),
    	]);
    	$agent_mst->save();
    	$data = new Company();
        $table = $data::all();
        return view('companyindex', ['data'=> $table]);
    }

OK!!!
ただバリデーションエラー表示がこれだと、エラー時に何も表示されません。エラー表示を出すようにしましょう。

MySQLのレコードを全削除する

MySQLのレコードを全削除する

DELETEかTRUNCATEを使う。

DELETE FROM ${table_name};
TRUNCATE table ${table_name};

実際にやってみましょう。

mysql> delete from company;
Query OK, 8 rows affected (0.07 sec)

mysql> truncate table agent_mst
    -> ;
Query OK, 0 rows affected (0.17 sec)
mysql> select * from agent_mst;
Empty set (0.00 sec)

Nice

Laravel 5.7 フォームの確認画面へ遷移

フォームへの確認画面の流れとしては、一度確認画面にpostする値を経由してmysqlにinsertします。
大まかな流れは以下の通り。
(1)web/views/*.blade.php でフォーム入力
(2)routes/web.php で確認画面(ConfirmController)へpostする
(3)確認画面のControllerで、確認画面の.blade.php に値を渡す
(4)確認画面から route, controller, model 経由でinsertする

ブレイクダウンして順を追ってみていきましょう。

(1)web/views/*.blade.php でフォーム入力
companyindex.blade.php
「会社名」「代理店」がinput formです。formのactionは action=”/company/confirm” として確認画面に飛ばします。

<form action="/company/confirm" method="post" id="form1">
      <table id="tbl">
        @csrf        
        <tr>
          <th>会社名</th><td><input type="text" name="company_name" size="40"  value=""></td>
        </tr>
        <tr>
          <th>代理店</th><td><input type="text" name="agent_name" size="40"  value=""></td>
        </tr>
      </table>      

      <div class="button_wrapper remodal-bg">
         <button type="submit" value="送信" id="square_btn" onClick="location.href='#modal'">登録</button>
      </div>
      </form>

(2)routes/web.php で確認画面(ConfirmController)へpostする
formの入力画面は get、確認画面 confirm へと入力完了は post

Route::get('/company/input', 'CompanyInputController@input');
Route::post('/company/confirm', 'CompanyConfirmController@confirm');
Route::post('/company/index', 'CompanyIndexController@index');

(3)確認画面のControllerで、確認画面の.blade.php に値を渡す
わたってきた値を $request->all()で変数に代入して、confirmに渡します。

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Company;
use App\Agent_mst;

class CompanyConfirmController extends Controller
{
    public function confirm(Request $request){

    	$confirm = new Company($request->all());

    	return view('companyconfirm', compact('confirm'));
    }
}

(4)確認画面から route, controller, model 経由でinsertする
conmapnyconfirm.blade.php
hiddenで渡さないと駄目ですね。

<form action="/company/index" method="post" id="form1">
      <table id="tbl">
        @csrf        
        <tr>
          <th>会社名</th><td>{{$confirm->company_name}}</td>
        </tr>
        <tr>
          <th>代理店</th><td>{{$confirm->agent_name}}</td>
        </tr>
      </table>      

      <div class="button_wrapper remodal-bg">
         <button type="submit" value="送信" id="square_btn" onClick="location.href='#modal'">登録</button>
      </div>
      <input type="hidden" name="company_name" value="{{$confirm->company_name}}">
      <input type="hidden" name="agent_name" value="{{$confirm->agent_name}}">
      </form>

(4)確認画面から route, controller, model 経由でinsertする
これで、mysql側に入っているか確認します。

簡単やないかー

エンジニアの休日の過ごし方

エンジニアの休日は何をしているのか? どう過ごしたら良いか迷います。
大体、「休日はだいたい〇〇してます」なんてのは眉唾ものだ。私も結構な頻度で聞かれるが、答えに困る。あまりに困った場合、たまに映画に行ってるとか答えることもあるが、実際には1年に1回も行かなかったりします。

で、実際になにをすればよい?
というより、何をするのが最も効率がいいのか?

検討項目
1. 仕事に関連したプロダクトを作る:◎
2. 仕事の復習、来週以降の予習:◎
3. プライベートプロジェクト(趣味の開発):△
4. 新しい技術の勉強:△
5. 飲みに行く:×
6. ショッピング:×
7. 筋トレ、ランニングをする:〇
8. 仕事に関連した投資:◎
9. その他の投資:〇
9. Youtubeを見る:×××
10. 副業(物販):×
11. ネットサーフィン:××

比較してみよう。
あれ、ちょっと待て。
エンジニアというと、「土日は趣味で開発しています」というイメージがあるが、
今置かれている環境のレバレッジを最大に活かすなら、仕事に関連した時間の使い方の方が100%効率がいい
趣味の開発は一見、エンジニアという職業選択の上で良さそうだか、立ち止まって考える必要がある。果たして、効率がいいか?ゼロスクラッチは大事。でも、それが一番いい選択かというと、レバレッチがあまり効かない

「新しい技術の勉強」というのもエンジニアとしてはあるあるだが、今のプロジェクトの関連技術を深めた方が結果的に効率が良さそう。技術の勉強は絶対必要。
一見、副業も良さそうに見えるが、副業も誰も同じことを考えるので、転売など畑違いの事は、効率・競争力が落ちる。Googleの5%ルールや、儲かってます系の動画などに毒されすぎだ。。そんなものは今のプロジェクトが終わって暇になったらやればいい。副業やったって直ぐには成果はでない。時間がかかる。それなら、今の仕事に時間を投下して、それを金に変えた方がリターンが大きそう。
エンジニアたるもの、生産性・効率が一番大事。常識は一切無視。

社蓄というバズワードは?
社蓄とは、つまり会社に都合のいいように使われている、と軽蔑したワード
主に投資家や会社に不満のある人が使う。会社に不満がない人はそこまで会社を批判しない。が、確かに考える必要はある。

で、まとめてみると、、、
あれ、土日も全部仕事やないか!?でも、冷静に考えたらこれが一番効率がいい。
——————
1. 仕事に関連したプロダクトを作る:◎
2. 仕事の復習、来週以降の予習:◎
3. 仕事に関連した投資:◎
4. 筋トレ、ランニングをする:〇

まとめると、趣味の開発、プログラミングの勉強、副業は一旦切り捨ててOK!
土日も、仕事のプロジェクトに関係することに100%使う。これで良し。まずはレバレッジを優先。勉強会などもいいかもしれませんが、関わってるプロジェクトに関連させた方が、相乗効果が出るはず。
(※実際、今のところ仕事は上手くいきつつあり、若干余裕が出てくる。その余裕を土日も更に仕事にベット。再投資しまくれ!)

Yii frameworkとは何か?

Yiiとはphpのフレームワーク
公式サイト: https://www.yiiframework.com/

Yiiの解説

Yii は現代的なウェブ・アプリケーションを迅速に開発するための、高性能な、コンポーネント・ベースの PHP フレームワークです。 Yii という名前 (イー すなわち [ji:] と発音します) は、中国語では「易」であり、「シンプルかつ進化的」であることを意味します。 また Yes It Is のアクロニム (頭字語) であると考えることも出来ます。

中国人が作っているのでしょうか。。。

Google Trendを見てみます。

全く人気がない。
というか、laravelよるrailsの方が使われているんだな。

そろそろ本気出すか。

って、本気はいつだよ。

Larave5.7で複数テーブルにインサート

複数テーブルにインサートするにはどうすればいいか?
controllerで、それぞれテーブルごとのmodelにpostされた値を渡せばよいです。
CompanyとAgent_mstのmodelを読み込んで、requestを渡してsave(インサート)しています。

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Company;
use App\Agent_mst;

class CompanyIndexController extends Controller
{
    public function index(){
    	$data = new Company();
    	$table = $data::all();
    	return view('companyindex', ['data'=> $table]);
    }

    public function store(Request $request){
    	$company = new Company([
    		'company_name' => $request->get('company_name'),
    	]);
    	$company->save();
    	$agent_mst = new Agent_mst([
    		'agent_name' => $request->get('agent_name'),
    	]);
    	$agent_mst->save();
    	$data = new Company();
        $table = $data::all();
        return view('companyindex', ['data'=> $table]);
    }
}

出発