アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

('ω') < イザユケエンジニャー

CodeIgniter入門 #4:自作コアクラスを挟んでみる

CodeIgniter入門シリーズ カテゴリーの記事一覧 - アナログCPU:5108843109


CodeIgniterにデフォルトで入っているWelcomeコントローラは以下のように始まっています。

class Welcome extends CI_Controller { ...

これはsystem(コアシステム)内のクラスを継承しているのですが、
いろんなところで共通の処理を独自に入れたい、というときにsystem内をいじるのはあまりよろしくありません。
CI_Controllerを継承した独自のクラスをさらに継承して使いたいと思います。

今回やること

  • コアクラスとコントローラの間に自作のクラスを挟む

まずはドキュメントを見る

コアシステムクラスの作成 — CodeIgniter 3.2.0-dev ドキュメント

要約すると…

  • application/core の下に自作クラスを設置する
  • クラス名は「MY_」で始めること
    • application/config/config.php 内で変更は可能、ただし「CI_」は不可
  • コントローラの継承元を自作クラスにする

…という感じですね。

やってみる

application/core/TestClass.php

<?php
class MY_Controller extends CI_Controller {
}

application/controller/Welcome.php

<?php
class Welcome extends MY_Controller {
	public function index()
	{
		echo "test";
	}
}

まずはシンプルに用意してみたのですが…

…動かない…。

Fatal error: Class 'MY_Controller' not found in ... Welcome.php on line 3

と言われてしまいます。

作ったクラスが読み込まれていないっぽい?

エラーメッセージでググってみる。

CodeIgniter Coreファイルが見つからない | ZEKIOM.NET
php - codeigniter MY_Controller not found - Stack Overflow
php - CodeIgniter 3.1.7 - Class 'MY_Controller' not found error occurred only on my server - Stack Overflow

解決していたりしていなかったりですが、このへんを参考にしつつ、
試しにWelcome.phpの先頭に

include_once(APPPATH.'core/TestClass.php');

を入れてみたら動きました。
どうやら読み込まれていなかった様子。デフォルトでは読まれないのか?
じゃあどこで読み込むべきなんだろうかとソースコードgrepしていると、
system/core/CodeIgniter.php 内にこんなものを見つけました。

if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php'))
{
	require_once APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php';
}

これはまさかとクラスのファイル名をMY_Controller.phpにしてみたら、動いた。

えええ…。
でも公式ドキュメントの例だと some_class.php とかいう適当な名前なんですけど…。
coreディレクトリ以下をまるっと読んだりしてくれないの?

複数ファイルを使い分けたりできないのかと考えるとしっくりこないのでもう少し探してみたのですが、
system/core/Common.php 内の load_class とかいう関数が怪しいかなーと思いつつ、これもまたしっくりこないので諦めた。
とりあえずMY_Controller.php で乗り切ることにします。

MY_Controller.php をなんとか使いまわす方法

この方法が正しいのかどうかはわかりませんが…
Step 9 - No more MY_Controller monopoly. How you can create more than one base controller - Avenir
を参考に。

複数のクラスを使いたくなったら、こんな感じで乗り切るのがお手軽かも。
ロードする順番に気を使わなくて済むし。

<?php
class MY_Controller extends CI_Controller
{
    // ...
}
 
class A_Controller extends MY_Controller
{
    // ...
}
 
class B_Controller extends MY_Controller
{
    // ...
}

Mercuryを使ってみる

XAMPPにくっついてくるMercury、今まで使ったことがなかったのですがついに仕事で使う機会があったのでメモ。

ローカル環境でメール送受信ができます。

Mercuryがローカルでメールサーバーとして動く状態にする

  • XAMPP内のmercury.exeを管理者権限で起動
    • もしくは管理者権限で起動したXAMPPのMercuryのAdminをクリック
  • Contigration > Protocol modules にて以下にチェックを入れる
    • MercuryS SMTP server
    • MercuryP POP3 server
    • MercuryE SMTP end-to-end delivery server
  • Contigration > MercuryS SMTP Server にてIPアドレスの設定を行う
    • Connection control タブで「Add restriction」をクリック
    • IP Address range のfromとtoを両方「127.0.0.1」に設定する
  • Contigration > MercuryP POP Server にてIPアドレスの設定を行う
    • Connection control タブで「Add restriction」をクリック
    • IP Address range のfromとtoを両方「127.0.0.1」に設定する

メールアドレスを追加する

