PHP/Elixirエンジニアのブログ

有益なアウトプットを心がけます。

ソケット通信とは

ソケット通信とは

ソケット インターネットはTCP/IPと呼ぶ通信プロトコルを利用しますが、そのTCP/IPをプログラムから利用するには、プログラムの世界とTCP/IPの世界を結ぶ特別な出入り口が必要となります。 その出入り口となるのがソケット(Socket)であり、TCP/IPのプログラミング上の大きな特徴となっています。
引用元: http://research.nii.ac.jp/~ichiro/syspro98/socket.html

とのことで、普段利用しているHTTP通信もソケット通信を行っているのですね。

ソケットはどこを指す?

 ソケットにも種類がある

 INETドメインソケット(TCPソケット)

  • ネットワーク上でマシンを越えてのプロセス間通信

 UNIXドメインソケット

  • 同じマシン上で動いているプロセス間で通信を行うためのソケット
  • 自マシンのみ

 UNIXドメインソケットは何がいいのか?

 UNIXドメインソケットの種類

【Laravel】@include @yield @section

@include()

@include は 継承ができません
デフォルト値の設定もできません。
変数を渡すことができます

 @yield()

@yield は 継承ができません
デフォルト値の設定ができます。

 @section()

@section()〜@endsection は 継承することができます
例にあるように @parent と書くと親テンプレートの @section() の内容が展開されます。

scriptの追加記述の他、サイドバーをページによって出し分け or 追加等をしたい場合にも便利に使えそうです。

ちなみに @section の閉じタグですが、親テンプレートの場合は @show で終わり、 子テンプレートの場合は @endsection もしくは @stop で終わります。間違えずに覚えて使い分けましょう。

【Laravel】ディレクティブ一覧

LaravelのBladeには「ディレクティブ」という機能があります。
これは言語における構文のような役割を果たします。
基本的に「@ディレクティブ名」という形で記述して
「@endディレクティブ名」で終了します。

@ifディレクティブ(条件分岐1)

条件分岐(if文)に相当するディレクティブです。
「@if」はその後に条件を設定します。
それ以降、〜@endifまでの部分を表示します。

■条件がtrueの時に表示する

@if (条件)
・・・・出力内容・・・・
@endif

■条件によって異なる表示をする

@if (条件)
・・・・出力内容・・・・
@else (条件)
・・・・出力内容・・・・
@endif

■複数の条件を設定する

@if (条件)
・・・・出力内容・・・・
@elseif (条件)
・・・・出力内容・・・・
@else (条件)
・・・・出力内容・・・・
@endif

「@if」には「@elseif」と「@else」という
ディレクティブがオプションで用意されています。
「@elseif」はいくつでも続けて表記できます。

@unlessディレクティブ(条件分岐2)

条件が非成立の時に表示するディレクティブです。
ということは、「@if」の逆の働きをします。
「@unless」は条件がfalseの場合に表示を行い、
trueの場合は表示をしません。

@unless (条件)
・・・・出力内容・・・・
@else 
・・・・出力内容・・・・
@endunless

@emptyディレクティブ(条件分岐3)

変数が空の場合に表示するディレクティブです。
「@empty」は()に指定した変数が空の時に表示を行います。
「@else」は、変数が空でない場合(変数が設定されてる)
場合に表示されます。

@empty (変数)
・・・・出力内容・・・・
@else 
・・・・出力内容・・・・
@endempty

@issetディレクティブ(条件分岐4)

変数が定義済みの場合に表示するディレクティブです。
「@isset」は()の変数が定義されてるか確認を行います。
変数が定義されていてnullでない場合に表示を行います。
「@else」は変数が未定義であった場合に表示されます。

@isset (変数)
・・・・出力内容・・・・
@else 
・・・・出力内容・・・・
@endisset

@for ディレクティブ(繰り返し1)

PHPの「for構文」に相当するディレクティブです。
「for構文」と同様に、
()内に初期化処理、繰り返し条件、繰り返しの後の
3つの処理を用意します。

@for (初期化 ; 条件 ; 後処理)
・・・・繰り返す表示・・・・
@endfor

@foreach ディレクティブ(繰り返し2)

PHPの「foreach構文」に相当するディレクティブです。
()内に配列、変数を用意します。
配列から変数へ値を取り出す処理を繰り返していきます。

@foreach ($配列 as $変数)
・・・・繰り返す表示・・・・
@endforeach

@forelse ディレクティブ(繰り返し3)

PHPの「foreach構文」に「else」を追加した場合の処理
相当するディレクティブです。
()の配列から値を全て取り出し終えて取り出せなくなった時に
「@empty」にある処理を実行し繰り返しを終えます。

@forelse ($配列 as $変数)
・・・・繰り返す表示・・・・
@empty
・・・・$変数が空の時に表示・・・・
@endforelse

@while ディレクティブ(繰り返し4)

