次世代ランチ検索coozoをリリースしました

LINEで送る
Pocket

次世代型のランチ検索サービスcoozo(食うぞ)をリリースしました。

coozo | 次世代ランチ検索
coozo | 次世代ランチ検索

coozoはレストラン単位ではなく料理単位で検索する事ができます。例えば担々麺を食べたい場合にお店毎の担々麺の写真を比較しながらお店を選ぶ事ができます。

続きを読む 次世代ランチ検索coozoをリリースしました

LINEで送る
Pocket

hostsとmysql_connect()

LINEで送る
Pocket

CakePHP でsimpletest の実行がアホ程遅くなった。遅さ加減がシャレにならないし時折タイムアウトする。いつから遅くなったのかわかんないけど、気がついたらこうなっていた。いろいろ試してみた経緯を記録しておく。

続きを読む hostsとmysql_connect()

LINEで送る
Pocket

CakePHPのセッションの期限について

LINEで送る
Pocket

CakePHPでセッション期限を設定する

セッションが切断される機構にはいくつかの要素が絡んでいるので、一つのパラメータを操作しても思った様に動作しない場合がある。

【設定要素】

yourpath/app/config/core.php

・Configure::write('Session.timeout', '2016');
・Configure::write('Security.level', 'low');

/etc/php.ini

・session.gc_probability = 1
・session.gc_divisor = 1000
・session.gc_maxlifetime = 1440 ←単位は秒

【設定要素の説明】

Session.timeout

Session用のCookieをブラウザに保持しておく期間を設定。
単位は秒だが、Security.level の値による係数がかかる。
Cookieは更新されないので、この期間がそのままセッション保持の期間となる。

Security.level
ここでは、セッションの秒数にかかる係数値のみ述べるが、実際にはlevelによって様々な事が変わってくるので注意。
high:       x 10
medium: x 100
low:        x 300

例として、timeout = 2016, level = low の場合以下となる。
2,016s x 300 = 6,048,000s = 7 days となる。

session.gc_probability と session.gc_divisor
サーバー側でガベージコレクションを実施する確率を設定。
ユーザーによるアクセスの度にガベージコレクションが行われるのは負荷が高いので、実施する確率を設定している。
session.gc_probability = 1, session.gc_divisor = 1000 の場合 1/1000 の確率でガベージコレクションが行われる。
例えば1分間に1000PV程度のサイトであればだいたい毎分gcが行われている事になる。

session.gc_maxlifetime
Sessionファイル(*) をサーバーに保持しておく期間を設定。
ただし、Sessionファイルの最終更新日時は同一セッションからのアクセスがある度に更新される。
maxlifetimeは最終更新日時からの経過時間を指定しているものなので、頻繁にアクセスするセッションは維持されやすい。

PHP側でgc_maxlifetimeを設定する場合

ini_set("session.gc_maxlifetime", $time);

をsession_startより前に書く。

*:core.phpの設定により、ファイルではなくDBやmemcacheの場合もある。

【セッション維持とタイムアウトの仕組み 】

管理されるファイル

・ブラウザ側のセッション用Cookie
・サーバー側のSessionファイル(ファイルとは限らない)

フロー

  1. ユーザーのアクセスにより、CookieとSessionファイル(*)が作成される。
  2. Cookieは作成された時を基準にして core.phpに記載した Session.timeout の時間だけ保持される。
  3. Sessionファイルは最終アクセス日時を基準にして、php.iniの gc_maxlifetime の時間だけ保持される。
  4. gc_probability / gc_divisor の確率でガベージコレクションが発生し、その際に期限切れSessionファイルは削除される。
  5. ガベージコレクションで削除されずに残ったセッションもCookieのtimeoutにより最終的に削除される。

 

LINEで送る
Pocket

Google App Engine で CakePHPを使うトライ

LINEで送る
Pocket

とりあえずローカルのMountain lionでGoogle App Engine PHP SDKを入れてHelloworldを表示する事に成功した。次はCakePHPが使えないか試してみたい。

まず前回の記事で作ったアプリをCakePHPで置き換えよう。CakePHPはこちらからダウンロードしてディレクトリ毎展開すればOK。例えば、


~/Sites/gaecake/

というディレクトリにCakePHPを置いたとする。


$ cd ~/Sites/gaecake

$ touch app.yaml

$ touch php.ini

