Laravel(ユーザー情報登録画面)

ファイル構成

・ビュー

ユーザー情報登録画面

「resources/views/person」フォルダ内の「create.blade.php」​

ユーザー情報一覧画面(登録後)

「resources/views/person」フォルダ内の「index.blade.php」​

​・モデル

「app」フォルダ内の「User.php

・コントローラ

app/Http/Controllers」フォルダ内の「UsersController.php

 ・ルーティング

「routes」フォルダ内の「wep.php

・ビュー

テンプレートファイル

create.blade.php(ユーザー情報登録画面)

@extends('layouts.temp')                       ➀

@section('title', 'ユーザー情報登録画面') ➁        

@section('content') ➂
   @if(count($errors) > 0) ➃                                                            
   <div>
      <ul>
         @foreach($errors->all() as $error) ➄
            <li>{{ $error }}</li>
         @endforeach
      </li>
   </div>
   @endif
   <form action="/user/create" method="post">
   <table>
      @csrf                              ➅
      <tr><th>user:</th><td><input type="text" name="user" value=
"{{old('user')}}"></td></tr>                    
      <tr><th>email:</th><td><input type="text" name="email" value=
"{{old('email')}}"></td></tr>
      <tr><th>age:</th><td><input type="number" name="age" value=
"{{old('age')}}"></td></tr>
      <tr><th></th><td><input type="submit" value="送信"></td></tr>
   </table>
   </form>
   <a href="/user">ユーザー情報一覧へ</a><br>
   <a href="/user/find">ユーザー情報検索へ</a>
@endsection

 ➀extends('layouts.temp')

「views」フォルダの「layouts」の「temp.blade.php」を継承

レイアウトや@yieldは、継承先で文字列などを定義

@section('title', 'ユーザー情報登録画面')

'title'という区画(@section)に「ユーザー情報登録画面」という文字列を組みこむ

レイアウト位置は、「temp.blade.php」の@yield('title')

➂contentという区画

➃バリデーションチェックでエラーがある場合、表示。

➄エラーメッセージを表示させるための処理を実行

➅クロス・サイト・リクエスト・フォージェリ(CSRF)からアプリケーションを簡単に守るために記述。予期しない(悪意のある)POSTリクエストが送信されることを防ぐ。

Laravelでフォントタグがある場合、必須

"{{old('user')}}"前回入力した値を取り出す

「temp.blade.php」(ユーザー情報登録画面、ユーザー情報一覧のレイアウトファイル)

<html>
<head>
   <title>@yield('title')</title>
   <style>
   h1 {font-size:30pt;}
   h2 {font-size:10pt;}
   .content{margin:10px;}
   </style>
</head>
<body>
   <h1>@yield('title')</h1>
   <hr size="1">
   <h2>@yield('order')</h2>
   <div class='content'>
   @yield('content')
   </div>
</body>
</html>

「index.blade.php」(ユーザー情報一覧画面)

「resources/views/person」フォルダ内

@extends('layouts.temp')               ➀   

@section('title','ユーザー登録者情報')

@section('content')
<table>
<tr><th>User</th><th>Email</th><th>Age</th></tr>
@foreach ($lists as $list)              ➁
   <tr>
       <td>{{$list->user}}</td>
       <td>{{$list->email}}</td>
       <td>{{$list->age}}</td>
   </tr>
@endforeach
</table>
<a href="/user/create">ユーザー情報登録へ</a>
@endsection

➀「views」フォルダの「layouts」の「temp.blade.php」を継承

➁listsで受け取ったレコードをforeachで順に出力

 ・モデル

「app」フォルダ内の「User.php

<?php

namespace App;                            ➀

use Illuminate\Database\Eloquent\Model; ➁

class User extends Model                      
{
    public function getData()                    ➃
    {
        return $this->id.':'.$this->user.'('.$this->age.')';
    }
    public $timestamps = false;                   ➄
    protected $guarded = array('id'); ➅

    public static $rules = array(                  ➆
        'user' => 'required',
        'email' => 'email',
        'age' => 'integer|min:0|max:100'
    );
}

 ➀namespaceは名前空間とも呼ばれ、項目をカプセル化

名前空間ソースコードの1番先頭で宣言する必要。

(メリット)

名前空間を使用することにより、関連するクラスや、インターフェイス、関数、定数などをグループ化することが可能

・namespaceを指定すれば、同一のファイルでクラスや関数などの名前の衝突を防ぐことができる。

➁useとは名前空間拡張機能

クラス・関数・定数などをインポートするときに使用

➂Modelクラスを継承したUserクラス

➃id,user,ageをまとめて出力

イメージ

5が「id」、「:」で文字列を繋げてyamasitaが「user」、「:」で文字列を繋げて「(」で繋げて「32」が「age」で「)」で繋げる。

f:id:mkyosuke:20200130132836p:plain

➄timestampを無効

使わない場合は無効にしておかないと「updated_at」がありませんと怒られる。

ユーザーから変えてほしくない値(id)ブラックリスト_複数代入時に代入を許可しない属性を配列で設定

➆バリデーションルールを設定

userでは、required 必須入力

emailでは、email  メール形式

ageでは、 integer|min:0|max:100 0歳から100歳まで入力可能

 

 

・コントローラ

app/Http/Controllers」フォルダ内の「UsersController.php

<?php

namespace App\Http\Controllers;  

use App\User;
use Illuminate\Http\Request;

class UserController extends Controller             ➀            
{
    public function index(Request $request)
    {
       $lists =User::all(); ➁
       return view('user.index',['lists' => $lists]); ➂
    }
    
    public function add(Request $request)                             
    {
       return view('user.create');             ➃             
    }

    public function create(Request $request)                    
    {
       $this->validate($requestUser::$rules);           ➄ 
       $user = new User;                   ➅
       $formdata = $request->all();             ➆
       unset($formdata['_token']);                        ➇
       $user->fill($formdata)->save();                    ➈ 
       return redirect('/user');                          ➉
    }
}

 ➀controllerクラス継承したUserControllerクラス

➁レコード全件取得

➂レコードデータが格納している$listsをビュー側で(テンプレートファイル:「views」フォルダ内の「user」フォルダのindex.blade.php)で使用できるようにして、返す

➃レコード追加。

「views」ファルダ内の「user」フォルダの「create.blade.php」に返す。

➄バリデーションの実行

モデルクラス「User.php」でバリデーションのルールを設定したvalidateメソッドで実行。

➅Userインスタンスを作成。

➆postアクセスで与えられてきたフォームの値を$formdataに格納

➇隠しCSRFトークンフィールドを$formdataからunsetで削除

➈オブジェクト変数($user)にform入力値データをモデルのプロパティに代入して保存。

➉ユーザー情報一覧へリダイレクト

 

 ルーティング

「routes」フォルダ内の「wep.php

Route::get('user','UserController@index');      ➀      

 ➀レコード一覧を表示をするルーティング情報

 

Route::get('user/create','UserController@add');     ➁    
Route::post('user/create','UserController@create');   ➂

 ➁レコード追加getアクセスのルーティング情報

 ➂レコード追加postアクセスのルーティング情報

 

/user/createにアクセス

ユーザー情報テーブル「users」に新規にレコードを追加する。

 

f:id:mkyosuke:20200130152325p:plain

フォームにそれぞれの項目を入力

f:id:mkyosuke:20200130152524p:plain


 送信クリック

f:id:mkyosuke:20200130152629p:plain