CodeIgniter4の公式チュートリアルをやってみる (2)

この記事は CodeIgniter Advent Calendar 2020 - Qiita の3日目です。まだ、空きがありますので、興味のある方は気軽に参加してください。

CodeIgniter 4 の公式ドキュメントにあるチュートリアルを続けます。

CodeIgniter4の公式チュートリアルをやってみる (1) の続きです。

データベースを使います。

MySQLでのデータベースの準備

チュートリアル用のデータベースとユーザを作成します。

$ mysql -uroot -p

データベース ci4tutorial を作成します。

CREATE DATABASE ci4tutorial DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

ユーザ dbuser を作成します。

GRANT ALL PRIVILEGES ON ci4tutorial.* TO dbuser@localhost IDENTIFIED BY 'dbpassword';

テーブルを作成します。作成したユーザで MySQL にログインします。

$ mysql -u dbuser -p ci4tutorial
Enter password: 

news テーブルを作成します。

CREATE TABLE news (
    id int(11) NOT NULL AUTO_INCREMENT,
    title varchar(128) NOT NULL,
    slug varchar(128) NOT NULL,
    body text NOT NULL,
    PRIMARY KEY (id),
    KEY slug (slug)
);

初期データを挿入します。

INSERT INTO news VALUES
(1,'Elvis sighted','elvis-sighted','Elvis was sighted at the Podunk internet cafe. It looked like he was writing a CodeIgniter app.'),
(2,'Say it isn\'t so!','say-it-isnt-so','Scientists conclude that some programmers have a sense of humor.'),
(3,'Caffeination, Yes!','caffeination-yes','World\'s largest coffee shop open onsite nested coffee shop for staff only.');

確認します。

mysql> select * from news \G
*************************** 1. row ***************************
   id: 1
title: Elvis sighted
 slug: elvis-sighted
 body: Elvis was sighted at the Podunk internet cafe. It looked like he was writing a CodeIgniter app.
*************************** 2. row ***************************
   id: 2
title: Say it isn't so!
 slug: say-it-isnt-so
 body: Scientists conclude that some programmers have a sense of humor.
*************************** 3. row ***************************
   id: 3
title: Caffeination, Yes!
 slug: caffeination-yes
 body: World's largest coffee shop open onsite nested coffee shop for staff only.
3 rows in set (0.00 sec)

CodeIgniter4 のデータベース設定

.env ファイルにデータベース接続情報を設定します。

--- env 2020-07-16 12:44:28.000000000 +0900
+++ .env    2020-12-02 10:08:24.000000000 +0900
@@ -49,11 +49,11 @@
 # DATABASE
 #--------------------------------------------------------------------

-# database.default.hostname = localhost
-# database.default.database = ci4
-# database.default.username = root
-# database.default.password = root
-# database.default.DBDriver = MySQLi
+database.default.hostname = localhost
+database.default.database = ci4tutorial
+database.default.username = dbuser
+database.default.password = dbpassword
+database.default.DBDriver = MySQLi

 # database.tests.hostname = localhost
 # database.tests.database = ci4

NewsModel の作成

news テーブルにアクセスする NewsModel を作成します。

app/Models/NewsModel.php

<?php
namespace App\Models;

use CodeIgniter\Model;

class NewsModel extends Model
{
    protected $table = 'news';

    public function getNews($slug = false)
    {
        if ($slug === false)
        {
            return $this->findAll();
        }

        return $this->asArray()
            ->where(['slug' => $slug])
            ->first();
    }
}

CodeIgniter\ModelfindAll() メソッドと first() メソッドを使い、news テーブルを検索します。

News コントローラの作成

News コントローラを作成します。

app/Controllers/News.php

<?php
namespace App\Controllers;

use App\Models\NewsModel;
use CodeIgniter\Controller;
use CodeIgniter\Exceptions\PageNotFoundException;

class News extends Controller
{
    public function index()
    {
        $model = new NewsModel();

        $data = [
            'news'  => $model->getNews(),
            'title' => 'News archive',
        ];
        dd($data);

        echo view('templates/header', $data);
        echo view('news/overview', $data);
        echo view('templates/footer', $data);
    }

    public function view($slug = null)
    {
        $model = new NewsModel();

        $data['news'] = $model->getNews($slug);

        if (empty($data['news']))
        {
            throw new PageNotFoundException('Cannot find the news item: '. $slug);
        }

        $data['title'] = $data['news']['title'];
        dd($data);

        echo view('templates/header', $data);
        echo view('news/view', $data);
        echo view('templates/footer', $data);
    }
}

CodeIgniter4 の dd() 関数で $data の値を表示して確認できるようにしました。

ルーティング設定

前回、全てのルートを Pages コントローラで処理するように、ルーティング設定をしたため、現状だと News コントローラにアクセスできません。

そこで、News コントローラにアクセスするためのルーティングを追加します。

app/Config/Routes.php

