😎

【過去Blogからの移行記事】ZF3で空のプロジェクトを作成する自分なりの手順

2022/09/18に公開

ZF3で空のプロジェクトを作成する

※本稿では、Zendframework 3 のことを ZF3 とか zf3 と呼んでいます。

本稿タイトルについて、正規のやり方は知らないし、そもそも正規のやり方というのがあるかどうかも不明です。

極力最小限のコンポーネントを composer で持ってきて、
zf3標準のスケルトンアプリから最低限必要な構成物だけコピって
自作の空モジュールだけが稼働する状態を作る、
という自分なりの手順を、ここでは示します。

前提事項

記事は下記の環境を前提として書いていきます。
ドライブやパス等は使用環境に合わせて適宜読み替えてください。

  • おことわり
    • 本稿で目指しているところは「zf3によるMVCのWebアプリケーションを開発する準備として必要最低限動作する構成物」です。
    • 「空のプロジェクト」という定義が人によって若干異なる可能性があります。
    • 私の場合は、以下の手順で作成されるプロジェクト構成物を「空である」と考えています。
  • 作成環境: Windows10
    • Git for Windows をインストール済み
      • Git Bashをコマンドライン作業環境として使う
      • Git Bash の使い方の説明は特にやらない
    • PHP7 を下記へインストールして環境変数PATHに設定済み
      • /c/php7/php.exe
        • PHP 7.0.15 (cli) (built: Jan 17 2017 13:58:38) ( ZTS )
    • composer.phar を取得済み
      • Git Bash で言うところの /f/hoge/work/直下に composer.phar を配置する
  • 本稿における作業ディレクトリは下記とする。
    • /f/hoge/work
    • F:\hoge\work\

STEP1

  • zf3 のスケルトンアプリケーションを作業ディレクトリへ取得しておく。
    • 途中で聞かれる「Do you want a minimal install (no optional packages)? Y/n」は、「最小構成でインストールするかい?」というプロンプト。とはいえ、それまでにInstallingとなってるパッケージ数から分かる通りそこそこ多い。
  • 以下、Git Bash を起動して以後のコマンドライン操作。
$ cd /f/hoge/work
$ php composer.phar create-project zendframework/skeleton-application zf3skel
Installing zendframework/skeleton-application (3.0.2)
  - Installing zendframework/skeleton-application (3.0.2): Loading from cache
Created project in zf3skel
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Package operations: 18 installs, 0 updates, 0 removals
  - Installing zendframework/zend-component-installer (0.7.0): Loading from cache
  - Installing zendframework/zend-stdlib (3.1.0): Loading from cache
  - Installing zendframework/zend-config (2.6.0): Loading from cache
  - Installing zendframework/zend-loader (2.5.1): Loading from cache
  - Installing zendframework/zend-eventmanager (3.1.0): Loading from cache
  - Installing zendframework/zend-view (2.8.1): Loading from cache
  - Installing psr/container (1.0.0): Loading from cache
  - Installing container-interop/container-interop (1.2.0): Loading from cache
  - Installing zendframework/zend-servicemanager (3.3.0): Loading from cache
  - Installing zendframework/zend-validator (2.8.2): Loading from cache
  - Installing zendframework/zend-escaper (2.5.2): Loading from cache
  - Installing zendframework/zend-uri (2.5.2): Loading from cache
  - Installing zendframework/zend-http (2.6.0): Loading from cache
  - Installing zendframework/zend-router (3.0.2): Loading from cache
  - Installing zendframework/zend-modulemanager (2.7.2): Loading from cache
  - Installing zendframework/zend-mvc (3.0.4): Loading from cache
  - Installing zendframework/zend-skeleton-installer (0.1.4): Loading from cache
  - Installing zfcampus/zf-development-mode (3.1.0): Loading from cache
