Help us understand the problem. What is going on with this article?

Slim 3 Framework でMySQLとテンプレつかってみる。その2

More than 3 years have passed since last update.

Slim-Skeleton の導入

slim セットアップは簡単ですぐに使えるいい感じだけど、はじめは素直に Slim-Skeleton を導入し肉付けを行っていった方が学習効果は高いと思います。がインスコする際にphpunitなどインスコしていないと怒られるのでまず先に 「CentOS7+PHP7+Nginx+MariaDB+Redisの環境を作る方法」をみつつ、必要そうなアプリを先にインスコする。

sudo yum --enablerepo=epel,remi,remi-php70 install php70 php70-php-mcrypt php70-php-mbstring php70-php-fpm php70-php-gd php70-php-pecl-xdebug php70-php-pecl-redis php70-php-pecl-imagick-devel php70-php-pecl-imagick php70-php-mysqlnd php70-php-intl php70-php-bcmath php70-php-pecl-zip php70-php-xmlrpc php70-php-xml  php70-php-pecl-http php70-php-pecl-http-devel php70-php-opcache phpunit

手順は Slim-Skeleton にも書いてあるけど。slim3 は、インストールするアプリ名ね。

$ composer create-project slim/slim-skeleton slim3

WebService化は、User Guide Web Service 手順に従って行えばよし。ルートにアクセスすると下記のようにでるとこまで進めておきます。

image

ディレクトリの確認

いい感じにディレクトが作成される。追加したのは、classesを読み込むディレクトリを追加で作成したぐらい。

slim3
├── composer.json
├── composer.lock
├── classes     ← こいつだけ作成した
├── logs
├── public
│   └── index.php
├── src
│   ├── dependencies.php
│   ├── middleware.php
│   ├── routes.php
│   └── settings.php
├── templates
│   └── index.phtml
└── vendor

サンプルDBの作成

とりあえず MySQL に接続して色々やってみるためにテーブルとデータをさくっと作っておく。

CREATE TABLE `book` (
  `id` int(11) NOT NULL,
  `title` varchar(64) DEFAULT NULL,
  `name` varchar(32) DEFAULT NULL,
  `price` int(5) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8   

データも適当にいれます

INSERT INTO `book` VALUES (1,'双子の帝國','ふたごのていこく',300),(2,'進撃の巨人','singeki',500),(3,'となりの関くん','となりのせきくん',50000);

MySQLにアクセスしてみる、接続先の設定~アクセスクラス作成~アクセスまで

とりあえずテンプレみたいな形で進めていきます。サンプルとおりですけどねw

接続先の設定

src/settings.php データベース接続先情報を追加します。

src/settings.php
  // DataBase(MySQL) settings
  'db' => [
      'host' => 'hostname',
      'port' => '3306',
      'user' => 'user',
      'pass' => 'passwd',
      'dbname' => 'test',
  ],

src/dependencies.php データベースコンテナの定義

src/dependencies.php
// MySQL
$container['db'] = function ($c) {
    $settings = $c->get('settings')['db'];
    $pdo = new PDO("mysql:host=" . $settings['host'] . ";dbname=" . $settings['dbname'] . ";port=" . $settings['port'],
        $settings['user'], $settings['pass']);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    return $pdo;
};

アクセスクラス作成

slimはどこでも自由奔放に記述できますが、ある程度お作法は決めておいた方がいいかな?と思うのでアクセスクラスとか作ってみます。

class/Mapper.php

class/Mapper.php
abstract class Mapper {
  protected $db;
  public function __construct($db) {
    $this->db = $db;
  }
}

class/TestMapper.php

TestMapper.php
class TestMapper extends Mapper
{
  public function getTests() {
    $sql = "select * from book";
    $stmt = $this->db->query($sql);
    $results = [];
    while($row = $stmt->fetch()) {
      $results[] = $row;
    }
    return $results;
  }
}

作成したクラスを読み込む

public/index.php

require vendor している次の行あたりに追加する。

public/index.php
// class load
spl_autoload_register(function ($classname) {
  require (__DIR__ . "/../classes/" . $classname . ".php");
});

uriの作成

src/routes.php に アクセスuriを追加する。
$app->get('/[{name}]',の関数はコメントしておく。

src/routes.php
$app->get('/book_api', function ($request, $response, $args) {
  error_reporting(0);

  $mapper = new TestMapper($this->db);
  $test = $mapper->getTests();

  ob_start();
  var_dump($test);
  $t = ob_get_contents();
  ob_end_clean();
  var_dump($test);

  return $response;
});

book_api にアクセスしてみる。

結果、下記のようになればとりあえず MySQL にアクセスできて結果も取得していることも確認できる。

array(3) { [0]=> array(4) { ["id"]=> string(1) "1" ["title"]=> string(15) "双子の帝國" ["name"]=> string(24) "ふたごのていこく" ["price"]=> string(3) "300" } [1]=> array(4) { ["id"]=> string(1) "2" ["title"]=> string(15) "進撃の巨人" ["name"]=> string(7) "singeki" ["price"]=> string(3) "500" } [2]=> array(4) { ["id"]=> string(1) "3" ["title"]=> string(21) "となりの関くん" ["name"]=> string(24) "となりのせきくん" ["price"]=> string(5) "50000" } }

PHP-View 使ってみる

PHP-View が使えるのでテンプレートを使って出力してみる。

src/routes.php に追加

renderer に渡すためのテンプレートと変数を渡す。

src/routes.php
$app->get('/book_api2', function ($request, $response, $args) {
  $mapper = new TestMapper($this->db);
  $test = $mapper->getTests();
  $response = $this->renderer->render($response, "book_api.phtml", ["books" => $test]);
});

templates にテンプレートファイルを作成

templates/book_api.phtml を作成する。読み込んだデータを全て出力するサンプル。

templates/book_api.phtml
<table class="pure-table">
  <tr>
    <th>id</th>
    <th>title</th>
    <th>name</th>
  </tr>
<?php foreach($data['books'] as $test): ?>
  <tr>
    <td><?=$test['id'] ?></td>
    <td><?=$test['title'] ?></td>
    <td><?=$test['name'] ?></td>
  </tr>
<?php endforeach; ?>
</table>

book_api2 にアクセスしてみる。

結果、下記のようになればとりあえず MySQL にアクセスできてテンプレートで出力いることを確認できる。

id  title   name
1   双子の帝國 ふたごのていこく
2   進撃の巨人 singeki
3   となりの関くん   となりのせきくん

ここまでできれば色々と簡単そうにできそうだ。次回は、ログ出力とかとかやってみる。
と、これまでに参考にさせて頂いたサイト。

こんにちは Slim PHP framework
Slim(PHP)を使う時に參考にしたページ

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away