zend framework3で時間割作成サイトを作ってみる2

スポンサーリンク

zend framework3のチュートリアルでわかったことをもとに、時間割作成サイトを作成してみます。続きです

作ってみる1
の続きです。
チュートリアルで理解したことをもとに作成しているので、
効率が悪いとか、拡張性がないとか、セキュリティがとか、
そういうのは知りません。それを了承したうえで見てください。
作りながら更新するので、時々間違いがあるかも、
適宜訂正します。

 

今回作るものについて

今回作るのは、「時間割作成サイト」です。
データベースに何を保存するかについて考えていきます。
私はそんなにウェブ系に詳しくないし、開発なんてほとんどしたことないので
効率や拡張性は確実に悪いです。それを念頭においてください。

データベースに保存する内容

  • day(曜日,int,0=日曜,範囲は1~5,not null)
  • period(時限,int,1=1限,範囲は1~6,not null)
  • class(科目名,varchar(30),文字列,30文字以内,not null)

PRIMARY KEY は(曜日,時限)の組です。DBはこれで作成できます。

作成する画面

今回作成する画面は2つです。

  • トップ画面(index,時間割の表示)
  • 編集画面(edit,科目名の追加、編集、削除ボタン等)

scheduleモジュールを作成し、クラスはschedule,アクション名は上述の二つで決まりました。

また、編集画面では、「ある曜日のある時限の科目名を入力する」
という形をとろうと思います。
なので、編集画面にアクセスするときのアドレスを、

http://schedule/edit/:day/:period

としたいと思います。
scheduleはクラス名(モジュール名ではない…はず)
editはアクション名です。(上述)
:day,:periodは変数であり、
:dayの値は1-5(月曜-金曜)
:periodの値は1-6
という制限があります。

モジュール単位でする設定を行う

必要なファイル階層を作成します。

schedule/
 /module
  /Schedule
   /config
   /src
    /Controller
    /Form
    /Model
   /view
    /schedule
     /schedule

その後、チュートリアルに従い、
module/Schedule/src/Module.phpを作成し、以下を書きます。

<?php
namespace Schedule;

use Zend\ModuleManager\Feature\ConfigProviderInterface;

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

その後、autoloadに通知するため、composer.jsonに以下を追加します。

    "autoload": {
        "psr-4": {
            "Application\\": "module/Application/src/", //<-たぶんいつの日かこれは削除する。今はしない
            "Schedule\\": "module/Schedule/src/" //<- これを追加
        }
    },

その後、コマンドラインでインストールしたフォルダの中に入り、
以下を実行します。

composer dump-autoload

上述のgetconfig()関数で呼び出しているであろう、
schedule/module/Schedule/config/module.config.phpを作成し、下を記述してください。

<?php
namespace Schedule;
use Zend\Router\Http\Segment;
use Zend\ServiceManager\Factory\InvokableFactory;

return[
	'controllers' =>[
		'factories' =>[
			Controller\ScheduleController::class => InvokableFactory::class,
		],
	],
	
	'view_manager' =>[
		'template_path_stack' => [
			'schedule' => __DIR__ . '/../view'
		],
	],
];

 

そして、モジュール作成を通知するため、schedule/config/modules.config.phpに以下を追加します。

return [
    'Zend\Form',
    'Zend\Db',
    'Zend\Router',
    'Zend\Validator',
    'Application',       // <-- たぶんいつの日か削除するが、今はしない
    'Schedule',          // <-- 追加
];

 

作成するアプリケーションに依存する設定を行う

次に、ルーティングの設定を行います。
ルーティングとはつまり、URLの設定のことです。(この解釈が正しいかはわかりません)

schedule/module/Schedule/config/module.config.phpファイルを開き、
controllersの下、view_managerの上にあたる部分に、routerを追加します。

	//追加
	'router' =>[
		'routes' =>[
			'schedule' =>[
				'type' => Segment::class,
				'options' =>[
					'route' => '/schedule[/:action[/:day/:period]]',
					'constraints' =>[
						'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
						'day' => '[1-5]',
						'period' => '[1-6]',
					],
					'defaults' => [
						'controller' => Controller\ScheduleController::class,
						'action' => 'index',
					]
				],
			],
		],
	],

上述で書いた通り、:day,:periodには制限がついています。
[]には、「任意」という意味があります。[]内はあってもなくてもよい、ということです。
indexアクションには、:day,:periodがいらないので、任意の[]でくくっている、ということです

これは余談ですが、上述の’/schedule[/:action[/:day/:period]]’のschedule部分。
これってたぶんコントローラ名を指していると思うんだけど、
もしコントローラ名なんだとしたら、
複数のコントローラを作成することを考えたら、この部分も変数にする必要があるんじゃないのかって思う。
実際に作成したことがないのでわからないですが。
モジュール名ではないはず、ほぼ確実に。
理由は、このファイルがmoduleの一つである、Scheduleフォルダの中に入っているから。
でもだとしたら、複数のモジュールを作成したときのルーティングってどうなるんだろうね。
いつかわかったら、このあたりをまとめて書こう

超外枠はできたので、具体的なものを、枠から作成していきましょう
最低でもController(action)とviewを作成する必要があります。
なので、何も書かなくてもいいので作成します。

まずは、schedule/module/Schedule/src/Controller/ScheduleController.php

<?php
namespace Schedule\Controller;

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

class ScheduleController extends AbstractActionController{
	public function indexAction(){

	}
	public function editAction(){

	}
}

次に、ビュー
schedule/module/Schedule/view/schedule/schedule/index.phtml
schedule/module/Schedule/view/schedule/schedule/edit.phtml
を作成します。中にはなにも記述しません。

さてこれで枠の作成は終わりです。次からは中身を作成していきます。

 

コメント

タイトルとURLをコピーしました