zendframework/zend-config suggests installing zendframework/zend-filter (Zend\Filter component)
zendframework/zend-config suggests installing zendframework/zend-i18n (Zend\I18n component)
zendframework/zend-config suggests installing zendframework/zend-json (Zend\Json to use the Json reader or writer classes)
zendframework/zend-view suggests installing zendframework/zend-authentication (Zend\Authentication component)
zendframework/zend-view suggests installing zendframework/zend-feed (Zend\Feed component)
zendframework/zend-view suggests installing zendframework/zend-filter (Zend\Filter component)
zendframework/zend-view suggests installing zendframework/zend-i18n (Zend\I18n component)
zendframework/zend-view suggests installing zendframework/zend-json (Zend\Json component)
zendframework/zend-view suggests installing zendframework/zend-navigation (Zend\Navigation component)
zendframework/zend-view suggests installing zendframework/zend-paginator (Zend\Paginator component)
zendframework/zend-view suggests installing zendframework/zend-permissions-acl (Zend\Permissions\Acl component)
zendframework/zend-servicemanager suggests installing ocramius/proxy-manager (ProxyManager 1.* to handle lazy initialization of services)
zendframework/zend-validator suggests installing zendframework/zend-db (Zend\Db component)
zendframework/zend-validator suggests installing zendframework/zend-filter (Zend\Filter component, required by the Digits validator)
zendframework/zend-validator suggests installing zendframework/zend-i18n (Zend\I18n component to allow translation of validation error messages as well as to use the
 various Date validators)
zendframework/zend-validator suggests installing zendframework/zend-i18n-resources (Translations of validator messages)
zendframework/zend-validator suggests installing zendframework/zend-math (Zend\Math component)
zendframework/zend-validator suggests installing zendframework/zend-session (Zend\Session component)
zendframework/zend-router suggests installing zendframework/zend-i18n (^2.6, if defining translatable HTTP path segments)
zendframework/zend-modulemanager suggests installing zendframework/zend-console (Zend\Console component)
zendframework/zend-mvc suggests installing zendframework/zend-json ((^2.6.1 || ^3.0) To auto-deserialize JSON body content in AbstractRestfulController extensions, w
hen json_decode is unavailable)
zendframework/zend-mvc suggests installing zendframework/zend-mvc-console (zend-mvc-console provides the ability to expose zend-mvc as a console application)
zendframework/zend-mvc suggests installing zendframework/zend-mvc-i18n (zend-mvc-i18n provides integration with zend-i18n, including a translation bridge and transla
table route segments)
zendframework/zend-mvc suggests installing zendframework/zend-mvc-plugin-fileprg (To provide Post/Redirect/Get functionality around forms that container file uploads
)
zendframework/zend-mvc suggests installing zendframework/zend-mvc-plugin-flashmessenger (To provide flash messaging capabilities between requests)
zendframework/zend-mvc suggests installing zendframework/zend-mvc-plugin-identity (To access the authenticated identity (per zend-authentication) in controllers)
zendframework/zend-mvc suggests installing zendframework/zend-mvc-plugin-prg (To provide Post/Redirect/Get functionality within controllers)
zendframework/zend-mvc suggests installing zendframework/zend-psr7bridge ((^0.2) To consume PSR-7 middleware within the MVC workflow)
zendframework/zend-mvc suggests installing zendframework/zend-servicemanager-di (zend-servicemanager-di provides utilities for integrating zend-di and zend-servicema
nager in your zend-mvc application)
Generating autoload files

    Do you want a minimal install (no optional packages)? Y/n
Y
    Removing optional packages from composer.json
    Updating composer.json
Removing zendframework/zend-skeleton-installer...
  - Removing zendframework/zend-skeleton-installer (0.1.4)
    Removed plugin zendframework/zend-skeleton-installer.
    Removing from composer.json
    Complete!
> zf-development-mode enable
You are now in development mode.

STEP2

作業ディレクトリ直下に 次の構成で「emptyPJ」というフォルダを作る。
※最初の mkdir の引数が示すとおり、本稿では初期モジュール名を「Mymodule」としている。

$ mkdir -p emptyPJ/{config/autoload,data/cache,module/Mymodule}

emptyPJのフォルダ構成(STEP2)