PHPの「while構文」に相当するディレクティブです。
引数に条件を設定して、trueの場合に表示します。

@while (条件)
・・・・繰り返す処理・・・・
@endwhile

ただし、実行に使っている変数などの値が変化しなければ
無限ループとなってしまうため
ディレクティブ内で何らかの処理を設定する必要があります。

@breakと@continue

@breakは出力されると繰り返しの処理が中断されます。
@continueは繰り返し処理をスキップすることができます。

@phpディレクティブ

Blade内でphpスクリプトを直接実行できるディレクティブです。

@php(条件)
・・・・phpのスクリプト・・・・
@endphp

【Laravel】モデルのリレーション

 複数のテーブルが関連しながら動くプログラムでは、 モデルの「リレーション」と呼ばれる機能を使い テーブルを関連つけて操作します。

リレーションとは

テーブルの関連付けを意味します。 Ruby on Railsのアソシエーションと呼ばれる機能と ほぼ同じ機能・意味ということです。

SQLを利用している

SQLデータベースには、 「テーブルのレコードが別のテーブルのレコードに関連付けられる」 といったことを設定する仕組みがあります。 これを元に効率的に関連レコードを取得できれば 無駄なデータベースアクセスもなくなり、 複数のテーブルにまたがった情報を まとめて取り出せるようになります。

Eloquentの機能

Eloquentにはこのようなテーブル同士の関連付けを 簡単に実装するための仕組みが用意されています。

Blade記述方法

if文

index.php
@if ($val === null)
    <p>NULLだよ</p>
@else 
    <p>NULLじゃないよ</p>
@endif

 for文

index.php
@for ($i = 1; $i < 10 ; $i++)
    <p>{{ $i }} 番目</p>
@endfor

 js呼び出し

index.php
<!-- viewsから見たアドレスを書く views/common/_script.blade.php-->
@include('common._script')

この_script.blade.phpの中にscriptを書く
例:

_script.blade.php
<script src="//ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
    // jsのコード
});
</script>

 PHPのClass読み込み

index.php
<!-- 第一引数はbladeで使うためのオブジェクト名第二引数はパス -->
@inject('value_generator', 'App\Libs\ValueGenerator')

 CSRFトーク

フォームがある場合はこれをフォーム要素内に記述しないとTokenMismatchExceptionが発生する
→ 【Laravel】TokenMismatchExceptionが発生する原因 - Qiita

index.php
{{ csrf_field() }}

 PUTメソッド

更新処理を行う場合に必要

index.php
{{ method_field('PUT') }}

以下使用例

<form method="POST" action="{{ route('users.update', ['id' => $user->id]) }}">
    {{ csrf_field() }}
    {{ method_field('PUT') }}

    // 更新対象なデータ

    <button type="submit">編集する</button>
</form>

 DELETEメソッド

削除処理を行う場合に必要

index.php
{{ method_field('DELETE') }}

以下使用例

<form method="POST" action="{{ route('users.destroy', ['id' => $user->id]) }}">
    {{ csrf_field() }}
    {{ method_field('DELETE') }}
    <button type="submit">削除する</button>
</form>

 改行して表示

※eはエスケープ処理です

index.php
{!! nl2br(e( $comment )) !!}

 共通のテンプレート内に呼び出して表示させる