--- a/app/Config/Routes.php
+++ b/app/Config/Routes.php
@@ -32,6 +32,8 @@ $routes->setAutoRoute(true);
 // route since we don't have to scan directories.
 $routes->get('/', 'Home::index');

+$routes->get('news/(:segment)', 'News::view/$1');
+$routes->get('news', 'News::index');
 $routes->get('(:any)', 'Pages::view/$1');

 /**

http://localhost:8080/news にアクセスすると、CodeIgniter4 の dd() メソッドで $data の値が表示されます。

データベースに登録したレコードの値が取得できていることがわかります。

データベースとのやりとりを確認できたら、デバッグ用の dd() 関数を無効にしておきます。

--- a/app/Controllers/News.php
+++ b/app/Controllers/News.php
@@ -15,7 +15,7 @@ class News extends Controller
             'news'  => $model->getNews(),
             'title' => 'News archive',
         ];
-        dd($data);
+//        dd($data);

         echo view('templates/header', $data);
         echo view('news/overview', $data);
@@ -34,7 +34,7 @@ class News extends Controller
         }

         $data['title'] = $data['news']['title'];
-        dd($data);
+//        dd($data);

         echo view('templates/header', $data);
         echo view('news/view', $data);

View ファイルの作成

一覧ページ用の app/Views/news/overview.php を追加します。

<h2><?= esc($title); ?></h2>

<?php if (! empty($news) && is_array($news)) : ?>

    <?php foreach ($news as $news_item): ?>

        <h3><?= esc($news_item['title']); ?></h3>

        <div class="main">
            <?= esc($news_item['body']); ?>
        </div>
        <p><a href="/news/<?= esc($news_item['slug'], 'url'); ?>">View article</a></p>

    <?php endforeach; ?>

<?php else : ?>

    <h3>No News</h3>

    <p>Unable to find any news for you.</p>

<?php endif ?>

個別記事ページ用の app/Views/news/view.php を追加します。

<h2><?= esc($news['title']); ?></h2>
<p><?= esc($news['body']); ?></p>

これで、ビューファイルが全て用意できました。

http://localhost:8080/news にアクセスしてみます。

記事の一覧が表示されました。

「View article」をクリックして、http://localhost:8080/news/elvis-sighted にアクセスします。

個別の記事も表示されています。

この記事は CodeIgniter Advent Calendar 2020 - Qiita の3日目です。まだ、空きがありますので、興味のある方は気軽に参加してください。

参考

Tags: codeigniter, codeigniter4

CodeIgniter4の公式チュートリアルをやってみる (1)

この記事は CodeIgniter Advent Calendar 2020 - Qiita の1日目です。まだ、空きがありますので、興味のある方は気軽に参加してください。

CodeIgniter 4 の公式ドキュメントにあるチュートリアルをやってみます。

CodeIgniter 4 の概要を把握しましょう。

インストール

CodeIgniter 4 を composer からインストールします。

$ composer create-project codeigniter4/appstarter ci4-news

ci4-news フォルダに CodeIgniter 4.0.4 がインストールされました。

フォルダ構成

CodeIgniter 4 のフォルダ構成は以下のようになっています。

ci4-news/
├── app/ ... アプリケーション
│   ├── Common.php
│   ├── Config/      ... 設定
│   ├── Controllers/ ... コントローラ
│   ├── Database/    ... データベース
│   ├── Filters/
│   ├── Helpers/
│   ├── Language/
│   ├── Libraries/
│   ├── Models/      ... モデル
│   ├── ThirdParty/
│   └── Views/       ... ビュー
├── builds*
├── composer.json
├── composer.lock
├── env
├── phpunit.xml.dist
├── public/ ... Web公開領域(ドキュメントルート)
│   ├── favicon.ico
│   ├── index.php
│   └── robots.txt
├── spark*
├── tests/ ... テストファイル
│   ├── _support/
│   ├── database/
│   ├── session/
│   └── unit/
├── vendor/   ... Composer管理
└── writable/ ... 書き込み用フォルダ
    ├── cache/
    ├── debugbar/
    ├── logs/
    ├── session/
    └── uploads/

開発環境に設定

デフォルトでは CodeIgniter 4 は本番環境に設定されています。

開発中は便利な機能を使うために開発環境に変更します。

プロジェクトのルートにある env.env にコピーし、CI_ENVIRONMENTproduction から development に変更します。

--- env 2020-07-16 12:44:28.000000000 +0900
+++ .env    2020-12-01 16:40:17.000000000 +0900
@@ -14,7 +14,7 @@
 # ENVIRONMENT
 #--------------------------------------------------------------------

-# CI_ENVIRONMENT = production
+CI_ENVIRONMENT = development

 #--------------------------------------------------------------------
 # APP

開発用Webサーバの起動

ターミナルから、以下のコマンドを実行します。

$ php spark serve

http://localhost:8080/ でサーバが起動しました。ブラウザからアクセスすると、Welcome ページが表示されます。

Welcome ページ その1

Welcome ページ その2

Home コントローラ

Welcome ページを処理するデフォルトコントローラは、app/Controllers/Home.php にあります。

Home コントローラは以下のようになっています。

<?php namespace App\Controllers;

class Home extends BaseController
{
    public function index()
    {
        return view('welcome_message');
    }

    //--------------------------------------------------------------------

}

CodeIgniter 4 の view() メソッドでビューファイルを表示できます。

View ファイルの作成

静的ページファイル

以下の静的ページを作成します。

Views/pages/home.php

<p>Views/pages/home.php</p>

Views/pages/about.php

<p>Views/pages/about.php</p>

テンプレートファイル

ヘッダとフッタ用のテンプレートファイルを作成します。

Views/templates/header.php

<!doctype html>
<html>
<head>
    <title>CodeIgniter Tutorial</title>
</head>
<body>

    <h1><?= esc($title); ?></h1>

Views/templates/footer.php

    <em>&copy; 2019</em>
</body>
</html>

Pages コントローラ

app/Controllers/Pages.php を作成します。

<?php
namespace App\Controllers;

use CodeIgniter\Controller;
use CodeIgniter\Exceptions\PageNotFoundException;

class Pages extends Controller
{
    public function index()
    {
        return view('welcome_message');
    }

    public function view($page = 'home')
    {
        if ( ! is_file(APPPATH.'/Views/pages/'.$page.'.php'))
        {
            // Whoops, we don't have a page for that!
            throw new PageNotFoundException($page);
        }

        $data['title'] = ucfirst($page); // Capitalize the first letter

        echo view('templates/header', $data);
        echo view('pages/'.$page, $data);
        echo view('templates/footer', $data);
    }
}

これで、ビューとコントローラが作成できました。

http://localhost:8080/pages/view 以下にアクセスすると、Views/pages/*.php が存在する場合は、そのページがヘッダとフッタ付きで表示されます。

以下のようになります。

ルーティング設定の追加

app/Config/Routes.php を開き、以下の 1行を追加します。

--- a/app/Config/Routes.php
+++ b/app/Config/Routes.php
@@ -32,6 +32,8 @@ $routes->setAutoRoute(true);
 // route since we don't have to scan directories.
 $routes->get('/', 'Home::index');

+$routes->get('(:any)', 'Pages::view/$1');
+
 /**
  * --------------------------------------------------------------------
  * Additional Routing

これで、例えば、http://localhost:8080/about にアクセスすると、Pages コントローラの view() メソッドに about が渡されるようにルーティングされます。

http://localhost:8080/about でアクセスできるようになりました。

CodeIgniter4の公式チュートリアルをやってみる (2) へ続きます。

この記事は CodeIgniter Advent Calendar 2020 - Qiita の1日目です。まだ、空きがありますので、興味のある方は気軽に参加してください。

参考

Tags: codeigniter, codeigniter4

ふりかえり実践会「スクラムガイドを読み解いてみよう」第7回

「スクラムガイドを読み解いてみよう」第7回 に参加しました。

今回の範囲は、スクラムガイド 2017年11月の P.9(スプリントプランニング)からP.10(スプリントゴールの手前)でした。1時間で1ページのペースでした。

発言・コメントなど

網羅的ではありません。

スプリントプランニング

  • 何時間くらい?

    • 1週間で4時間使ったことあります
    • 分業されてると時間がかかる
  • スプリントプランニングでは、以下の質問に答える。

    • 誰が答えるのか?
    • > Sprint Planning answers the following:
    • 原文は上記なので、スプリングプランニングの結果決まるという感じなので、誰がというのはない

トピック 1:スプリントで何ができるか?

  • 横文字が多くて、頭に入ってこない
  • スプリントゴール大事だけと、依然としてはっきりしない

トピック 2:選択した作業をどのように成し遂げるか?

  • 作業に分解は全部やるのか?
    • スクラムガイド的には不要(「開発チームがスプリントの最初の数日間で行う作業については、スプリントプランニングで作業に分解する」)
    • https://www.ryuzee.com/contents/blog/7101 不要
    • 全部分解したい
    • プランニングの時間内で作業分解できない場合は、そのチームのスキルでは、どうせスプリント中に完了できないので全部はやらない

疑問

スプリントプランニングのトピック2での「作業に分解」は、スクラムガイド的には明らかに、スプリント中のすべての作業を分解する必要はないです。

開発チームがスプリントの最初の数日間で行う作業については、スプリントプランニングで作業に分解する

と明記されてますから。

しかし、作業に分解して作業時間を見積もらないと、スプリント中に本当に終わるかわからないというか、見積もりの確度が下がってしまうように思います。

全作業項目を見積もらずに、スプリント中にほんとうにできるかどうかをどのように判断しているのか?という疑問が生じました。

とはいえ、スプリントプランニングですべての作業を分解しておくというのは、ウォーターフォール脳な気もしました。

参考

Tags: scrum