F:\HOGE\WORK\EMPTYPJ
├─config
│  └─autoload
├─data
│  └─cache
└─module
   └─Mymodule

STEP3

取得済みのzf3skel から、public/配下のファイル群を emptyPJ へコピーする。
つまり emptyPJ のフォルダ構成はこうなる。

emptyPJフォルダ構成(STEP3)

F:\HOGE\WORK\EMPTYPJ
├─config
│  └─autoload
├─data
│  └─cache
├─module
│  └─Mymodule
└─public
   ├─css
   ├─fonts
   ├─img
   └─js

STEP4

次に、zf3で動作させるアプリケーションのconfig部分に下記ファイルを作成し、最低限の記述をしておく。

F:\hoge\work\emptyPJ\config\autoload\global.php

<?php
return  [
];

F:\hoge\work\emptyPJ\config\application.config.php

<?php
return [
    'modules' => require __DIR__ . '/modules.config.php',

    'module_listener_options' => [
        'module_paths' => [
            './module',
            './vendor',
        ],
        'config_glob_paths' => [
            realpath(__DIR__) . '/autoload/{{,*.}global,{,*.}local}.php',
        ],
    ],
];

F:\hoge\work\emptyPJ\config\modules.config.php

<?php
return [
    'Zend\Router',
    'Zend\Validator',
    'Mymodule',
];

STEP5

Mymodule の中身を、次のように最低限構成しておく。

Mymoduleのフォルダ構成

F:\HOGE\WORK\EMPTYPJ\MODULE\MYMODULE
├─config
├─src
│  └─Mymodule
│      └─Controller
└─view
    ├─error
    ├─layout
    └─mymodule
        └─index

続けて、下記ファイル群を作成またはzf3skelから複製配置し、最低限の記述をしておく。

F:\hoge\work\emptyPJ\module\Mymodule\Module.php

<?php
namespace Mymodule;

class Module
{
    public function getConfig()
    {
        return include __DIR__.'/config/module.config.php';
    }

    public function getAutoloaderConfig()
    {
        return array(
            'Zend\Loader\StandardAutoloader' => array(
                'namespaces' => array(
                    __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
                ),
            ),
        );
    }
}

F:\hoge\work\emptyPJ\module\Mymodule\config\module.config.php

<?php
namespace Mymodule;

use Zend\Router\Http\Literal;
use Zend\ServiceManager\Factory\InvokableFactory;

return [
    'router' => [
        'routes' => [
            'site-top' => [
                'type' => Literal::class,
                'options' => [
                    'route'    => '/',
                    'defaults' => [
                        'controller' => Controller\IndexController::class,
                        'action'     => 'index',
                    ],
                ],
            ],
        ],
    ],
    'controllers' => [
        'factories' => [
            Controller\IndexController::class => InvokableFactory::class,
        ],
    ],
    'view_manager' => [
        'display_not_found_reason' => true,
        'display_exceptions'       => true,
        'doctype'                  => 'HTML5',
        'not_found_template'       => 'error/404',
        'exception_template'       => 'error/index',
        'template_map' => [
            'layout/layout'           => __DIR__ . '/../view/layout/layout.phtml',
            'error/404'               => __DIR__ . '/../view/error/404.phtml',
            'error/index'             => __DIR__ . '/../view/error/index.phtml',
        ],
        'template_path_stack' => [
            __DIR__ . '/../view',
        ],
    ],
];

F:\hoge\work\emptyPJ\module\Mymodule\src\Mymodule\Controller\IndexController.php

<?php
namespace Mymodule\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

class IndexController extends AbstractActionController
{
    public function indexAction()
    {
        return new ViewModel();
    }
}

F:\hoge\work\emptyPJ\module\Mymodule\view\error\404.phtml および F:\hoge\work\emptyPJ\module\Mymodule\view\error\index.phtml

これは、 zf3skel から module\Application\view\error をごっそりコピって
F:\hoge\work\emptyPJ\module\Mymodule\view の配下に配置するだけでよい。
中身をいじりたかったら好きにいじってもいい。