としてapp.yamlとphp.iniを作っておこう。そしてそれぞれ以下の様にかき込む。

app.yaml for CakePHP


application: cakegae
version: 1
runtime: php
api_version: 1

handlers:

- url: /css
static_dir: app/webroot/css

- url: /js
static_dir: app/webroot/js

- url: /img
static_dir: app/webroot/img

- url: /.*
script: app/webroot/index.php

次は、php.iniに以下をかき込む。


date.timezone = "Asia/Tokyo"

前回の記事に従って、


$ google_appengine/dev_appserver.py --php_executable_path=<path to php-cgi> ~/Sites/gaecake/

としてウェブサーバーを立ち上げ「http://localhost:8080」でブラウザからアクセスする。

これでCakePHPがローカル開発環境で表示されたはずた!

あれ?でもいろいろやってると不具合が出てくる。$this->redirectとかすると baseUrlの指定が壊れていててんで変なURLにリダイレクトしようとしよる。

こまった。。。なんか解決方法はないかのぉ。

app/config/core.phpの以下のラインをコメント解除したりもためした。


Configure::write('App.baseUrl', env('SCRIPT_NAME'));

でもダメだった。うーん。とりあえず今のところは解決策がみつからぬ。。

LINEで送る
Pocket

CakePHP2.1で英語と日本語の二言語対応サイトを作る(前編)

LINEで送る
Pocket

最低限の要素で2言語対応のサイトを実際にCakePHP2.1で作る方法を紹介します。
完成イメージは以下のサイト
九寨溝国家級名勝区の紹介
上記サイトをブラウザの言語を切り替えながら表示してみると、英語モードでは英語、日本語モードでは日本語で表示されることがわかります。
ブラウザの設定を切り替える方法はこちら
ブラウザの設定を切り替える

やる事

  • ・文字は直接書き込まず、特殊関数「__()」を使って書く
  • ・翻訳ターゲットをcakeシェルにて翻訳ファイルに出力
  • ・翻訳ファイルを翻訳する
  • ・URLが言語毎に区別できるようにする(※)
  • ・ブラウザの言語と逆のURLにアクセスした場合の補正
  • ・解析ツール(adsenseタグ)の読み分け
  • ・botからのアクセスへの考慮(いいねボタンとか)
  • ・長文コンテンツは翻訳ファイルを使わずに、別viewとして管理
 ここで再び「九寨溝国家級名勝区」のサイトを見てください。
サブドメインによって日本語と英語を切り分けているのがわかります。

 


 

文字は直接書き込まず、特殊関数「__()」を使って書く

通常viewに書き込む文字は直接書き込まず、下記のように記述します。

<?= __('type message here in english.') ?>

例:通常の書き方(app/View/Jiuzhaigou/index.ctp)

<ul>
    <li><?= $this->Html->link('Rizegou Valley', '/jiuzhaigou/rizegou')?>
    <li><?= $this->Html->link('Zezhawagou Valley', '/jiuzhaigou/zezhawagou')?>
   <li><?= $this->Html->link('Shuzhenggou Valley', '/jiuzhaigou/shuzhenggou')?>
</ul>

例:多言語対応の書き方

<ul>
    <li><?= $this->Html->link(__('Rizegou Valley'), '/jiuzhaigou/rizegou')?>
    <li><?= $this->Html->link(__('Zezhawagou Valley'), '/jiuzhaigou/zezhawagou')?>
   <li><?= $this->Html->link(__('Shuzhenggou Valley'), '/jiuzhaigou/shuzhenggou')?>
</ul>

この段階では上記は両方ともレンダー後に同じhtmlになります。

レンダー後

<ul>
    <li><a href="/jiuzhaigou/rizegou">Rizegou Valley</a>
    <li><a href="/jiuzhaigou/zezhawagou">Zezhawagou Valley</a>
   <li><a href="/jiuzhaigou/shuzhenggou">Shuzhenggou Valley</a>
</ul>

 

翻訳ターゲットをcakeシェルにて翻訳ファイルに出力

コンソールからソースのrootに移動して cake i18n コマンドを実行

