PHP(Laravel)の基本知識

PHP

今回はlaravelの基本知識を紹介します。

  1. composerインストール
    1. インストール
    2. プロキシ設定
      1. 環境変数
    3. リポジトリ変更
  2. laravelインストール
    1. 最新バージョン
    2. バージョンを指定する
  3. laravelディレクトリの構成
  4. laravel起動方法
    1. artisapでアクセス
    2. apacheでアクセス
  5. laravelルート
    1. ルート定義メソッド
      1. 複数ルート定義の場合
    2. URLからパラメータ取得
      1. 必須パラメータ
      2. 任意パラメータ
      3. フレームワーク以外の方法
    3. ルートのalias
    4. ルートのグループ
  6. laravelのコントローラ
    1. コントローラの保存パス
    2. コントローラの作成コマンド
    3. コントローラのルート
    4. ユーザ入力内容取得
      1. Request
      2. dd関数
  7. データベース接続
  8. DBクラス
    1. insert
    2. update
    3. select
      1. 全件取得
      2. 指定した条件のデータ
      3. 一行のみ取得
      4. 指定したカラムのデータ取得
      5. 複数カラムのデータ取得
      6. ソート
      7. ページ分け
    4. delete
    5. SQL文実行
  9. ビュー
    1. ファイル名
    2. 画面表示(データなし)
    3. 画面表示(データあり)
    4. compactのPHP関数
    5. ループ
    6. if条件分岐
    7. @yield
      1. parent.blade.php
      2. children.balde.php
    8. include
  10. CSRF
    1. form追加
    2. CSRF排除対象
  11. Model
    1. モデルの作成
      1. モデルのプロパティ
    2. コントローラでモデルの使い方
      1. データ登録(insert)
      2. データ検索(select)
      3. データ更新(update)
      4. データ削除(delete)
    3. バリデーション
      1. コントローラ
      2. ビュー画面
      3. メッセージを日本語化
        1. 方法1
        2. 方法2
  12. ファイルアップロード
  13. ページネーション(ページング)
  14. captcha
    1. パッケージのインストール
  15. migration
    1. ファイル作成
    2. ファイルにテーブルの定義作成
    3. マイグレーション実行
      1. テーブル作成
      2. テーブル削除
  16. seed
    1. シーダーファイル作成
    2. データの流し込みなどの記述を追加
    3. シーダー実行
  17. レスポンス
    1. ビューのレスポンス
    2. jsonのレスポンス
  18. リダイレクト
  19. Session
  20. キャッシュ
    1. 設定
    2. 値取得
    3. 削除
  21. 複数テーブル結合
    1. テーブル結合
    2. モデル結合(一対一)
    3. モデル結合(1対多)
    4. モデル結合(多対多)

composerインストール

PHPインストール済みの状態で実行する。

以下の拡張もインストールされる必要となります。
php-mbstring
php-xml

インストール

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

プロキシ設定

社内環境からプロキシを利用する場合、環境変数を設定する

環境変数

HTTP_PROXY=http://proxy-host:proxy-port/
HTTP_PROXY_REQUEST_FULLURI=1
HTTPS_PROXY=http://proxy-host:proxy-port/
HTTPS_PROXY_REQUEST_FULLURI=0

リポジトリ変更

リポジトリを変更したい場合、以下のコマンドで変更できます。

composer config -g repo.packagist composer https://url…
※packagistを使わないcomposerのgitリポジトリの作成方法もあります。今回は省略。。。

laravelインストール

最新バージョン

composer create-project laravel/laravel –prefer-dist ./プロジェクト名

バージョンを指定する

composer create-project laravel/laravel=5.8.* –prefer-dist ./プロジェクト名

laravelディレクトリの構成

app アプリケーションのコアとなるコードを含むディレクトリです。
bootstrap フレームワークの初期化を行い、autoloadingを設定するファイルをおく。また、フレームワークが作り出すキャッシュファイルを貯めたりもする。
config アプリケーションの設定ファイルをおくディレクトリ。
database データベースのマイグレーションやシードをおくディレクトリ。
public 全てのリクエストのエントリーポイント(最初に実行される)となるindex.php ファイルがあるところ。
ここには他に画像、JS、CSSといったものを置いたりする。
resources コンパイル前のLESS、SASS、JS、viewといったものを置くところ。
routes アプリケーションの全てのルートを定義するディレクトリ。
デフォルトでは web.php api.php console.php channels.php といったルートファイルを用意してある。
storage Bladeテンプレートをコンパイルしたものやセッションのファイル、キャッシュファイル、その他フレームワークが作り出したファイルなんかが置かれる。
tests PHPUnit みたいな自動テストを置くためのディレクトリ。
vendor 依存ライブラリをおくところ。