F:\hoge\work\emptyPJ\module\Mymodule\view\layout\layout.phtml

※補足※
これは、 zf3skel から module\Application\view\layout\layout.phtml をコピって
余計なものを削ぎ落としたりタイトル関連だけ書き換えたりするとよい。

<?= $this->doctype() ?>

<html lang="ja">
    <head>
        <meta charset="utf-8">
        <?= $this->headTitle('ZF3 Mymodule')->setSeparator(' - ')->setAutoEscape(false) ?>

        <?= $this->headMeta()
            ->appendName('viewport', 'width=device-width, initial-scale=1.0')
            ->appendHttpEquiv('X-UA-Compatible', 'IE=edge')
        ?>

        <!-- Le styles -->
        <?= $this->headLink(['rel' => 'shortcut icon', 'type' => 'image/vnd.microsoft.icon', 'href' => $this->basePath() . '/img/favicon.ico'])
            ->prependStylesheet($this->basePath('css/style.css'))
            ->prependStylesheet($this->basePath('css/bootstrap-theme.min.css'))
            ->prependStylesheet($this->basePath('css/bootstrap.min.css'))
        ?>

        <!-- Scripts -->
        <?= $this->headScript()
            ->prependFile($this->basePath('js/bootstrap.min.js'))
            ->prependFile($this->basePath('js/jquery-3.1.0.min.js'))
        ?>
    </head>
    <body>
        <div class="container">
            <?= $this->content ?>
        </div>
        <?= $this->inlineScript() ?>
    </body>
</html>

F:\hoge\work\emptyPJ\module\Mymodule\view\mymodule\index\index.phtml

<?php
    echo 'index/index';

STEP6

以上の準備を終えたら、次のように composer.phar を emptyPJ直下に移動し、
zf3のフレームワーク構成ファイルを必要最小限で取得する。

$ mv composer.phar emptyPJ/
$ cd emptyPJ/
$ php composer.phar require \
        php:"^5.6 || ^7.0" \
        zendframework/zend-component-installer \
        zendframework/zend-mvc \

Using version ^1.0 for zendframework/zend-component-installer
Using version ^3.1 for zendframework/zend-mvc
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 16 installs, 0 updates, 0 removals
  - Installing zendframework/zend-component-installer (1.0.0): Loading from cache
  - Installing zendframework/zend-stdlib (3.1.0): Loading from cache
  - Installing zendframework/zend-loader (2.5.1): Loading from cache
  - Installing zendframework/zend-eventmanager (3.1.0): Loading from cache
  - Installing zendframework/zend-view (2.9.0): Loading from cache
  - Installing psr/container (1.0.0): Loading from cache
  - Installing container-interop/container-interop (1.2.0): Loading from cache
  - Installing zendframework/zend-servicemanager (3.3.0): Loading from cache
  - Installing zendframework/zend-validator (2.9.1): Loading from cache
  - Installing zendframework/zend-escaper (2.5.2): Loading from cache
  - Installing zendframework/zend-uri (2.5.2): Loading from cache
  - Installing zendframework/zend-http (2.6.0): Loading from cache
  - Installing zendframework/zend-router (3.0.2): Loading from cache
  - Installing zendframework/zend-config (2.6.0): Loading from cache
  - Installing zendframework/zend-modulemanager (2.7.2): Loading from cache
  - Installing zendframework/zend-mvc (3.1.0): Loading from cache