$ cd {project root}/app
$ Console/cake i18n
Welcome to CakePHP v2.1.2 Console
-------------------------------------------------------
App : app
Path: C:\xampp\jiuzhai\trunk\app\
-------------------------------------------------------
I18n Shell
-------------------------------------------------------
[E]xtract POT file from sources
[I]nitialize i18n database table
[H]elp
[Q]uit
What would you like to do? (E/I/H/Q)
> E            <--------------------------------------------type E and Enter
What is the path you would like to extract?
[Q]uit [D]one
[C:\xampp\jiuzhai\trunk\app\] > <---------------------------type Enter

What is the path you would like to extract?
[Q]uit [D]one
[D] > <-----------------------------------------------------type Enter

What is the path you would like to output?
[Q]uit
[C:\xampp\jiuzhai\trunk\app\Locale] > <---------------------type Enter

Would you like to merge all domains strings into the default.pot file? (y/n)
[n] > <-----------------------------------------------------type Enter

Processing ..............

Error: default.pot already exists in this location. Overwrite? [Y]es, [N]o, [A]ll (y/n/a)
[y] > <-----------------------------------------------------type Enter

Error: cake.pot already exists in this location. Overwrite? [Y]es, [N]o, [A]ll (y/n/a)
[y] > <-----------------------------------------------------type Enter

Error: cake_dev.pot already exists in this location. Overwrite? [Y]es, [N]o, [A]ll (y/n/a)
[y] > <-----------------------------------------------------type Enter

[E]xtract POT file from sources
[I]nitialize i18n database table
[H]elp
[Q]uit
What would you like to do? (E/I/H/Q)
> Q <-------------------------------------------------------type Q and Enter

上記により以下に翻訳ファイルが生成されます。

app/Locale/cake.pot
app/Locale/cake_dev.pot
app/Locale/defalut.pot

 

翻訳ファイルを翻訳する

翻訳ファイルのエディタ(Poedit)を入手してください。

「app/Locale/default.pot」ファイルをPoeditで開いてください。

原文を順に選択していき、対訳の日本語を記述して以下の場所に保存してください。

app/Locale/jpn/LC_MESSAGES/default.po

たったこれだけで日本語と英語に対応したサイトができます。

まずは、先ほどの「ブラウザの設定を切り替える」で英語と日本語を切り替えながら表示を確認してみてください。

各設定に従って表示が変わる事が分かると思います。

それでは今回はこのへんで。

次回は「URLが言語毎に区別できるようにする」から。

LINEで送る
Pocket

CakePHPプレフィックスル-ティング(Prefix Routing)

LINEで送る
Pocket

CakePHPにおいてURLの構成を自由に変えたい時にコントローラーとアクション名から自動生成されてしまうURLでは都合が悪いケースがあります。その様な場合にも多くの場合は、/app/config/routes.phpに記述すれば回避する事ができます。しかし、URLパスの始めに(コントローラー名より前に)階層をつけたい場合は/app/config/core.phpに設定する特別なルーティング方法を使います。それがプレフィックスルーティング

例えば、以下のようなパスを組みたいとします。

/settings/user/add
/settings/user/delete
/settings/music/add
/settings/music/delete

このような場合に、settingsコントローラーのuserアクションをaddやdeleteのidで処理分けするのはどう考えてもナンセンスです。そこで、このようなケースはuserコントローラーのadd/deleteアクションとmusicコントローラーのadd/deleteアクションで対応したいわけです。つまり、コントローラー名の前の階層として、URLの都合上settingsを付けたいというルーティングをする事になります。

/app/config/core.phpの設定

  • Configure::write('Routing.prefixes', array('settings'));  ※v1.3の場合
  • Configure::write('Routing.admin', 'settings');                ※v1.2の場合

コントローラーの設定

コントローラ(controller)内では、プレフィックスとして settings_ をメソッドの前につけたすべてのアクション(action)が呼び出されます。user を例にすると、/settings/user/edit/5 というURLへのアクセスで、UserController の settings_edit メソッドが、引数5で呼び出されます。ビューファイルはapp/views/user/settings_edit.ctpとなります。

複数のプレフィックスを使う方法

【v1.3の場合】

Routing.prefixesに値を追加することによって、複数のプレフィックスを使うように Router を設定することもできます。もし、

  • Configure::write('Routing.prefixes', array('admin', 'manager'));