laravel起動方法

artisapでアクセス

以下のコマンドで簡単なサーバを起動でき、アクセスできます。

php artisap serve

apacheでアクセス

下記のファイルを変更し、ダウンロードしたlaravelのpublicディレクトリを指定する。

vi /etc/httpd/conf/httpd.conf

DocumentRoot “laravel/public”
       AllowOverride all

laravelルート

ファイル「routes/web.php」はルート定義ファイルです。

ルート定義メソッド

Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

複数ルート定義の場合

定義したメソッドでアクセスできる。

Route::match([‘get’,’post’], ‘/’, function() {
    //
});
すべてメソッドでアクセスできる。
Route::any(‘foo’, function(){
    //
});

URLからパラメータ取得

必須パラメータ

Route::get(‘sample/{id}’, function($id) {
});

任意パラメータ

Route::get(‘sample/{id?}’, function($id) {
});

フレームワーク以外の方法

Route::get(‘sample’, function() {
      $_GET(‘id’);
});

ルートのalias

Route::get(‘/’, function(){
})->name(‘home’);

利用の場合:
route(‘home’);

ルートのグループ

Route::group([‘prefix’=>’/admin’],function(){
    Route::get(‘login’,function() {
         // /admin/loginのアクセスで実行できる
    });
    Route::get(‘logout’,function() {
         // /admin/logoutのアクセスで実行できる
    });
});

laravelのコントローラ

コントローラの保存パス

app/Http/Controllers

コントローラの作成コマンド

php artisan make:controller  [ディレクトリ/]コントローラ名Controller

コントローラのルート

routes/web.phpを編集する。

Route::get(‘/test’, ‘App\Http\Controllers\TestController@test’);
※コントローラ名@メソッド名

ユーザ入力内容取得

Request

$request->all();  //すべてデータ取得
$request->input(‘name’); //指定した項目のデータを取得
$request->get(‘name’);//指定した項目のデータを取得
$request->only([‘name1′,’name2’]); // 指定した一覧のみ
$request->except([‘name1′,’name2’]); // 指定した一覧除外
$request->has(‘name’);  //存在チェック

dd関数

dd関数では変数内容を取得し、終了する。デバッグの場合、使えます。

 

データベース接続

laravel/.envファイルに定義している
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

DBクラス

insert

DB::talbe(‘テーブル名’)->insert(1次元配列);   1件データを登録
DB::talbe(‘テーブル名’)->insert(2次元配列);   複数件データを登録

DB::talbe(‘テーブル名’)->insertGetId(1次元配列);   1件データを登録

update

DB::talbe(‘テーブル名’)->where(‘id’,’=’,1)->where(‘id’,’=’,1)->update([]); // []更新データは配列
DB::talbe(‘テーブル名’)->where(‘id’,’=’,1)->orWhere(‘id’,’=’,1)->orWhere(‘id’,’=’,1)->update([]);

DB::talbe(‘テーブル名’)->where(‘id’,’=’,1)->increment(‘カラム名’);   // +1
DB::talbe(‘テーブル名’)->where(‘id’,’=’,1)->increment(‘カラム名’, 5);   // +5

DB::talbe(‘テーブル名’)->where(‘id’,’=’,1)->decrement(‘カラム名’);   // -1
DB::talbe(‘テーブル名’)->where(‘id’,’=’,1)->decrement(‘カラム名’, 5);   // -5

select

全件取得

DB::table(‘テーブル名’)->get();   //全件取得
$data = DB::table(‘session’)->get();
foreach($data as $value) {
    var_dump($value->session_id);
}

指定した条件のデータ

DB::table(‘テーブル名’)->where(‘session_id’,’=’,’111′)->get(); 

一行のみ取得

DB::table(‘テーブル名’)->where(‘id’,’1′)->first();

指定したカラムのデータ取得

DB::table(‘テーブル名’)->where(‘id’,’1′)->value(‘カラム名’);