  • XAMPP内のmercury.exeを管理者権限で起動
    • もしくは管理者権限で起動したXAMPPのMercuryのAdminをクリック
  • Contigration > Manage local users... をクリック
    • 「Add」をクリックして出てきたウインドウで以下を設定
      • Username:メールアドレスの@以前の部分
      • Personal name:Usernameと同じでよい
      • Mail password:パスワード
      • APOP secret:Mail passwordと同じでよい

ドメインを設定する

  • XAMPPのsendmail/sendmail.ini にて以下のように書き換える
    • smtp_server=hogehoge.foo
      • hogehoge.fooの部分は別のものでもよいが、このように存在しないドメインを使うなどしておくと安全
  • XAMPPのMercuryMail/MERCURY.INI にて以下のように書き換える
[Domains]
localhost: localhost
localhost: localhost.net
localhost: localhost.org
localhost: localhost.com
localhost: hogehoge.foo ; # この行を追加

動作確認

メールソフト等で送受信ができるかどうか確認して終了

CodeIgniter入門 #3:複数サイトの設置に対応してみる

CodeIgniter入門シリーズ カテゴリーの記事一覧 - アナログCPU:5108843109

入門どころかいろいろすっ飛ばして応用してる感がありますが

なんかうまいこと複数サイトを運用する方法あるかな、と思って考えてみました。
レンタルサーバーなどドキュメントルートが一つなので共有するしかない、みたいな前提)

といってもかなり直球な方法なので大仰に書くほどでもないのですが…

今回やること

  • 複数サイトを想定してディレクトリ構造を変更し、動かしてみる

ファイル設置してみる

こんな感じで。

  • codeigniter
    • application
    • application_a
    • system
  • www(←ドキュメントルート)

前回の構造は基本的にそのままで、「applicationディレクトリを複製」「index.php.htaccessのセットを複製したやつを別ディレクトリ切って設置」しています。
systemは共有して良さそうに見えるのでそのままにしていますが、問題があればapplicationと同じ対応でよいはずです。
逆にapplicationも共有する場合はそもそも複製しなくてOK…なのでしょうけど、そんな運用あるかな…

ドキュメントルート下にcssやjsなどのディレクトリを切る場合もまあ好きなところでよいでしょう。

っていうかcodeigniterディレクトリっていうのがだいぶダサくなってきたな…。

アクセスできるようにしてみる

複製しただけなので、まずwww直下のindex.phpは何も変わりません。「/」でアクセスできます。
で、複製したところは「/a/」でアクセスできるようにしたいと思います。

といっても、www/a/index.php を実際のパスに合わせて以下のように調整するだけです。

$system_path = '../../codeigniter/system';
$application_folder = '../../codeigniter/application_a';

/a/ に無事アクセスできればOK。あとはそれぞれのapplicationディレクトリ以下で開発するだけ。

URLがかっこ悪いっていうのは…独自ドメインとかあればサブドメインに置き換えるとか上手いことできるもんなのかな?(よく知らない)

想定する用途

単に丸々別物のサイトの運用もできるでしょうけども、例えば
「/」は一般公開用ページとして、
「/user/」はログイン中専用ページ、「/admin/」は管理ページ、「/api/」はwebAPI用…みたいな感じでもよさそう。
adminとかapiとかってコントローラ作るのも何だし、だからって.htaccessなどでいじり回すのもアレだし。
そういう分け方しておくと、いざ複数サーバーに分散設置したいってときもちょっと楽そうだし。

CodeIgniter入門 #2:軽く改造してみる

CodeIgniter入門シリーズ カテゴリーの記事一覧 - アナログCPU:5108843109

今回やること

  • デフォルトのディレクトリ構造を変えてみる
  • データベースに接続する

ドキュメントルートのダイエット

やっぱドキュメントルート以下に丸々入ってるのが気持ち悪いので外に出しておくことにしました。

ドキュメントルート用のディレクトリを用意して、そこにindex.php.htaccessを移動させます。
名前は何でも良いのですが、個人的に使っているさくらサーバーがwwwなのでそうしておきます。
で、wwwと同じ階層にcodeigniterディレクトリを作り、そっちにapplicationとsystemを移動させました。

こういう感じです。構造も好みでOK。

こうしておけば外部からはwww以下しかアクセスされないので、
applicationやsystemディレクトリ以下のアクセス対策用index.htmlは消しても差支えないと思います。

で、移動したindex.phpの中にapplicationディレクトリやsystemディレクトリへのパスが書かれているので、そこを直します。
今回の例だと以下のような感じ。

$system_path = '../codeigniter/system';
$application_folder = '../codeigniter/application';