と設定すると、Cakeはadminとmanagerの両方のプレフィックスに対するルートを自動的に生成します。各々の設定されたプレフィックスのために、以下のルートが生成されるでしょう。

  1. $this->connect("/{$prefix}/:plugin/:controller", array('action' => 'index', 'prefix' => $prefix, $prefix => true));
  2. $this->connect("/{$prefix}/:plugin/:controller/:action/*", array('prefix' => $prefix, $prefix => true));
  3. Router::connect("/{$prefix}/:controller", array('action' => 'index', 'prefix' => $prefix, $prefix => true));
  4. Router::connect("/{$prefix}/:controller/:action/*", array('prefix' => $prefix, $prefix => true));

adminルーティングのように、全てのプレフィックス付きアクションはプレフィックス名を接頭辞としてつけるべきです。/manager/posts/addPostsController::manager_add()にマッピングされるからです。

【v1.2の場合】

/app/config/routes.phpに以下の設定をする。

  • Router::connect('/profiles/:controller/:action/*', array('prefix' => 'profiles', 'profiles' => true));

プレフィックスルートを使うときに重要な点は、HTML ヘルパーを使用してリンクを作成するなら、プレフィックスを用いた呼び出しの管理も楽になります。HTML ヘルパーを使ったリンクの例は次のようになります。

Copy to Clipboard
  1. // プレフィックスがつけられたルートに行く
  2. echo $html->link('Manage posts', array('manager' => true, 'controller' => 'posts', 'action' => 'add'));
  3. // プレフィックスとお別れする
  4. echo $html->link('View Post', array('manager' => false, 'controller' => 'posts', 'action' => 'view', 5));

 

LINEで送る
Pocket

CakePHPでQdmailを使う

LINEで送る
Pocket

アホみたいなメモ。
CakePHPでQdmailを使うやり方。

メールを送る時に、Fxxkな日本のS-JISやそれに準拠したクソメーラーに悩まされた事はありませんか?
UTF8でメールを送ると文字化けしたりする下衆メーラーにもQdmailで送れば文字化けしないようにできます。
Qdmailを使ってメールを送る時に文字コードをiso-2022jpにしてやりましょう。

Qdmailのダウンロード

ここでダウンロードしましょう

ファイルの配置

app/controllers/components/
にダウンロードしたファイルを置きます。

コントローラーの設定

コンポーネントの設定
var $components = array(‘Qdmail’);

メール本文に送る変数をセット
変数はビューに送る変数と区別して配列に格納しましょう
like this
$content = array(
‘arg1’ => ‘引数1’,
‘arg2’ => ‘引数2’
);

ヘッダ設定

宛先
$this->Qdmail->to(‘hoge@xxx.co.jp’, ‘日本語名’);
BCC
$this->Qdmail->bcc(array(‘bcc1@xxx.co.jp’, ‘bcc2@xxx.co.jp’), array(‘bcc1日本語’,’bcc2日本語’));
$this->Qdmail->bcc(‘bcc1@xxx.co.jp, bcc2@xxx.co.jp’);
差出人
$this->Qdmail->from(‘from@aaa.co.jp’));
タイトル
$this->Qdmail->subject(‘タイトルだお’);
メールテンプレート指定(テキストメールの場合)
$this->Qdmail->cakeText($content, ‘invitation_template’);
メールテンプレート指定(HTMLメールの場合)
$this->Qdmail->cakeHtml($content, ‘invitation_template’);

※cakeText, cakeHtmlの第一引数にメール内引数をセット。第二引数にテンプレートを指定

おまじない
mb_language(‘ja’);
$this->Qdmail->errorDisplay( false );
$this->Qdmail->lineFeed(“\n”);

 

メールを送信する
$this->Qdmail->send();

テンプレートの設定

メールテンプレートはCakePHPのview element として記述します。
配置場所
app/views/elements/email/text/
ファイル
invitation_template.ctp
ファイル名はコントローラーで指定した名前

これだけで、デフォルトの文字コードiso-2022jpとしてメールの送信ができます。
めちゃめちゃ簡単!
テンプレートはUTF8で作成しておいて問題ありません。

LINEで送る
Pocket

CakePHPでEmailを送る

LINEで送る
Pocket

アホみたいなメモ。
CakePHPでメールを送るやり方。

コントローラーの設定

コンポーネントの設定
var $components = array(‘Email’);

メール本文に送る変数をセット
変数はビューに送る変数設定を同じでOK
like this
$this->set(‘hensu’, $hensu);

ヘッダ設定