複数カラムのデータ取得

DB::table(‘テーブル名’)->select(‘カラム1’,’カラム2′)->get();
DB::table(‘テーブル名’)->select(‘カラム1 as sss’)->get();
db->select(DB::raw(‘カラム1,カラム2’)->get();

ソート

DB::table(‘テーブル名’)->orderBy(‘カラム名’,’desc’)->get();

ページ分け

DB::table(‘テーブル名’)->limit(件数)->offset(開始インデクス)->get();

delete

DB::talbe(‘テーブル名’)->where(‘カラム名’,値)->delete();
DB::talbe(‘テーブル名’)->truncate();

SQL文実行

DB::select(“select 文”);
DB::select(“insert 文”);
DB::update(“update文”);
DB::delete(“delete文”);
DB::statement(“create table など”);

ビュー

ファイル名

パス:resources/views
ファイル名*.blade.php または*.php    
例:「a.blade.php」と「a.php」は両方がある場合、a.blade.phpを採用される。

画面表示(データなし)

class TestController extends Controller
{
  //
  public function test() {
   return view(‘a’);
  }
}

画面表示(データあり)

view(‘ビュー名’,配列);
view(‘ビュー名’)->with(配列);
view(‘ビュー名’)->with(配列)->with(‘キー’,’value’);

ビュー画面に利用
{{$変数名}}

compactのPHP関数

$aa = “abc”;
$ab = “sdef”;

$data = compact(‘aa’,’ab’);  //配列を作成

ループ

@foreach($list as $key => $value)
     //処理内容
@endforeach
Controller:
class TestController extends Controller
{
  //
  public function test() {
    $data = DB::select(“select * from session”);
    $datas = compact(‘data’);

    return view(‘test’)->with($datas);
  }
}

view:

@foreach($data as $key =>$value)
{{$value->session_id}} <br>
@endforeach

if条件分岐

@if()
  //処理内容
@elseif()
  //処理内容
@else
  //処理内容
@endif

@yield

parent.blade.php

<html>
<body>
<div><h1>header</h1></div>
<!– rewrite–>
@yield(‘body’)
<div><h1>footer</h1></div>
</body>
</html>

children.balde.php

@extends(‘parent’)
@section(‘body’)
内容
@endsection

include

@include(‘parent’)

CSRF

form追加

<input type=”hidden” name=”_token” value=”{{csrf_token()}}”>
===
{{csrf_field()}}

CSRF排除対象

ファイルapp/Http/Middleware/VerifyCsrfToken.php

protected $except = [
//
 ’*’ //すべてCSRFチェックしない
   ‘ルート名’  //指定したルート名はCSRFチェックしない
];

Model

モデルの作成

php artisan make:model User

モデルクラスにどのテーブルを使用するか明示的に指定しない限り、クラス名を複数形の「スネークケース」にしたものが、テーブル名として使用されます。モデル「User」に対して、テーブル「users」を使用します。

モデルのプロパティ

プロパティ「protected $table」はテーブル名を指定することができます。 
プロパティ「protected $primaryKey」はキーはidではない場合、primary keyを指定することができます。
プロパティ「public $timestamps」はテーブルの「created at」、「updated_at」を更新する。更新したくない場合、falseを設定する。
プロパティ「protected $fillable」はテーブルを更新するとき、操作できるカラムの一覧。配列を指定する。
create,saveメソッドを利用するとき、使います。
プロパティ「protected $guarded」はテーブルを更新するとき、操作できないカラムの一覧。配列を指定する。

コントローラでモデルの使い方

①モデルをインポートする
②モデルをDBアクセスする方法
・モデル名::get();
モデルクラス名::get();
・モデルクラスをインスタンスする。
$model = new モデルクラス名();
$model->get();

データ登録(insert)

class TestController extends Controller
{
    //
    public function test() {
        $model = new Session();
        $model->session_id = ‘121212’;
        $model->session_value = ‘22222’;
        $model->session_time = ’11’;

       $res = $model->save();
       dump($res);
    }
}
class TestController extends Controller
{
    //
    public function test(Request $request) {
        $res = Session::create($request->all());
       dump($res);
    }
}

データ検索(select)

$info = Seesion::find(1111);  // キーは4のデータを抽出する。データはオブジェクト
$info = Seesion::find(1111)->toArray();  // キーは4のデータを抽出する。データは配列
Session::all(); == Session::get();
Session::all([‘name1′,’name2’]);
Session::get([‘name1′,’name2’]);

Session::where(‘age’,’>’,’29’)->get([‘name1′,’name2’]);
Session::where(‘age’,’>’,’29’)->select(‘name1′,’name2’)->get();
Session::where(‘age’,’>’,’29’)->select([‘name1′,’name2’])->get();

データ更新(update)

$session = Session::find($id);
$session->session_value= $_POST[‘session_value’];

return $session->save()?’OK’:’fail’;
Session::where(‘seesion_id’,111)->update([‘session_value’=>’sss’]));

