メモ > 技術 > フレームワーク: Laravel > 前提知識
前提知識
■Composer
PHPの依存性管理ツール
依存ライブラリ郡も含めて、まとめてインストールできる
また、composer.json に使っているライブラリが記録される(ファイルが無ければ作成される)
composer require 使いたいライブラリ
もしくは
composer.json に使いたいライブラリを記述して
composer install
とコマンドを実行するとインストールされる
この場合、自分で一つ一つ依存ライブラリをダウンロードする必要が無い。つまり環境の再現が容易にできる
ダウンロードしたファイルは vendor フォルダ内に格納される
PHP開発でComposerを使わないなんてありえない!基礎編 - Qiita
http://qiita.com/niisan-tokyo/items/8cccec88d45f38171c94
Laravel5のプロジェクトをGitで管理する - Qiita
https://qiita.com/zaburo/items/bc448a9fbf2d35194302
php - vendorディレクトリをGit管理下に置かないのは何故? - スタック・オーバーフロー
https://ja.stackoverflow.com/questions/23725/vendor%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%...
■オートローディング
名前空間に従って自動的にファイルを読み込む
require_once などで明示的にファイルを読み込む必要がない
Composerを使うことで簡単に導入できる
PHPでクラスをspl_autoload_registerを使ってオートロードする - バカンス駆動開発
http://egapool.hatenablog.com/entry/2013/11/17/195045
PHPのオートロード(autoload) - Qiita
http://qiita.com/atwata/items/5ba72d3d881a81227c2a
src/Refirio/Greeting/Hello.php
<?php
class Hello
{
function say()
{
echo 'Hello World!';
}
}
sample.php
<?php
require_once "src/Refirio/Greeting/Hello.php";
$hello = new Hello();
echo $hello->say();
↓オートロードに対応させる
composer.json
{
"autoload": {
"psr-4": {
"myapp\\": "src/"
}
}
}
Composerでインストール
composer install … composer.json に設定した内容に合わせて vender ディレクトリ内にプログラムが作られる
以下のようにしてオートロードを利用できる
src/Refirio/Greeting/Hello.php
<?php
namespace myapp\Refirio\Greeting;
class Hello
{
function say()
{
echo 'Hello World!';
}
}
sample.php
<?php
require_once "vendor/autoload.php";
$hello = new myapp\Refirio\Greeting\Hello();
echo $hello->say();
↓名前空間のエイリアスを作成
<?php
require_once "vendor/autoload.php";
use myapp\Refirio\Greeting\Hello;
//use myapp\Refirio\Greeting\Hello as Hello; // クラスに別名を指定する場合
$hello = new Hello();
echo $hello->say();
■デザインパターン
勉強メモ
http://refirio.org/memos/study/20161028_design_pattern/slide/
http://refirio.org/page/memo/design_pattern
■trait
限定的な多重継承を行う
PHP5.4 の新機能 trait のまとめと実際の利用例 | 株式会社インフィニットループ技術ブログ
https://www.infiniteloop.co.jp/blog/2014/08/php54-traits/
PHP5.4以降で導入されたトレイト(trait)というしくみ - ts0818のブログ
http://ts0818.hatenablog.com/entry/2015/10/15/183555
<?php
trait Facebook
{
function post($body)
{
echo 'Facebookに投稿しました:' . $body . "\n";
}
}
trait Twitter
{
function post($body)
{
echo 'Twitterに投稿しました:' . $body . "\n";
}
}
class Mailer
{
public function send($body)
{
echo 'Mailerで送信しました:' . $body . "\n";
}
}
class SendmailMailer extends Mailer
{
use Facebook;
/*
// 同名のメソッドがある場合
use Facebook, Twitter {
Facebook::post insteadof Twitter; // instead of ... 代わりに
Twitter::post as tweet; // as ... として
}
*/
public function send($body)
{
echo 'Sendmailで送信しました:' . $body . "\n";
}
public function getPath()
{
return '/usr/sbin/sendmail';
}
}
$mailer = new SendmailMailer();
$mailer->send('こんにちは!');
$mailer->post('こんにちは!');
//$mailer->tweet('こんにちは!');
■DI
DIとは?DIコンテナとは?試してみた(前編)[PHP][DI] - あざらし備忘録。
http://shiro-goma.hatenablog.com/entry/2014/06/22/102236
Dependency Injectionを特定のDIコンテナに頼らず実現する - Qiita
http://qiita.com/Hiraku/items/48fbdfca4b63c74494e9
DI・DIコンテナ、ちゃんと理解出来てる・・? - Qiita
http://qiita.com/ritukiii/items/de30b2d944109521298f
DIコンテナの本当の使いどころ | 技術トピックス | ウルシステムズ株式会社
https://www.ulsystems.co.jp/topics/025
DI (依存性注入) って何のためにするのかわからない人向けに頑張って説明してみる - Qiita
https://qiita.com/okazuki/items/a0f2fb0a63ca88340ff6
DIコンテナのテスト以外での利点について - Qiita
https://qiita.com/crexista/items/606976d941728a90b42b
勉強メモ
http://refirio.org/page/memo/di
■リフレクション
クラスに関する情報を参照したり、変更したりすることができる
PHPでリフレクション : アシアルブログ
http://blog.asial.co.jp/751
パラメータとしてタイプヒントされたクラスを取得
http://php.net/manual/ja/reflectionparameter.getclass.php
タイプヒントからクラスを取得する例
class Message {
}
class Hello
{
function say(Message $message) {
}
}
$reflection = new ReflectionClass('Hello');
$parameters = $reflection->getMethod('say')->getParameters();
echo $parameters[0]->getClass()->getName(); // 「Message」と表示される
■ドメイン駆動設計
厳密にドメイン駆動設計に沿っているわけでは無いようだが、知っておくと理解が進みそう
ドメイン駆動設計
http://qiita.com/haazime/items/6119097071149a362f7f
Domain駆動開発入門 | キャスレーコンサルティング 技術ブログ
http://www.casleyconsulting.co.jp/blog-engineer/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%...
おい!なんでその処理をコントローラに書いているんだい?
https://zenn.dev/marty_ojiya/articles/ada4528d2b619c
■Mockery
作成前のクラスを、すでに存在するかのようにテストできる
例えば
<?php
class SampleExecuter
{
public function doSomething($checkType, $param)
{
$factory = new CheckerFactory($checkType);
$checker = $factory->create();
if ($checker->checkSomething($param)) {
return 'trueが返ったよ';
} else {
return 'falseが返ったよ';
}
}
}
このような SampleExecuter があった場合、このテストは CheckerFactory が完成するまで行うことができない
が、モックとなる CheckerFactory を作り、テストできるようにする
MockeryとPHPUnitを使う(最低限) - Qiita
https://qiita.com/zaburo/items/b559782179565bb1c538
Mockery 0.8.0 日本語ドキュメント
https://kore1server.com/202/Mockery+0.8.0+%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%89%E3%82%AD%E3%83%A5%E3%...
「Mockery」を使ってサクッとPHPのテストを書いてみる | アライドアーキテクツ エンジニアブログ
http://tech.aainc.co.jp/archives/3918
composerでインストール
(「--dev」をつけると通常の「composer install」ではインストールされないものにできる。「composer install --dev」とする。)
cd C:\localhost\home\test\public_html\mockery
composer require --dev phpunit/phpunit
composer require --dev mockery/mockery
tests\test1.php を作成して以下を入力
<?php
require_once 'vendor/autoload.php';
class SampleTest1 extends PHPUnit_Framework_TestCase
{
public function testSample1()
{
//Mockを設定
$m = \Mockery::mock('Hoge');
$m->shouldReceive('Hello')
->with('foo')
->andReturn("Hello foo");
//Helloメソッドを実行
$m->Hello('foo');
$this->assertEquals("Hello foo", $m->Hello('foo'));
}
}
以下のコマンドでテストを実行
vendor\bin\phpunit tests/test1.php
PHPUnit 5.7.22 by Sebastian Bergmann and contributors.
. 1 / 1 (100%)
Time: 85 ms, Memory: 3.25MB
OK (1 test, 1 assertion)