宛先
$this->Email->to = ‘hoge@xxx.co.jp’
BCC
$this->Email->bcc = ‘secret@xxx.co.jp’
差出人
$this->Email->from = ‘from@xxx.com’
タイトル
$this->Email->subject = ‘ヌルハチの野望’
メールテンプレート指定
$this->Email->template = ‘invitation_template’
送信方式
$this->Email->sendAs = ‘text’

メールを送信する
$this->Email->send();

テンプレートの設定

メールテンプレートはCakePHPのview element として記述します。
配置場所
app/views/elements/email/text/
ファイル
invitation_template.ctp
ファイル名はコントローラーで指定した名前

はい、たったこれだけでUTF-8でメールが送信できます。
JISでメールを送りたい場合は別途記事を書きます。

LINEで送る
Pocket

CakePHPバリデーションのみ行う

LINEで送る
Pocket

アホみたいなメモ

CakePHPでsaveをせずにバリデーションのみ行う方法

$this->Model->set($data);

$this->Model->validates();

 

■例 ********************************************************

$this->User->set($this->data);

if($this->User->validates()){

$this->User->doSomething($this->data);

}

LINEで送る
Pocket

CakePHPとは(フォルダ構成とMVC開発の初歩)

LINEで送る
Pocket

CakePHPの初歩の初歩解説をして行こうと思います。

フォルダ構成

ダウンロードしたファイルを解凍するとフォルダとファイル一式が現れます。
第1階層〜第3階層にわけて解説していきます。

– 第1階層

フォルダ構成は以下
・app/
・cake/
・vendors/

「app」以下が開発者がカスタマイズする場所です。ここだけ気にすれば大丈夫
「cake」以下がCakePHPのエンジンです。ここは絶対に書き換えてはいけません。
「vendors」第3者機関が作ったライブラリ等を設定する箇所。(app/vendorsとの住み分けは不明)

というわけで、「app」だけ気にしていけば大丈夫。他はデバッグの時に参考にするくらいで無視してください。

– 第2階層(app以下のみ解説します)

app/配下のフォルダ構成は以下
設定用フォルダ
・config/

MVCデザインアプリケーション
・models/
・views/
・controllers/

仮想のドキュメントルート
・webroot/

【外部開発のライブラリ/プラグインを配置】
・vendors/
・plugins/

【国際化の文字ファイル】
・locale/

【テストケース設定用】
・tests/

【CakePHPが利用するファイル】
・tmp/
・index.php

※見やすさの為に順番を変えて分類してあります。

初期の開発段階では以下だけ意識していれば大丈夫。
・設定用フォルダ
・MVCデザインアプリケーション
・仮想のドキュメントルート

「controllers」はコントローラーを入れるフォルダです。ファイルの詳細は後述
「models」はモデルを入れるフォルダです。ファイルの詳細は後述
「views」はビューを入れるフォルダです。ファイルの詳細は後述。フォルダ構成は第3階層で解説。

– 第3階層 – view以下

app/views/配下のフォルダ構成は以下
・elements/
・errors/
・helpers/
・layouts/
・scaffolds/
・自分で命名したフォルダ(複数)/

初期段階で大事なのは以下
layouts」にはWebサイト全体の共通レイアウトを作成し配置します。
自分で命名したフォルダ」については後述します。
elements」ページの中で何度も出てくるようなパーツをエレメントとしてここに保存する事によって何度も重複した記述をせずにいつでも呼び出すことができる。

– 第3階層 – MVC関連

・app/controllers/components/
・app/models/behaviors/
・app/views/helpers/

これらはそれぞれにおける共通関数を配置する場所。例えば、コントローラーの共通関数はコンポーネントに置く。

ページ全体のレイアウトの作成

app/views/layouts/default.ctp」というファイルを作成し、普通にhtmlでレイアウトを作成。
特別な記述のルールはあるが、まず初めは部分は静的にかいてしまっても構わない。
内に描画される実際のコンテンツは可変であるため、 と記述する事でその部分の描画をMVCアプリケーションに託す事ができる。

app/views/layouts/default.ctp 例
=====================================

<!doctype html>
<html>
<head>
<?= $html->charset(‘utf-8’) ?>
<title><?= $title_for_layout ?></title>
<?= $html->css(‘styles’) ?>
<?= $scripts_for_layout ?>
</head>
<body>
<?= $content_for_layout ?>
</body>
</html>

=====================================

