【php】Web API関連メモ

#【php】Web API関連メモ

自分用のメモです。

##namespace
namespace 名前空間名;

- 名前空間を定義する。
- 同一名のクラスや関数などが定義できるようになる。（衝突によるエラーや上書きを防ぐ）
- 一番上に書く。(HTMLやファイル読み込みよりも上)

▼使い方
名前空間\呼び出したいもの

- 名前空間\関数名()
- 名前空間\変数

```php:(method.php)同一ファイルに同じ関数を書
<?php
namespace name1;
 
function hello(){
  return 'こんにちは';
}
 
namespace name2;

function hello(){
  return 'Hello';
} 
?>
```

```php:(exec.php)関数の呼び出し
<?php
 
//ファイル読み込み
require_once 'method.py';
 
//関数の呼出し
echo name1\hello();
echo name2\hello();
 
?>

//出力
こんにちはHello
```


##use as
`use 名前空間名 as エイリアス名;` 
名前空間を作成し、エイリアス化する
名前空間が長い場合に使う。

use AAA\BBB\CCC\DDD as name3;
　└ 名前空間「AAA\BBB\CCC\DDD」を「name3」と定義。

**▼asがない場合**
use AAA\BBB\CCC\DDD
　└ 名前空間は「DDD」になる



##function　関数名(array 引数)
`(型 引数,　型 引数,,,)`は型宣言。配列を指定。
渡された引数の方が指定と違う場合にエラーを返す。
間違いの早期発見用。

```php:
function test(array $list, int $val)

//$list：配列
//$val：整数
```


##アロー演算子(->)
##クラス名->$プロパティ名
`クラス名->$プロパティ名`
指定したクラスのプロパティを取得。

クラス内で呼び出す場合は、$this->$プロパティ名

※アロー関数はJS


##インスタンス名->関数名()
`インスタンス名->関数名()`
インスタンスの中で関数を呼び出す。
　└ インスタンスの入った変数。



##require dirname(__DIR__). '絶対パス';

ファイルを読み込む。

```php:
//以下は同じ
require dirname(__DIR__) . '/path/ファイル名.php';
require dirname(__FILE__) . '/path/ファイル名.php';
require ( __DIR__ . '/path/ファイル名.php');
```


```php:
require dirname(__DIR__) . '/vendor/test.php';
```
この場合、後から追加したライブラリ(vendorが保存場所)のtest.phpというファイルを読み込んでいる。



https://book.cakephp.org/2/ja/controllers/request-response.html

```
$this->request->controller;
$this->request['controller'];
$this->request->params['controller'];
```

##コメントアウト + @（アットマーク）

パラメータや変数の説明。

//@param [型] 変数名 説明
//@var [型] 説明
//@return [型] 説明


▼使用例

```php
class Userdb
{
    private $name;
    private $db;

    /**
     * コンストラクタ
     *
     * @param Users $name
     * @param Database $db
     */
    public function __construct(Users $name, Database $db)
    {
        $this->name = $name;
        $this->db = $db;
    }
```




## キー=>値
連想配列のキーと値の指定は「=>」

array (key1=>値1, key2=>値2, key3=>値3,,,)
キーの名前で値を呼び出す




##array_shift
`array_shift(配列名)`
配列の一番最初の要素を抜き出す。
破壊的。実行後、元の配列からその要素が抜ける。

```php:
$lists=array("aaa","bbb","ccc");
$data1=array_shift($lists);

echo "0番目の要素：".$data1."。<br>";
print_r($lists);


////出力
//0番目の要素：aaa
//("bbb","ccc");
```



##argc, argv
`$argc`: 引数の個数（Argument Count）

▼ファイル実行時に、引数を渡し、その引数の値をつかう

```php:
if ($argc === 1) {
    echo '引数は1つです', PHP_EOL;
    exit(1);
}
```


`$argv`: 引数の値 (Argument Value)

```php
//入力値 aaa bbb ccc
$argv[0] //aaa
$argv[1] //bbb
$argv[2] //ccc

//変数に格納
$answers = $argv
```





##PHP_EOL
実行環境のOSで改行を行う。

実行環境に合わせ、下記に変換される。
・windows:「\r\n(CRLF)」
・Linux系: 「\n(LF)」

```php:
echo "aaa".PHP_EOL."bbb".PHP_EOL."ccc";

////出力
//aaa
//bbb
//ccc
```


##eixt()
処理の終了

`exit(整数)`
エラーのステータスコードを整数にする。
画面表示はされない。


##json_decode関数
JSON形式のデータを変換する。

$a = `json_decode(JSON形式のデータ)`
　└ オブジェクトを返す
　└ {"obj1":値1,"obj2":値2}
　└ $a{obj1} →　値1

$a = `json_decode(JSON形式のデータ, true)`
　└ 連想配列に変換
　└ array(obj1=>値1, obj2=>値2)
　└ $a[obj1] → 値1



##Pimple

- DIコンテナの一つ
- インスタンスの生成を一括実行するファイル。
- DI用の設定データを保存している`container.php`
- 「$変数名= インスタンス生成処理」が省略できる
- 引数の数が大幅に減る

```php:
use Pimple\Container;
$container = new Container();

//または
$container = new Pimple\Container();
```



##DI
DI：Dependency Injection

依存性のあるデータ（インスタンスの生成）などを変数で与える。

- クラスとの依存性が低くなるため、動的に変更可能になる。
- クラスをいじらず、注入しているデータ元をいじれる（メンテ簡略化）



##guzzle http
外部APIの実行。


