ニックネーム変更処理で唯一未実装だったサーバ側のユニークチェックですが、結局ajaxを使って実装を済ませました。
クラアント側はjQueryを、サーバ側はphpを使っています。最終的にコードは以下のような形になりました。
ajax使ったとか言いつつ async:false で同期処理にしています。なんかカッコ悪いな・・・
クライアント側:
function change_nickname() {
bExit = false;
nickname = ""
while(!bExit) {
nickname = window.prompt("新しいニックネームを入力してください", nickname);
if (null == nickname) {
// キャンセル
bExit = true;
} else {
nickname = jQuery.trim(nickname);
if (nickname.length < 3 || 30 < nickname.length) {
alert('ニックネームは3文字以上30文字以下で入力して下さい。');
} else if (nickname.indexOf(' ') != -1 || nickname.indexOf(' ') != -1) {
alert('ニックネームにスペースを含めることは出来ません。');
} else {
var exist = $.ajax({
url: "ncc/" + encodeURIComponent(nickname),
async: false
}).responseText;
if ('1' == exist) {
alert('すでに存在するニックネームです。違うニックネームを入力して下さい。');
} else if ('0' == exist) {
bExit = true;
$("#formNickName").submit();
} else {
bExit = true;
alert('予期しないエラーです。お手数ですがもう一度やり直して下さい。');
}
}
}
}
}
サーバ側:
〜 略 〜
class UserController extends Controller
{
public function ncc(Request $request, $nickname) {
try {
$nickname = rawurldecode($nickname);
〜 略:ここでDBアクセスしてニックネームの重複チェック。存在すれば return '1' 〜
return '0'; // 重複してなければ 0 を返す
} catch (Exception $e) {
〜 略:エラー処理 〜
}
}
〜 略 〜
Lumenの設定ファイル:
〜 略 〜
$router->get('ncc/{nickname}', 'UserController@ncc');
〜 略 〜