また、XAMPPのhttpd.confなども必要に応じて書き換えておきます。

アクセスを試してみて動けばOK。

いらないディレクトリとファイルを消す

codeigniter(=application, system), www以外のディレクトリやファイルは全て削除しても大丈夫…かもしれません。
とりあえず動きました。
不安なら残しておくなり別のところに退避させておくなり。最悪またダウンロードしてこればOKだと思います。

前項で書いた通り、ドキュメントルート外のindex.htmlもごっそり消して問題なさそうです。
わざわざ消すほどでもないかもしれませんが、なかなか鬱陶しいし…。

あとはapplication以下に空のディレクトリが多いけど何なんだろう。消してもいいのかな。
気になるけどとりあえず残しておきます。

データベースの接続設定をする

データベースとユーザーを用意します。(省略)
今回はMySQLlocalhost内に「sandbox」データベースと「user」ユーザー、「pass」というパスワード…ということにします。

codeigniter/application/config/database.php 内の設定を変更します。

$db['default'] = array(
	'dsn'	=> '',
	'hostname' => 'localhost',
	'username' => '',
	'password' => '',
	'database' => '',
	'dbdriver' => 'mysqli',
	'dbprefix' => '',
	'pconnect' => FALSE,
	'db_debug' => (ENVIRONMENT !== 'production'),
	'cache_on' => FALSE,
	'cachedir' => '',
	'char_set' => 'utf8',
	'dbcollat' => 'utf8_general_ci',
	'swap_pre' => '',
	'encrypt' => FALSE,
	'compress' => FALSE,
	'stricton' => FALSE,
	'failover' => array(),
	'save_queries' => TRUE
);

変更点を抜粋するとこんな感じです。

	'username' => 'user',
	'password' => 'pass',
	'database' => 'sandbox',
	'char_set' => 'utf8mb4',
	'dbcollat' => 'utf8mb4_general_ci',
);

接続できたかどうか確認するには、コントローラ内の適当なメソッド内(もちろんview呼び出しより前)に以下を追記してアクセスしてみます。

$this->load->database('default');

「追記前と何も変わらなければ」とりあえずOKです。
試しにユーザー名やデータベース名などを存在しないものに変えてリロードしてみてエラーになれば尚良しです。

参考資料
データベースへの接続 — CodeIgniter 3.2.0-dev ドキュメント

CodeIgniter入門 #1:Hello CodeIgniter World!!!

※「CodeIgniter入門する人向け記事」じゃなくて「自分がCodeIgniter入門してみた記事」です

CodeIgniter入門シリーズ カテゴリーの記事一覧 - アナログCPU:5108843109

仕事でCodeIgniter触ることになり自分でなんか作った方が理解早そうだなと思って、なんかやってみる。
あとPhalconほどじゃないけど名前がかっこいいし、高速で軽量で自由度が高いということで。
とりあえずHelloWorldまでやってみます。

CodeIgniter へようこそ — CodeIgniter 3.2.0-dev ドキュメント


開発環境はWindows、サーバーはLinuxの想定です。
まあXAMPPで動かすだけなんですけど。

今回やること

  • CodeIgniterのダウンロード
  • HelloWorld(サンプルページの改造から新規ページ追加まで)

CodeIgniterのダウンロード

以下からzipをダウンロードして展開します。
www.codeigniter.com

ちなみに今回ダウンロードしたのは3.1.10でした。

中身を見てみる

こんな構成でした。

  • application
  • system
  • user_guide
  • index.php
  • …などなど


えっ…これさあ…
もしかしてここがドキュメントルートになるの??自由すぎない???

applicationとかsystemとかのディレクトリを覗いてみると、
以下全ディレクトリに「403だよ」って表示するだけのindex.htmlが設置されている…。
まじかよ…。
じゃあドキュメントルートの下に置かなきゃいいじゃん、と思いましたが、ひとまずこの形で進めてみます。
(ちなみに仕事で触るプロジェクトはapplicationとsystemを外に移してました。せやろな)

ローカルで動かしてみる

きっとサンプルページ的なものは最初から出るだろうと踏んで、ダウンロードしたファイルには一切手を加えず適当なところに設置。
英語アレルギーに耐えつつreadmeを見てみるとPHP5.6以上ということだったので、適切なXAMPPを選ぶ。
httpd.confとhostsを編集してXAMPPを起動してアクセス。

f:id:honey8823:20190618130921p:plain

えー…

えーと…

このページのviewは application/views/welcome_message.php で、
controllerは application/controllers/Welcome.php だよ、ってことですかね。