まずは例の通りにdefault.ctpファイルを配置してみよう。Webアクセスするとブラウザの表示が変わる事を確認できる。

MVCデザインのアプリケーションを体感しよう

MVCの詳細については後日別の記事を書く予定
簡単な流れとしては、コントローラーがセッションを受け取り管理する。
コントローラーは必要に応じてモデルを呼び出しデータを取得/編集。
結果をビューに渡して描画する。

まず、試しように「try」というページを作成してみよう。

– コントローラーの作成

app/controllers/try_controller.php」を作成。
=====================================

<?php
class TryController extends AppController {
function index() {}
}

=====================================
と記述。
※:ファイル名はWebアクセス時のURLと自動連動しています

Webからアクセスしてみよう。
http://【あなたのホスト名】/try
「Missing Database Table」というエラーが出ると思います。
MVCデザインでは必ずまずモデルをデータベースから自動生成しようとするため、
データベースとモデルファイルを作成しておく必要があります。
モデルが不要な場合はvar $uses = array();」と記述すれば大丈夫

– モデルの作成

まず、接続しているデータベースにtriesテーブル(※1)を作成してください。
フィールドに必ず以下を設定してください。
・id: (int: auto_increment)
・created (datetime)
・modified (datetime)

それ以外は任意のフィールドを追加できます。
※1:テーブル名はURLと連動しています。必ず複数形で作成します。(英語の変化形をちゃんと理解します。すごい!)
もし1つのページ(例えばtryページ)で別のテーブルを呼びたい場合はそれも可能です。今は割愛します。

app/models/try.php」を作成。
=====================================

<?php
class Try extends AppModel {
var $name = ‘Try‘;
}

=====================================
と記述
※:ファイル名はテーブル名と連動しています。つまり、1テーブル1モデルです。
デフォルトではURLと結びつくモデルを呼び出そうとしますが、そうである必要性はありません。

Webからアクセスしてみよう。
http://【あなたのホスト名】/try
「Missing View」というエラーに変わったと思います。

– ビューの作成

app/views/try/」というフォルダを作成してください。
その中に「index.ctp」というファイルを作成します。(印のために hello world とでも書いてください)

Webからアクセスしてみよう。
http://【あなたのホスト名】/try

hello world が表示されるのを確認してください。
これでページを作成できました。

コントローラー/アクションの概念

CakePHPではコントローラー/アクションという概念があります。
コントローラーが一つの大カテゴリでアクションがそのカテゴリに紐づく動作と考えてください。
例えば、イベント管理システムでイベントの解説・表示・登録・編集が必要なサービスの場合
http://【ホスト名】/event/
http://【ホスト名】/event/show
http://【ホスト名】/event/registration
http://【ホスト名】/event/edit

などのURLにする事が考えられます。
この場合の「event」部分がコントローラー。「show」等がアクションです。
アクションがない場合は「index」が省略されていると思ってください。

さて、ここまでの解説を振り返ってください。
コントローラーの解説時に「function index()」を作成しています。
また、ビューの/try/フォルダ内に「index.ctp」ファイルを作成しています。
これらの名前がアクションにそのまま連動しているのです。
つまり、上記の過程では「try」コントローラーの「index」アクションを定義しているという事になります。

では、「show」アクションのページを作ってみましょう。
コントローラーファイル「app/controllers/try.php」を開き下記を追記
=====================================
function show() {}
=====================================

ビューファイル「app/views/try/show.ctp」を作成し、「showページ」とでも記述してください。
以下にアクセスしてみましょう。
http://【あなたのホスト名】/try/show

showページは表示されましたか?
実際にはアクション毎に違った処理になりますので、それぞれのfunctionにロジックを記述していくことになります。

トップページの作成

トップページだけ他のページと若干のルールが異なります。
以下に記述する事はトップページにのみ適用されるルールである。

トップページ下記で制御します。
コントローラー:「app/controllers/pages_controller.php
モデル:「app/models/page.php
ビュー:「app/views/pages/display.ctp
※ これは基本的に固定ですが変える事もできます。

pages_controller.phpの内容はこんな感じ
=====================================

<?php
class PagesController extends AppController {
function display() {}
}

=====================================

Webアクセスするにはコントローラーもアクションもつけずにhttp://【ホスト】でアクセスできます。

これで初めの難関はクリアです。
あとは触っていけば理解できるんじゃないかと。

でわでわ。

LINEで送る
Pocket