close

CakePHP3.6で新規ページを追加する方法【Controller,Model,View作成】

公開日:

すでに完成しているCakePHPのプロジェクトに新規ページを作成する依頼があり、改修作業を行ったので簡単にまとめました。【備忘録】

環境

DB: MySQL
フレームワーク: CakePHP 3.6.15

ルートを設定

config/routes.php

追記内容例
今回は改修前提なので、すでにある記述にならえばOKでしょう。

$routes->connect('/newpage/*', ['controller' => 'Newpage', 'action' => 'index']);

コントローラを作成

src/Controller/NewpageController.php

<?php
namespace App\Controller;
use App\Controller\AppController;
class NewpageController extends AppController
{
public function initialize() {
parent::initialize();
// src/Model/NewpageTable.phpを読み込みます。
$this->loadModel('Newpage'); 
} 
public function index($StopID = null){ 
$Datetime = date();
$week = "Monday";
$timeTable = $this->StopTimes->getTimeTable($StopID, $week, $Datetime);
$this->set(compact('timeTable')); 
$pageTitle = "新規ページ"; 
$this->set(compact('pageTitle')); 
// src/Template/Layout/header.ctp が共通テンプレートとして設定済の場合は以下のように読み込みます。
$this->viewBuilder()->layout('header'); 
// src/Template/newpage.ctp に出力します。
$this->render('newpage'); 
}
}

モデルを作成

src/Model/Table/NewpageTable.php

<?php
namespace App\Model\Table;
use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;
use Cake\Datasource\ConnectionManager;

class NewpageTable extends Table
{
public function getTimeTable($StopID, $week, $Datetime){
 
$today = date('Y-m-d', strtotime($Datetime)); 
// GTFSデータから時刻表を取り出すことを想定したテストSQL文
$sql = "SELECT ST.ArrivalTime, ST.StopHeadsign, TR.Headsign, TR.Via, CL.AgencyID, CL.Name FROM stop_times AS ST INNER JOIN trips AS TR ON(ST.TripID = TR.TripID and ST.StopID = ".$StopID." and TR.IsService = 1 and ST.PickupType = 0 ) INNER JOIN(SELECT * FROM calendars WHERE DATE(?) between StartDate and EndDate and (".$week."= 1) )AS CL on (TR.ServiceID = CL.ServiceID) order by ST.ArrivalTime asc" ; $connection = ConnectionManager::get('default'); $timeTable = $connection->execute($sql, [$today])->fetchAll('assoc'); 

return $timeTable; 
}
}

use で読み込んでいるデータに関しては他に準じました。環境によって変わります。
また、getTimeTable()として、GTFSのDBから時刻表を取り出すSQL文をテスト的に作成しました。

Viewを作成

src/Template/Newpage/newpage.ctp

<body>
<p>
<?php var_dump($timeTable) ?>
</p>
</body>

とりあえずViewにデータが渡ればいいので、シンプルにvar_dump()を使用しています。

URL https://example.com/newpage/******* に接続して、DBから取得したデータ(今回は時刻表データ)が表示されれば完成です!

バージョンの確認方法

CakePHP3.Xでバージョンを調べる方法はコンソールから

bin/cake version

CakePHPの自動ルーティングについて

おそらく、Laravelにはない機能(?)

routes.php に設定をしていなくても、コントローラのpublicメソッドを読み込める。

https://hogehoge/disp/stops

でDispController の stops()メソッドを呼び出すことができる。
(/Controller名/メソッド名)

Comment

メールアドレスが公開されることはありません。