例:親テンプレートの@yield('content')に子のコンテンツを表示させる場合

 親(例:views/layouts/mypage.blade.php

index.php
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>@yield('title')</title>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    </head>
    <body>
        @yield('content')
    </body>
</html>

 子(例:views/mypages/index.blade.php

index.php
<!-- 親テンプレート -->
@extends('layouts.mypage')

@section('title', 'ページタイトル')

<!-- 親テンプレートに表示させる場所 -->
@section('content')
    <div class="content">コンテンツ</div>
@endsection

 ブレードテンプレート実装例

とりあえずこんな感じに書いておけば柔軟に対応できるはず・・・という実装例

 親(共通)テンプレート

以下が親(共通)テンプレート例

layouts/app.blade.php
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- CSRF Token -->
    <meta name="csrf-token" content="{{ csrf_token() }}">

    <title>{{ config('app.name', 'Laravel') }}</title>

    <!-- Scripts -->
    <script src="{{ asset('js/app.js') }}" defer></script>
    {{-- 個別のjavaScript読み込み --}}
    @yield('javascript-head')

    <!-- Fonts -->
    <link rel="dns-prefetch" href="//fonts.gstatic.com">
    <link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet">

    <!-- Styles -->
    <link href="{{ asset('css/app.css') }}" rel="stylesheet">
    {{-- 個別のCSS読み込み --}}
    @yield('css')
</head>
<body>
    <div id="app">
        <main class="py-4">
            {{-- コンテンツ部分読み込み --}}
            @yield('content')
        </main>
    </div>

    {{-- 個別のjavaScript読み込み --}}
    @yield('javascript-footer')

</body>
</html>

 子テンプレート

以下が子テンプレート(ここではユーザー登録画面)の実装例

users/create.blade.php
@extends('layouts.app')

@section('css')
{{-- この場所に画面毎のcssを記述する --}}

@endsection

@section('javascript-head')
{{-- この場所に画面毎(ヘッダ位置)のjsを記述する --}}

@endsection

@section('content')

<form action="{{ route('users.store') }}" method="post">
{{ csrf_field() }}
    <div>
        <!-- エラーメッセージ -->
        @if(count($errors) > 0)
            <div class="error_message">
                <ul>
                    @foreach ($errors->all() as $error)
                        <li>{{ $error }}</li>
                    @endforeach
                </ul>
            </div>
        @endif
        <table>
            <tbody>
                <tr>
                    <th scope="row">名前<span>必須</span></th>
                    <td><input type="text" id="name" name="name"></td>
                </tr>
                <tr>
                    <th scope="row">メールアドレス<span>必須</span></th>
                    <td><input type="text" id="email" name="email"></td>
                </tr>
                <tr>
                    <th scope="row">パスワード<span>必須</span></th>
                    <td><input type="password" id="password" name="password"></td>
                </tr>
            </tbody>
        </table>
    </div>
    <button type="submit" id="confirm" name="confirm">確認画面へ</button>
</form>
@endsection

@section('javascript-footer')
{{-- この場所に画面毎(フッタ位置)のjsを記述する --}}

@endsection

 Sessionの表示

index.php
@if(Session::has('message'))
    <div class="error_message">
        <p>{{ session('message') }}</p>
    </div>
@endif

以下も参考になるかもしれません

 PHPのコードを記述する

index.php
@php
    echo 'hello';
@endphp

ただし公式からの注意

Tip!! Bladeはこの機能を提供していますが、数多く使用しているのであれば、それはテンプレートへ多すぎるロジックを埋め込んでいるサインです。

 コメントアウト

HTMLソースには表示されません

index.php
{{-- コメント --}}

 

PHPの特徴

PHPという名前の由来

もともとは「Personal Home Page Tools」という名前で
PHP Tools」と呼ばれていた。
現在は「PHP:Hypertext Preprocessor」という言葉を
再帰的に略したものとされる。

こんな言語

 WEBアプリケーションの開発で多く使われる言語。
C言語に似たスタイルだけでなく初心者に使われることが多い。
 データベースとの連携も用意でGUIテーブルの設定や
データの操作など可能なツールも揃っている。
HTMLファイル内にソースコードを埋め込むため
手軽に動的なWEBページを作成できる。

豊富なフレームワーク

CakePHP
Zend Framework
・Sumpony
・Laravel
・Codelgniter
など豊富なフレームワークが有り
それぞれに多くのコミュニティがある。

関連するキーワード

LAMP
LinuxApacheMySQLPHPの頭文字を取った言葉。
動的なWEBサイトを構築するときに適している
オープンソフトウェアの組み合わせとして
よく使われる。

WordPress
PHPで開発されたブログ用ソフトウェア。
多くのレンタルサーバで容易に
導入できるように設定されている。

・Hack
Facebookによって開発された
PHPと互換性のある言語。
PHPをより高速に実行することを
目標に開発されており
その処理速度の速さから
注目を集めている。


【Laravel】リクエストとレスポンス

リクエストとレスポンスとは

クライアントからサーバーへアクセスした時
クライアントから送られてきた情報は「リクエスト」
サーバーからクライアントへ返送する情報を
「レスポンス」として扱います。

このリクエストとレスポンスを扱うことが
Webサイトの構築において重要な要素となります。

Laravelでの操作

Laravelではコントローラで
RequestおよびResponseオブジェクトを利用できます。

コントローラ上部にuse文で記述します

use Illuminate\Http\Request;
use Illuminate\Http\Response;


(Requestはデフォルトで用意されてるのでResponseを追記します)
続いてアクション側で

public function アクション名(Request $request,Response $response){・・・・


と引数に追加するだけでインスタンスが用意され
使えるようになります。

Requestの主なメソッド

アクセスしたURLに関するメソッドを紹介します。

$request ->url();

アクセスしたURLを返します。
ただし、クエリー文字は省略されます。

$request ->fullUrl();

アクセスしたアドレスを完全な形で返します。
(クエリー文字も含む)

$request ->path();

ドメイン下のパス部分だけを返します。

Responseの主なメソッド

クライアントへ返送する際のステータスコード
表示コンテンツの設定などがあります。

$this ->status();

アクセスに関するステータスコードを返します。
正常にアクセスが終了してたら200になります。

$this ->content();
$this ->setContent(値);

コンテンツの取得・設定を行うものです。
contentはコンテンツを取得し
setContentは引数の値にコンテンツを変更します。