zendframework/zend-view suggests installing zendframework/zend-authentication (Zend\Authentication component)
zendframework/zend-view suggests installing zendframework/zend-feed (Zend\Feed component)
zendframework/zend-view suggests installing zendframework/zend-filter (Zend\Filter component)
zendframework/zend-view suggests installing zendframework/zend-i18n (Zend\I18n component)
zendframework/zend-view suggests installing zendframework/zend-json (Zend\Json component)
zendframework/zend-view suggests installing zendframework/zend-navigation (Zend\Navigation component)
zendframework/zend-view suggests installing zendframework/zend-paginator (Zend\Paginator component)
zendframework/zend-view suggests installing zendframework/zend-permissions-acl (Zend\Permissions\Acl component)
zendframework/zend-servicemanager suggests installing ocramius/proxy-manager (ProxyManager 1.* to handle lazy initialization of services)
zendframework/zend-validator suggests installing zendframework/zend-db (Zend\Db component, required by the (No)RecordExists validator)
zendframework/zend-validator suggests installing zendframework/zend-filter (Zend\Filter component, required by the Digits validator)
zendframework/zend-validator suggests installing zendframework/zend-i18n (Zend\I18n component to allow translation of validation error messages)
zendframework/zend-validator suggests installing zendframework/zend-math (Zend\Math component, required by the Csrf validator)
zendframework/zend-validator suggests installing zendframework/zend-i18n-resources (Translations of validator messages)
zendframework/zend-validator suggests installing zendframework/zend-session (Zend\Session component, required by the Csrf validator)
zendframework/zend-router suggests installing zendframework/zend-i18n (^2.6, if defining translatable HTTP path segments)
zendframework/zend-config suggests installing zendframework/zend-filter (Zend\Filter component)
zendframework/zend-config suggests installing zendframework/zend-i18n (Zend\I18n component)
zendframework/zend-config suggests installing zendframework/zend-json (Zend\Json to use the Json reader or writer classes)
zendframework/zend-modulemanager suggests installing zendframework/zend-console (Zend\Console component)
zendframework/zend-mvc suggests installing zendframework/zend-json ((^2.6.1 || ^3.0) To auto-deserialize JSON body content in AbstractRestfulController extensions, w
hen json_decode is unavailable)
zendframework/zend-mvc suggests installing zendframework/zend-log (^2.9.1  To provide log functionality via LogFilterManager, LogFormatterManager, and LogProcessorMa
nager)
zendframework/zend-mvc suggests installing zendframework/zend-mvc-console (zend-mvc-console provides the ability to expose zend-mvc as a console application)
zendframework/zend-mvc suggests installing zendframework/zend-mvc-i18n (zend-mvc-i18n provides integration with zend-i18n, including a translation bridge and transla
table route segments)
zendframework/zend-mvc suggests installing zendframework/zend-mvc-plugin-fileprg (To provide Post/Redirect/Get functionality around forms that container file uploads
)
zendframework/zend-mvc suggests installing zendframework/zend-mvc-plugin-flashmessenger (To provide flash messaging capabilities between requests)
zendframework/zend-mvc suggests installing zendframework/zend-mvc-plugin-identity (To access the authenticated identity (per zend-authentication) in controllers)
zendframework/zend-mvc suggests installing zendframework/zend-mvc-plugin-prg (To provide Post/Redirect/Get functionality within controllers)
zendframework/zend-mvc suggests installing zendframework/zend-paginator (^2.7 To provide pagination functionality via PaginatorPluginManager)
zendframework/zend-mvc suggests installing zendframework/zend-psr7bridge ((^0.2) To consume PSR-7 middleware within the MVC workflow)
zendframework/zend-mvc suggests installing zendframework/zend-servicemanager-di (zend-servicemanager-di provides utilities for integrating zend-di and zend-servicema
nager in your zend-mvc application)
zendframework/zend-mvc suggests installing zendframework/zend-stratigility (zend-stratigility is required to use middleware pipes in the MiddlewareListener)
Writing lock file
Generating autoload files

この操作により作成される composer.json は次の通り。

{
    "require": {
        "php": "^5.6 || ^7.0",
        "zendframework/zend-component-installer": "^1.0",
        "zendframework/zend-mvc": "^3.1"
    }
}

最終的にファイルのツリー構成はこうなります。
※ 本手順において、自分で手を加えることのある/ありそうなものに焦点を当てています。
※ public/ も vendor/ も composer が勝手に色々構成してくれるものであるため、 下図では中身を展開していません。

構成ファイルツリー.png

こうしてできた構成ファイル群をgitリポジトリ等作ってコミットしておけば、いつでもこれを初期状態として取り出せます。

今回の記事は以上です。

Discussion