```php:
//guzzleのりーソスを生成し、requestメソッドで送信
new GuzzleHttp\Client([
        'handler' => $handler,
        'base_uri' => 'http://www.example.com',
    ]);
```

- base_uri: アクセスするURLのベースとなるもの。（必須）
- handler: リクエストヘッダーにつけるパラメータを指定。配列形式で複数指定可能。（オプション）


▼応答データの取得（文字列）

```php:
$response->getBody()
```


###request

`Client->request('メソッド', 'URL');`
　└ メソッド：GET or POST

指定したURL（またはパス）からデータを取得する。

```php:
$response = Client->request('POST','/test', ['json' => データ]);
```
・Client= GuzzleHttp\Client
・/testファイルにjson形式でデータを渡し、その結果をPOSTで受け取り、$responseに格納.





##Cake PHP
ruby on railsの思想をベースに作成したPHP用のフレームワーク。

▼Cake PHP

- コマンドや規則が充実。
- スピード感重視で作成できる。
- 自由度が低い。


▼Lravel

- 自由度が高い
- 最新技術も導入しやすい

簡単なサイト作成ならCake PHP, がっつり組みたいならLaravel。



###インストール
`composer`で行う
　└ 作業ディレクトリ毎にインストール

```
composer install
```

###MVCモデル
Model（Routing）
View
Controller

Controller(処理の割り振り) -> Model（データ処理）-> View(表示)


###ディレクトリ構成

####PJディレクトリ

| ディレクトリ       |       内容 |    
|:----------------|:----------------|
| cake             |              CakePHPの中心部分となるライブラリファイル類がまとめられている |    
| plugins           |            プラグインのプログラムを組み込むためのもの |       
| app             |              Webアプリケーションを配置していくディレクトリ　あらかじめ定められたルールでファイルを配置し開発していく |      
| venders               |          ライブラリ類を後から追加するときに利用されるところ       |     
| gitignore             |             git用のファイル |    
| htaccess         |           Webサーバの動作に関する設定ファイル |  
| index.php         |           CakePHPのディレクトリのインデックスファイル　このディレクトリにアクセスしたときにこのページが表示される |
| README         |           最初に読むドキュメント |    
 

#####appディレクトリの中身

| ディレクトリ       |       内容 |    
|:----------------|:----------------|
| config             |              CakePHPで利用される各種の設定情報を保管。Routingファイルもこの中。 |    
| libs           |            ライブラリファイルを追加する場所 |       
| controllers             |     プログラムの制御に関するソースコードを追加していく |      
| locale           |          言語・地域情報に関するファイルを保管する       |     
| models             |             データベースアクセス関係のソースコードを追加していく |    
| plugins         |           機能追加のためのプラグインファイルを追加する |  
| tests         |           テストに関するフレームワークを追加する |
| tmp         |           プログラム実行中に作成される一時ファイルの保管場所 | 
|vendors| ライブラリ類を後から追加するときに利用されるところ|
|views| ページレイアウトのためのファイルを追加していく| 
|webroot|CakePHPによるWebアプリケーションのルートになる　ここにファイルを入れるとルートに配置された状態で呼び出される|  
|.htaccess,index.php|このディレクトリのWebサーバの設定情報とデフォルトページ|

* cakeフォルダは基本触らない
* 編集や追加をするのは基本appフォルダ


###Configuration
環境設定：`config/bootstrap.php`から読み込まれる。

初期状態は「config/app.php」のみ存在。
自分で、「config/bootstrap.php」を追加し設定を書き込むと、 bootstrap.php側の設定が読み込まれるようになる。

インスタンスの生成や、関数の作成を行う

```php:

$product = new 名前空間\クラス名();

$product['server_db'] = function ($c) {
    return new 名前空間2\クラス名(dirname(__DIR__) . '/var/server_db.txt');
};
```


###Routing
「config/routes.php」で設定する。


Router::connect('入力URL', ['controller' => 'コントローラー名', 'action' => 'アクション名(開くページ)']);

```php:config/routes.php
Router::connect('/top', ['controller' => 'Home', 'action' => 'index']);
```

(ドメイン)/topが入力されたら、HomeContorllerのindexというアクションを実行する。


####パラメータの取得と呼び出し

▼格納
:プレースホルダ名

▼呼び出し
['プレースホルダ名' => '\d+']


```php:config/routes.php
Router::connect('/top/:top_id', ['controller' => 'Home', 'action' => 'index'], ['top_id' => '\d+']);
```



###Request

- デフォルトのリクエストを扱うクラス。
- リクエストのデータの管理・操作を行うときに使用
- 大本のデータはCake\Network\Request
- 呼び出し：`$this->request`
- requestの中にパラメータが入っている。
- Controller、View、Cell、Helperからアクセス可能。

▼パラメータへのアクセス方法

```php:
//param or params
$this->request->params['controller']; // 複数形(params)
$this->request->param('controller'); // 単数形(param)
```


▼GETのパラメータ
`$this->request->query`
取得データは連想配列になっている。

/home?name=aaa&age=25

```php:
$this->request->query; # array('name' => 'aaa','age' => '25')
```

▼POSTの場合

```php:
$this->request->data('name.aaa');
$this->request->data['name'];
```


###Controller

▼ファイルの場所
`src/Controllers/コントローラー名Contoller.php`


- 各Controllerは`AppController(src/Controllers/AppController.php)`を継承

→冒頭に「namespace App\Controller;」がある。




###saveメソッド
$this->Model->save("キー名", 値)

```php:
$this->db->save('name', 'tanaka');
```

▼保存したデータの取得
fetchを使う

```php:
$this->db->fetch('name');
```