Laravel DBクラス
Controller
namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; class DatabaseController extends Controller { public function index(Request $request){ if(isset($request->id)){ //パラメーター結合(配列を用意しプレースホルダーを利用) $param = ['id' => $request->id]; $items = DB::select('SELECT * FROM people WHERE id = :id',$param); }else{ //SQLクエリを発行し、結果セットを取得 $items = DB::select('select * from people'); } return view('hello.database',['items' => $items]); } }
artisanコマンド利用例
$ vagrant ssh $ cd /cd/appname $ artisan --version
@コントローラの作成
artisan make:controller HelloController
└>/app/Controller/HelloController.php
※CRUD処理一式をセットにする--リソースとして登録
artisan make:controller HelloController --resource
public function index(Request $request){ return view('hello.index'); }
ビュー作成
/resouces/views/hello/index.blade.php
@extends('layouts.helloapp') @section('title','Index') @section('menubar') @parent インデックスページ @endsection @section('content') <p>本文</p> @endsection @section('footer') copryright 2018 @endsection
ルーティング
Route::post('/hello','HelloController@index');
resource
Route::resource('rest','RestappController');
//=============================
// @サービスプロバイダ作成
//=============================
artisan make:provider HelloServiceProvider
└>/app/Providers/HelloServiceProvider.php
//=============================
// @ミドルウェア作成
//=============================
artisan make:middleware HelloMiddleware
- >app/Http/Middlewares/HelloMiddleware.php
//=============================
// @フォームリクエスト作成
//=============================
artisan make:request HelloRequest
└>app/Http/Requests/HelloRequest.php
//=============================
// @マイグレーション
//=============================
artisan make:migration create_people_table
└>app/database/migration/XXXX_create_people_table.php
public function up() { Schema::create('people', function (Blueprint $table) { //プライマリキー $table->increments('id'); //文字型 $table->string('name'); $table->string('mail'); $table->integer('age'); $table->timestamps(); }); }
実行
artisan migrate
ex)
データベース:マイグレーション 5.5 Laravel
//シーディング(あらかじめ用意しておくレコード)
artisan make:seeder PeopleTableSeeder
└>app/Http/database/seeds/PeopleTableSeeder.php
$param =[ 'name' => 'taro', 'mail' => 'taro@yamada.jp', 'age' => 12 ]; DB::table('people')->insert($param);
■シーダーファイル登録
app/Http/database/seeds/DatabaseSeeder.php
public function run() { $this->call(PeopleTableSeeder::class); }
■シーディング実行
artisan db:seed
//初期化して実行
artisan migrate:refresh --seed
//=============================
// @Session用マイグレーション
//=============================
artisan session:table
//=============================
// @Eloquent(ORM)
//=============================
■モデル作成
artisan make:model Person
- >app/Persone.php
namespace App; use Illuminate\Database\Eloquent\Model; class Person extends Model { // }
■コントローラー作成
artisan make:controller PersonController
└>/app/Controller/PersonController.php
//Personモデルの全件を取得 $items = Person::all(); return view('person.index',['items'=>$items]);
-
- ID検索
$item = Person::find($request->input);
//=============================
// @ユーザー認証
//=============================
artisan make:auth
//=============================
// @ユニットテストスクリプト作成
//=============================
artisan make:test HelloTest
└>/tests/Feature/HelloTest.php
//=============================
artisan コマンド
//=============================
make:auth
make:channel
make:command
make:controller
make:event
make:exception
make:factory
make:job
make:listener
make:mail
make:middleware
make:migration
make:model
make:notification
make:observer
make:policy
make:provider
make:request
make:resource
make:rule
make:seeder
make:test
staticメソッド・変数
1)インスタンスを作らなくても呼び出せる(new しなくても呼び出せる)
2)複数のところから呼ばれた場合は全ておなじ場所(メモリ)が参照されることになるので、ある所で変数の値を変更されたら他に参照しているところ全てに影響が出る
【用途】
・共通関数を定義する場合
・共通定数を定義する場合
・複数クラス間で共通の値を共有したい場合
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
public class StaticSample {
//staticメンバ変数
public static String val = "hoge";
//staticメソッド
public static int add(int a, int b){
return a + b;
}
}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
int b = StaticSample.add(10, 20);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Interfaceとは
インターフェースは「このクラスは、○×△メソッド(≒関数)を持ちます!」という「約束」
・インターフェースによるメソッドの実装強制という約束をすること
・インターフェースの役割は「ふるまい」の共通化。コードの再利用ではない
例)動画再生インターフェイス
Interface videoplayer{
//動画を再生するメソッド
public void play();
//動画を停止するメソッド
public void stop();
}
//h264再生クラス
class h264player implements videoplayer{
//動画を再生するメソッド
public void play(){
}
//動画を停止するメソッド
public void stop(){
}
}
//Mainクラス
class Main
{
public static void main(String[] args)
{
h264player player = new h264player ();
player.play();
}
}
設計モデルの作り方
1)依存性、複雑さ、責任の分割に注意し設計を行う
2)メトリックスやデザイン・レビューを行い、問題点や改良点を洗い出す
メトリックスの基本的な考え方
それぞれのクラスが正しく責任を分担しているか?
個々のクラスが複雑過ぎる構成になっていないか?
それぞれのクラスの関連が複雑になっていないか?
3)その結果を基にリファクタリングを実行し、モデルを推敲する
リファクタリングを必要とするコードから感じられる雰囲気
http://objectclub.jp/technicaldoc/refactoring/refact-smell
4)メトリックスやデザイン・レビューを行い、問題点が解消していることを確認する
デザインパターンの基本
はじめに
1)オブジェクト指向とは
1-1)「オブジェクト」を「クラス」から作り、「オブジェクト」同士を相互作用させる
例)
- 自動販売機クラスに、「お金が入れられると、ジュースを出す」というメソッドを持たせ、自動販売機A(object)を作る。
- 人間クラスに、「お金を支払う」というメソッドを持たせ、人間A(Object)を作る。
- 人間A(object)が自動販売機A(object)でジュースを買う。
→人間Aクラス:お金を払う処理
→自動販売機クラス:お金を受け取りジュースを出す処理
1-2)メリットとして「クラス単位で再利用性」が向上する
- 再利用性が向上する→生産性・コードの信頼性が上がる
- 再利用性を向上させるために、「再利用性の高いクラス設計」をする必要がある
2)デザインパターンとは
オブジェクト指向で開発を行なう際に、再利用性の高い設計をするための考え方
3)デザインパターンの利用
記載中
振る舞いに関するパターン
Iteratorパターン
for (int i = 0; i < array.length; i++) { System.out.println(array[i]); }
上記処理で使用されているループ変数iの役割をパターン化したものが、「Iterator パターン」。つまり、「Iterator パターン」とは、ある集合体の要素1つ1つに、順次アクセスする方法を提供するパターン。
【利用するべきパターン】
- アプリケーション固有なデータ、構造を持ったオブジェクトにアクセスをする場合
- 配列やコレクションなどの集合する要素にアクセスする場合
- (配列はforループで回せるが、リストなどのコレクションは難しかったりする)
- 集合の要素に順次にアクセスする必要がある場合
【目的】
集合体を作成するクラスに変更があった場合も、利用する側は、変更しなくて済む
構造に関するパターン
Adapter パターン(Wrapperパターン)
※既存のクラスメソッドの再利用
dapterパターンは、インタフェースに互換性の無いクラス同士を組み合わせることを目的としたパターン。
2つのメソッドのインタフェースの違いを吸収してやる Adapter を準備することで、少ない変更で新しいメソッドに乗り換えることができる
・ Adapter パターン、2つの方法。
1)継承を利用した方法
=>interface
2)委譲を利用した方法
=>abstract class
Bridge パターン
1)「機能追加」
(スーパークラスが持っていない機能をサブクラスで追加)を目的としたもの
2)「機能実装」
(スーパークラスで定義したインタフェースをサブクラスで実装)を目的としたもの