データ削除(delete)

$session = Session::find($session_id);
return $session->delete();
Member::where(‘session_id’,11)->delete();

バリデーション

コントローラ

public function test(Request $request) {
    // バリデーションチェック
    $this->validate($request,[
        ‘name’=>’required|min:2|max:20’,
        ‘age’=>’required|integer|min:0|max:200’
    ]);

    $res = Session::create($request->all());
}

ビュー画面

{{– エラーメッセージ –}}
@if ($errors->any())
    <div class=”alert alert-danger”>
       <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
      </ul>
    </div>
@endif

メッセージを日本語化

方法1

手動で、チェックのエラーメッセージを定義する。

public function test(Request $request) {
    // バリデーションチェック
    $this->validate($request,[
        ‘name’=>’required|min:2|max:20’,
        ‘age’=>’required|integer|min:0|max:200’
    ],[
         ‘name.required’ => ‘ユーザ名は必須です。’,
         ‘name.min’ => ‘ユーザ名は2文字以上で入力してください。’
   ]);

    $res = Session::create($request->all());
}
方法2

日本語の設定ファイルを利用する。デフォルトは英語のみがダウンロードされていますが、
サイト「Packagist」からlaravel-langを検索し、言語ファイルをダウンロードする。

ファイルアップロード

  public function test(Request $request) {
      if ($request-> hasFile(‘filename’) && $request-> file(‘filename’)->isValid()){
           $name=md5(time().rand(100000,999999).’.’.$request->file(‘filename’)->extension();
           $request->file(‘filename’)->move(‘./statics/upload’,$name);
           $path = ‘/statics/upload/’.$name;
      }
      $data = $request->except([‘_token’,’filename’]);
      $data[‘filename’] = isset($path)??”;

      $res = User::insert($data);
}

ページネーション(ページング)

class TestController extends Controller
{
     public function test(Request $request) {
        $data = Session::paginate(2);
        return view(‘admin.test’, compact(‘data’));
     }
}

view:

@foreach($data as  $val)
<tr>
    <td>{{$val ->id}}</td>
    <td>{{$val ->name}}</td>
</tr>
@endforeach

{{$data->links()}}

captcha

パッケージのインストール

composer require mews/captcha

config/app.phpにproviders,aliasを追加

設定ファイルを出力
php artisan vendor:publish

migration

ファイル作成

php artisan make:migration ファイル名    // ファイル名:create_テーブル名_table

ファイルにテーブルの定義作成

public function up()
{
    Schema::create(‘tests’, function (Blueprint $table) {
        $table->id();
        $table->timestamps();
    });
}

マイグレーション実行

テーブル作成

初めて
php artisan migrate:install   // migrationsテーブルが作成される
php artisan migrate  //自分定義したテーブルを作成する

テーブル削除

php artisan migrate:rollback

seed

シーダーファイル作成

php artisan make:seeder PaperTableSeeder

データの流し込みなどの記述を追加

public function run()
{
    DB::table(‘paper’)->insert([
         [‘paper_name’ => ‘test1’, ‘total_score’ => ‘100’],
         [‘paper_name’ => ‘test2’, ‘total_score’ => ‘200’],
         [‘paper_name’ => ‘test3’, ‘total_score’ => ‘300’]
    ]);
}

シーダー実行

php artisan db:seed –class=PaperTableSeeder

レスポンス

ビューのレスポンス

return view(‘welcome’);

return “hello world”;   // booleanのデータはNG

jsonのレスポンス

return response()->json(データ);

リダイレクト

一部のみを紹介します。

return redirect(ルート)->withErrors([]);
return rediretc()->to(ルート);
return rediretc(ルート);

return redirect(‘test/index’, 301);   //ステータスコードあり

Session

デフォルトはファイルにデータを保存してる。パス:「storage/framework/sessions」

use Session;

Session::put(‘key’,’value’);
$value = Session::get(‘key’);
$value = Session::get(‘key’,’default’);
$value = Session::get(‘key’,function() { return ‘default’;});

Session::all();
Session::has(‘users’);  //存在チェック
Session::forget(‘key’);  //削除
Session::flush();    // 全部削除

viewに{{Session::get(‘code’)}}

キャッシュ

設定

パス:storage/framework/cache/data

 
Cache::put(‘key’, ‘value’, $minutes); // key存在したら、更新
Cache::add(‘key’,’value’); // key存在したら、NG
Cache::forever(‘key’,’value); //2286年まで有効

値取得

Cache::get(‘key’);
Cache::get(‘key’,’default’);
Cache::get(‘key’,function(){
    return ‘default’;
});
Cache::has(‘key’);
// キャッシュ存在したら、キャッシュを利用する、期限切れたら、取得し、キャッシュする
Cache::remember(‘key’,$minutes, function(){
      return data;
});

削除

Cache::pull(‘key’);  // 値を取得し、削除。ディレクトリが残る
Cache::forget(‘key’);    // 全部削除。ディレクトリが残る。
Cache::flush();         // 全部削除ディレクトリが削除

複数テーブル結合

テーブル結合

DB::table(‘テーブル t1’->join(‘テーブル t2’, ‘t1.id’, ‘=’,’t2.id’)->get();
DB::table(‘テーブル t1’)->leftjoin(‘テーブル t2’, ‘t1.id’, ‘=’,’t2.id’)->get();

DB::table(‘talbe t1’)->select(‘t1.id’,’t1.name’)->leftjoin(‘table t2′,’t1.id’,’=’,’t2.id’)->get();

モデル結合(一対一)

class Author extends Model
{
     use HasFactory;
     protected $table = ‘author’;
     public $timestamps = false;
}
class Comment extends Model
{
     use HasFactory;
     protected $table = ‘comment’;
     public $timestamps = false;
}
class Keyword extends Model
{
     use HasFactory;
     protected $table = ‘keyword’;
     public $timestamps = false;
}
class Article extends Model
{
     use HasFactory;
     protected $table = ‘session’;
     public $timestamps = false;
     public function rel_author()
     {
          return $this->hasOne(‘App\Model\Author’,’Author.key’,’Articel.key’);
     }
}
使い方:
$data = Article:all();

foreach($data as $key =>$value) {
    echo $value->rel_author->colume_name;   // rel_authorは関数名
}

モデル結合(1対多)

class Article extends Model
{
     use HasFactory;
     protected $table = ‘session’;
     public $timestamps = false;
     public function rel_author()
     {
          return $this->hasOne(‘App\Model\Author’,’Author.key’,’Articel.key’);
     }

     public function rel_comment()
     {
          return $this->hasMany(‘App\Model\Comment’,’Comment.key’,’Articel.key’);
     }
}
使い方:
$data = Article:all();

foreach($data as $key =>$value) {
    echo $value->rel_author->colume_name;   // rel_authorは関数名
    foreach($value->rel_comment   as $k => $v) {
        echo $v->colume_name;
   }
}

モデル結合(多対多)

多対多は二つ1対多ですね。

class Article extends Model
{
     use HasFactory;
     protected $table = ‘session’;
     public $timestamps = false;
     public function rel_author()
     {
          return $this->hasOne(‘App\Model\Author’,’Author.key’,’Articel.key’);
     }

     public function rel_comment()
     {
          return $this->hasMany(‘App\Model\Comment’,’Comment.key’,’Articel.key’);
     }

     public function rel_keyword()
     {
          return $this->belongsToMany(‘App\Model\Keyword’, ‘rel_table‘, ‘Keyword.key’,’Articel.key’);
      }
}
使い方:
$data = Article:all();

foreach($data as $key =>$value) {
    echo $value->rel_author->colume_name;   // rel_authorは関数名
    foreach($value->rel_comment   as $k => $v) {
        echo $v->colume_name;
   }

    foreach($value->rel_keyword as $k => $v) {
        echo $v->colume_name;
   }
}
タイトルとURLをコピーしました