Webアプリ養成読本の実践(3)のつづき
Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)
- 作者: 和田裕介,石田絢一(uzulla),すがわらまさのり,斎藤祐一郎
- 出版社/メーカー: 技術評論社
- 発売日: 2014/03/11
- メディア: 大型本
- この商品を含むブログ (5件) を見る
投稿フォームの作成
トップページ修正
$ pwd /vagrant/work/app $ vim lib/Tinitter/Controller/TimeLine.php
<?php namespace Tinitter\Controller; class TimeLine { public function show() { $app = \Slim\Slim::getInstance(); $app->render('TimeLine/show.twig'); } }
トップページテンプレート修正
$ mkdir templates/TimeLine $ vim templates/TimeLine/show.twig
{% extends "frame.twig" %} {% block content %} {% autoescape true %} {% include "_Parts/Form.twig" %} {% endautoescape %} {% endblock %}
$ mkdir templates/_Parts $ vim templates/_Parts/Form.twig
{% autoescape true %} <div class="postform"> <h3>投稿フォーム</h3> <form method="post" action="/post/commit"> <div class="form-group {% if error_list.nickname %}has-error{% endif %}"> <label>ニックネーム<em>(半角英数16文字まで)</em></label><br> <input type ="text" name="nickname" value="{{ parms.nickname }}" placeholder="ニックネー>ムを入力してください" class="form-control"> <p class="text-warning">{{error_list.nickname}}</p> </div> <div class="form-group {% if error_list.body %}has-error{% endif %}"> <label>テキスト<em>(1000文字まで)</em></label> <textarea name="body" placeholder="本文を入力してください" class="form-control">{{params.body}}</textarea> <p class="text-warning">{{error_list.body}}</p> </div> <input type="submit" class="btn btn-primary btn-block" value="投稿する"> </form> </div> {% endautoescape %}
投稿の保存
$ pwd /vagrant/work/app $ vim htdocs/index.php
以下を追記
$app->post('/post/commit', '\Tinitter\Controller\Post:commit');
##### Postクラス、commitアクション作成
$ vim lib/Tinitter/Controller/Post.php
<?php namespace Tinitter\Controller; use \Tinitter\Model\Post as M_Post; use \Tinitter\Validator\Post as V_Post; class Post { public function commit() { $app = \Slim\Slim::getInstance(); $params = $app->request->params(); $error_list = V_Post::byArray($params); if (empty($error_list)) { $post = new M_Post; $post->nickname = $params['nickname']; $post->body = $params['body']; $post->save(); $app->redirect('/'); } else { $app->render('Post/form.twig', [ 'params' => $params, 'error_list' => $error_list ] ); } } }
エラー時再編集用テンプレート作成
$ mkdir templates/Post $ vim templates/Post/form.twig
{% extends "frame.twig" %} {% block content %} {% autoescape true %} {% include "_Parts/Form.twig" %} {% endautoescape %} {% endblock %}
バリデーションの作成
$ mkdir lib/Tinitter/Validator $ vim lib/Tinitter/Validator/Post.php
<?php namespace Tinitter\Validator; class Post extends \Respect\Validation\Validator { static function byArray(array $params) { $error_list = []; // nicknameをテスト if (!static::alnum()->validate($params['nickname'])) { $error_list['nickname'] = '半角の英数文字と空白だけにしてください'; } if (!static::length(1, 16)->validate($params['nickname'])) { $error_list['nickname'] = '1~16文字以内にしてください'; } // bodyをテスト if (!static::length(1, 1000)->validate($params['body'])) { $error_list['body'] = '1~1000文字以内にしてください'; } return $error_list; } }
ブラウザで表示、投稿する
http://localhostにアクセス
ニックネームと本文入力して投稿!!
/post/commitがないといわれる。
/post/commitでアクセスできない理由
ログを確認
$ sudo less /var/log/httpd/error_log [Fri Dec 19 16:59:18 2014] [error] [client] File does not exist: /var/www/html/post
postファイルが存在しないというエラー。 htdocs/index.phpでRoute.php中でルーティングするはずだから、 index.phpにアクセスしていないとおかしい。。。
Slim Framework DocumentationのRoute URL Rewritingの項目に記載がありました。 Apacheの場合、 htdocs/.htaccessを用意する必要があります。
$ vim htdocs/.htaccess RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ index.php [QSA,L]
また.htaccessを有効にするためにapacheの設定ファイルを修正し、再起動
$ sudo vim /etc/httpd/conf/httpd.conf 修正前)AllowOverride None 修正後)AllowOverride All $ sudo service httpd restart
ニックネームと本文入力して投稿!! 動作しました。テーブルの内容も確認して登録できていることも確認できました。
Webアプリエンジニア養成読本はビルトインサーバで実行することを前提に書かれているので、 Apacheを使用する場合は設定が必要でした。