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の組み合わせがクールじゃないのでここをスマートに書く方法を知りたい。