つぶやきとプログラミング

アメトーーク好きなWebエンジニア芸人

Swift 4+CakePhpでのログインを自分なりに実装してみた。

通信にAlamofireを使用する。

Swift側処理

// CakePhpの$users = $this->User->findメソッドの返り値が$users['User']['title']になり、
// 中間の['User']をCodableに対応させるためにこのような実装にした
struct Users : Codable {
 let user:  UserBox
}

struct UserBox : Codable {
    let User: UserContent
}

struct UserContent : Codable {
    let name: String
    let age: Int
}

class ViewController: UIViewController {
    @IBOutlet weak var emailAddressField: UITextField!
    @IBOutlet weak var passwdField: UITextField!
    
    // ボタンが押された時にユーザー情報をAlamofireによって送信する。
    @IBAction func onButtonTap(_ sender: UIButton){
        if emailAddressField.text != "" && passwdField != "" {
            let params: Parameters = [
                "User": [
                    "emailAddress": emailAddressField.text!,
                    "password": passwdField.text!
                ]
            ]
            
            // Alamofire(リクエスト用ライブラリ) [https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md]
            Alamofire.request("http://hoge.com/Users/login.json", method: .post, parameters: params, encoding: JSONEncoding.default).responseJSON{ response in
                if let data = response.data {
                    // レスポンスデータをJSON形式で受け取り、Codableを利用して構造体に入れる。
                    // Codable [https://dev.classmethod.jp/smartphone/json-decoding-without-swiftyjson/]

                   let feed = try? JSONDecoder().decode(JSONFeed.self, from: data)
                    
                    // 取得情報処理...
                }
            }
        }
    }
}

CakePhp側処理

<?php
class UsersController extends AppController{
     public $uses = array('User');
     public $components = array(
        'RequestHandler',
        'Auth' => array(
            'allowedActions' => array('login'),
            'loginAction' => array('controller' => 'Users', 'action' => 'login'),
            'authenticate' => array('Form' => array('fields' => array('username' => 'emailAddress'))),
        ),
    );

    public function login(){
        if ($this->Auth->login()){
            $user = [
                "emailAddress" => $this->request->data["User"]["emailAddress"],
                "login" => true
            ];
            // JSONで返す
            // {"user" : {"User" : {"name" : "hoppy", "age" : 21}}}
            $this->set([
                'user' => $user,
                '_serialize' => ['user']
            ]);
  } else {...}
}

まとめ

ログインするためにログイン用のviewControllerを適当に作成する。
textFieldを二つおいて、それぞれをemailAddressField, passwdFieldとし、ボタンを一つ置いて、セグエで繋げる。
レスポンスデータをJSON形式で受け取り、Codableを利用して構造体に入れる。

感想

CakePhpとCodableの組み合わせがクールじゃないのでここをスマートに書く方法を知りたい。