とりあえず動いたっぽいので良し。

HelloWorldしてみる

じゃあ、ここを差し替えてHelloWorldしてみます。

その1:viewを書き換えてみる

application/views/welcome_message.php の内容を適当にいじってからリロード。
無事反映されました。まあそりゃそうなんですけど、確かにここに紐づいてますよということで。

元に戻します。

その2:別のviewを呼んでみる

application/views/welcome_message.php を複製して、HelloWorld仕様に適当に書き換えます。
ここでは hello_world.php としました。
それから application/controllers/Welcome.php から複製したviewを呼ぶよう変更。

public function index()
{
	// $this->load->view('welcome_message'); // これをコメントアウトして
	$this->load->view('hello_world'); // こうじゃ
}

それからリロードすると無事反映されました。
Welcome.php も元に戻します。

その3:別のcontrollerを呼んでみる

次は application/controllers/Welcome.php も複製して、HelloWorld仕様に書き換えます。
ここでは HelloWorld.php としました。
(書き換え内容はその2と同じ)

じゃあこれをどこから呼ぶんだ、と探してみた結果、
application/config/routes.php でした。

// $route['default_controller'] = 'welcome'; // これをコメントアウトして
$route['default_controller'] = 'helloworld'; // こうじゃ

こうやってwelcomeを呼んでいるのをhelloworldに書き換えてリロード。
無事反映されました。

routes.php ももとに戻します。

その4:新しくページを作る

さっきからトップページを書き換えているだけなので、今度は新しくページを作ってみます。

長くなるので結論だけ書くと、以下2つの手順でいけました。

① config/config.php の調整

// $config['index_page'] = 'index.php'; // このindex.phpを
$config['index_page'] = ''; // 消す

②ルートディレクトリ(index.phpと同じ階層)に、下記内容の .htaccess を設置

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

この調整をしてから /helloworld/ にアクセスすると無事に表示されました!

ちなみに、controllerに hoge メソッドを追加すると、/helloworld/hoge/ でアクセスできます。

おしまい

無事にHelloWorldできましたのでとりあえず今回はここまで!

蛇足:ルーティングについて

> 長くなるので結論だけ書くと
と書きましたが、その部分の補足を。

まあ新しいページ追加するつってもルーティングをなんとかすればいけるっしょ、とユーザーガイドを見てみました。
URI ルーティング — CodeIgniter 3.2.0-dev ドキュメント

URI のセグメントは通常、つぎのパターンに従います:

example.com/class/function/id/

お、もしかして設定いらない? と思って /hellowold/ にアクセスしてみるものの、404。

じゃあ一応設定してみる?と思って

$route['helloworld'] = 'helloworld';

としてみましたが、まだ404。

軽くぐぐってみると同じような?症状の人を発見。未解決だけど。
PHP - CodeigniterでURIルーティングがうまく動作しない。|teratail

(私のサーバーのドメイン)/index.php/users/list/でアクセスできた

なんじゃそりゃ、と思いつつ /index.php/helloworld/ にアクセスしてみると確かに正常に表示された。
なんじゃそりゃ。

もうちょっとユーザーガイドを見てみるとこんなページを発見。
CodeIgniter の URL — CodeIgniter 3.2.0-dev ドキュメント

デフォルトでは index.php ファイルは URL に含まれます

…?
???
え、なんで?

なんでかは分かりませんが、↓も参考にしつつ先に書いた方法で解決しました。
CodeIgniter 3でURLに付加されるindex.phpを外したい(取り除きたい) | onocom

別々の設定を持ったChromeを同時に起動する

今いる作業場所、何故かChromeのプライベートモードが使えないよう制限されていて、
いろんなアカウントを使い分けるようなテストでちょっと困るので
cookieなど無駄に汚したくないし後から全リセットするのもヤダヤダ)
調べてみたところ、普通のChromeを複数同時に起動する方法がありました。

手順は以下の通り。

  • 任意の場所に、Chromeのデータを保存するためのディレクトリを作っておく
  • Chromeのショートカットを好きなところに作る
    • もちろん、今使っているものとは別のショートカット
    • 名前は好きに変更してどうぞ
  • 作ったショートカットを右クリック>プロパティ で、「リンク先」のところに以下を追記する
    • --user-data-dir=さっき作ったディレクトリのフルパス
    • 「OK」で保存して完了

リンク先のところは要するにこんな感じになります。

"C:\ ... \chrome.exe" --user-data-dir=C:\chromedata_1

