nabeo56BLOG

開発とかプログラムとか

Webアプリ養成読本の実践(3)のつづき

Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)

Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)

投稿フォームの作成

トップページ修正
$ 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を使用する場合は設定が必要でした。