この方法で、好きなだけ別々のChromeを量産できます。
作ったショートカットから起動してみると、まっさらの状態のChromeが出てきます。
プライベートモードとは違って、こっちはこっちで「普通」に使えるのが利点になり得ます。
例えば
「仕事用と個人用」とか、
「同時に別々のアカウントでひとつのウェブサービスにログインしたい」とか。
リセットしたけりゃフォルダを空にすればいいし、
いらなくなったらショートカットとフォルダを消してスッキリ、という寸法です。

体調不良で会社を休むときの報告

朝起きて体調が悪いとき。
もしくはぶっちゃけ寝坊したけどそのまま休みたいので体調不良という設定にするとき。
ふつうの会社であれば連絡を入れて休みをもらう、という流れになると思います。

連絡方法は会社によりけりですね。
最初に勤めた会社では直属の上司に電話連絡、
前の会社や今の会社では全社ML宛にメール。
最初の会社や今の会社は有休扱いになるのでその後サイ○ウズ的なやつで有休申請。

唐突に「今日休みます」だけの内容もちょっとアレだなという感覚はあるので
「今日は体調不良で休みます」とするのにはそんなに抵抗はないんですが、
最初の会社と前の会社では症状の報告も求められました。

…何故?

頭痛か腹痛か聞いてどうするんですかね?
ノロやインフルエンザなどの「感染症かどうか」は大事だと思いますが、
病院でもないのに「症状」を聞く意味って??
プライベートな内容にも程があると思うんですけど…。

しかも一対一の電話報告内だけならともかく、
偉い人たち全員宛の有休申請とか全社宛のメールでって。
なんで自分の弱みを知らせて回らなきゃいけないんだって感じ。
あと極端な話「生理痛が重いので」とか全方位に言って回るの嫌じゃないですか。
(まあ実際問題としてはみんなせいぜい「腹痛」くらいにしか報告しないだろうけど、一定周期ごとに腹痛で休む人がいると結局「あっ…(察し)」ってなるよね)
つーか見る方としても朝から「嘔吐」「下痢」系のやつとか目にしたくないし。

前の会社を擁護するとすれば、当日の体調不良は有休ではなく欠勤扱いだったので、有休と違って理由を聞くこと自体はOKだと思います。全社宛に症状を報告というのがアレなだけで。

ということで最終的に、そういうデリカシーのない会社には何でもかんでも「頭痛」と報告するようになりました。
頭痛なら出勤しても仕事にならんし、言っても言われても不快には思いにくい症状だし、市販薬が効かないケースもまあまああるし、病院行っても原因が分からないことも多いし、プライバシー的にアレな部分にも踏み込まれにくいし。あと元々が頭痛持ちだし。

…という仮病みたいな対応策を取ることになる以上、やっぱり症状を詳しく聞く意味はないと思うんですけどねー。

パスを通す(環境変数の設定)

たまーに発生する作業ですが、毎回忘れて調べているのでメモ。

環境変数の設定画面を開く

左下の田をクリック後「環境変数」とか入力してやれば出てきます。
最近のWindowsはこういうところ便利で好き。

f:id:honey8823:20190607141904p:plain

「システムのプロパティ」が開いたら「環境変数」をクリック。

f:id:honey8823:20190607141906p:plain

設定を追加する

出てきたウインドウで「Path」を選んで「編集」。
さらに出てきたウインドウで「新規」をクリックすると入力欄が出てくるので、
そこに追加したいパスを入力すればOK。

f:id:honey8823:20190607141909p:plain

XAMPPを複数インストールして使い分ける

XAMPPを使ってローカルで環境構築する際、PHPのみダウングレードしたく
以前試した方法(最新のXAMPPに対しPHPのみ置き換える)でやってみたのですがうまくいかず…。

仕方ないので、今回は単純に古いXAMPPをインストールしました。
でも今後新しいPHPを使うこともあるかも、と思い試しにXAMPPを複数インストールしてみたら無事成功しました。

まず、古いXAMPPのインストーラはこちらからダウンロードできます。
sourceforge.net

インストール中、インストール先のディレクトリを選択するところがありますので
そこで任意の異なるディレクトリを指定するだけでOKです。
バージョン名を付けたディレクトリを用意すると分かりやすいと思います。

hostsファイルをすぐ開くバッチを作る

いや、もっとスマートな方法がありそうですけど。

以下内容のバッチファイルを作成して好きなところに置いておくと、あとはダブルクリックで開けます。

cd C:\WINDOWS\system32\drivers\etc
notepad hosts

「管理者として実行」じゃないとダメかな?と思ったら普通に開いても変更・保存できる…。なんでだろ。