今回はlaravelの基本知識を紹介します。
composerインストール
PHPインストール済みの状態で実行する。
php-mbstring
php-xml
インストール
mv composer.phar /usr/local/bin/composer
プロキシ設定
社内環境からプロキシを利用する場合、環境変数を設定する
環境変数
HTTP_PROXY_REQUEST_FULLURI=1
HTTPS_PROXY=http://proxy-host:proxy-port/
HTTPS_PROXY_REQUEST_FULLURI=0
リポジトリ変更
リポジトリを変更したい場合、以下のコマンドで変更できます。
laravelインストール
最新バージョン
バージョンを指定する
laravelディレクトリの構成
app | アプリケーションのコアとなるコードを含むディレクトリです。 |
bootstrap | フレームワークの初期化を行い、autoloadingを設定するファイルをおく。また、フレームワークが作り出すキャッシュファイルを貯めたりもする。 |
config | アプリケーションの設定ファイルをおくディレクトリ。 |
database | データベースのマイグレーションやシードをおくディレクトリ。 |
public | 全てのリクエストのエントリーポイント(最初に実行される)となるindex.php ファイルがあるところ。 ここには他に画像、JS、CSSといったものを置いたりする。 |
resources | コンパイル前のLESS、SASS、JS、viewといったものを置くところ。 |
routes | アプリケーションの全てのルートを定義するディレクトリ。 デフォルトでは web.php api.php console.php channels.php といったルートファイルを用意してある。 |
storage | Bladeテンプレートをコンパイルしたものやセッションのファイル、キャッシュファイル、その他フレームワークが作り出したファイルなんかが置かれる。 |
tests | PHPUnit みたいな自動テストを置くためのディレクトリ。 |
vendor | 依存ライブラリをおくところ。 |
laravel起動方法
artisapでアクセス
以下のコマンドで簡単なサーバを起動でき、アクセスできます。
apacheでアクセス
下記のファイルを変更し、ダウンロードしたlaravelのpublicディレクトリを指定する。
DocumentRoot “laravel/public”
AllowOverride all
laravelルート
ファイル「routes/web.php」はルート定義ファイルです。
ルート定義メソッド
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
複数ルート定義の場合
定義したメソッドでアクセスできる。
//
});
//
});
URLからパラメータ取得
必須パラメータ
});
任意パラメータ
});
フレームワーク以外の方法
$_GET(‘id’);
});
ルートのalias
})->name(‘home’);
利用の場合:
route(‘home’);
ルートのグループ
Route::get(‘login’,function() {
// /admin/loginのアクセスで実行できる
});
Route::get(‘logout’,function() {
// /admin/logoutのアクセスで実行できる
});
});
laravelのコントローラ
コントローラの保存パス
コントローラの作成コマンド
コントローラのルート
routes/web.phpを編集する。
※コントローラ名@メソッド名
ユーザ入力内容取得
Request
$request->input(‘name’); //指定した項目のデータを取得
$request->get(‘name’);//指定した項目のデータを取得
$request->only([‘name1′,’name2’]); // 指定した一覧のみ
$request->except([‘name1′,’name2’]); // 指定した一覧除外
$request->has(‘name’); //存在チェック
dd関数
dd関数では変数内容を取得し、終了する。デバッグの場合、使えます。
データベース接続
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
DBクラス
insert
DB::talbe(‘テーブル名’)->insert(2次元配列); 複数件データを登録
DB::talbe(‘テーブル名’)->insertGetId(1次元配列); 1件データを登録
update
DB::talbe(‘テーブル名’)->where(‘id’,’=’,1)->orWhere(‘id’,’=’,1)->orWhere(‘id’,’=’,1)->update([]);
DB::talbe(‘テーブル名’)->where(‘id’,’=’,1)->increment(‘カラム名’); // +1
DB::talbe(‘テーブル名’)->where(‘id’,’=’,1)->increment(‘カラム名’, 5); // +5
DB::talbe(‘テーブル名’)->where(‘id’,’=’,1)->decrement(‘カラム名’); // -1
DB::talbe(‘テーブル名’)->where(‘id’,’=’,1)->decrement(‘カラム名’, 5); // -5
select
全件取得
foreach($data as $value) {
var_dump($value->session_id);
}
指定した条件のデータ
一行のみ取得
指定したカラムのデータ取得
複数カラムのデータ取得
DB::table(‘テーブル名’)->select(‘カラム1 as sss’)->get();
db->select(DB::raw(‘カラム1,カラム2’)->get();
ソート
ページ分け
delete
DB::talbe(‘テーブル名’)->truncate();
SQL文実行
DB::select(“insert 文”);
DB::update(“update文”);
DB::delete(“delete文”);
DB::statement(“create table など”);
ビュー
ファイル名
ファイル名*.blade.php または*.php
例:「a.blade.php」と「a.php」は両方がある場合、a.blade.phpを採用される。
画面表示(データなし)
{
//
public function test() {
return view(‘a’);
}
}
画面表示(データあり)
view(‘ビュー名’)->with(配列);
view(‘ビュー名’)->with(配列)->with(‘キー’,’value’);
ビュー画面に利用
{{$変数名}}
compactのPHP関数
$ab = “sdef”;
$data = compact(‘aa’,’ab’); //配列を作成
ループ
//処理内容
@endforeach
class TestController extends Controller
{
//
public function test() {
$data = DB::select(“select * from session”);
$datas = compact(‘data’);
return view(‘test’)->with($datas);
}
}
view:
@foreach($data as $key =>$value)
{{$value->session_id}} <br>
@endforeach
if条件分岐
//処理内容
@elseif()
//処理内容
@else
//処理内容
@endif
@yield
parent.blade.php
<body>
<div><h1>header</h1></div>
<!– rewrite–>
@yield(‘body’)
<div><h1>footer</h1></div>
</body>
</html>
children.balde.php
@section(‘body’)
内容
@endsection
include
CSRF
form追加
===
{{csrf_field()}}
CSRF排除対象
ファイルapp/Http/Middleware/VerifyCsrfToken.php
//
’*’ //すべてCSRFチェックしない
‘ルート名’ //指定したルート名はCSRFチェックしない
];
Model
モデルの作成
モデルクラスにどのテーブルを使用するか明示的に指定しない限り、クラス名を複数形の「スネークケース」にしたものが、テーブル名として使用されます。モデル「User」に対して、テーブル「users」を使用します。
モデルのプロパティ
プロパティ「protected $table」はテーブル名を指定することができます。
プロパティ「protected $primaryKey」はキーはidではない場合、primary keyを指定することができます。
プロパティ「public $timestamps」はテーブルの「created at」、「updated_at」を更新する。更新したくない場合、falseを設定する。
プロパティ「protected $fillable」はテーブルを更新するとき、操作できるカラムの一覧。配列を指定する。
create,saveメソッドを利用するとき、使います。
プロパティ「protected $guarded」はテーブルを更新するとき、操作できないカラムの一覧。配列を指定する。
コントローラでモデルの使い方
②モデルをDBアクセスする方法
・モデル名::get();
モデルクラス名::get();
・モデルクラスをインスタンスする。
$model = new モデルクラス名();
$model->get();
データ登録(insert)
{
//
public function test() {
$model = new Session();
$model->session_id = ‘121212’;
$model->session_value = ‘22222’;
$model->session_time = ’11’;
$res = $model->save();
dump($res);
}
}
{
//
public function test(Request $request) {
$res = Session::create($request->all());
dump($res);
}
}
データ検索(select)
$info = Seesion::find(1111)->toArray(); // キーは4のデータを抽出する。データは配列
Session::all([‘name1′,’name2’]);
Session::get([‘name1′,’name2’]);
Session::where(‘age’,’>’,’29’)->get([‘name1′,’name2’]);
Session::where(‘age’,’>’,’29’)->select(‘name1′,’name2’)->get();
Session::where(‘age’,’>’,’29’)->select([‘name1′,’name2’])->get();
データ更新(update)
$session->session_value= $_POST[‘session_value’];
return $session->save()?’OK’:’fail’;
データ削除(delete)
return $session->delete();
バリデーション
コントローラ
// バリデーションチェック
$this->validate($request,[
‘name’=>’required|min:2|max:20’,
‘age’=>’required|integer|min:0|max:200’
]);
$res = Session::create($request->all());
}
ビュー画面
@if ($errors->any())
<div class=”alert alert-danger”>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
メッセージを日本語化
方法1
手動で、チェックのエラーメッセージを定義する。
// バリデーションチェック
$this->validate($request,[
‘name’=>’required|min:2|max:20’,
‘age’=>’required|integer|min:0|max:200’
],[
‘name.required’ => ‘ユーザ名は必須です。’,
‘name.min’ => ‘ユーザ名は2文字以上で入力してください。’
]);
$res = Session::create($request->all());
}
方法2
日本語の設定ファイルを利用する。デフォルトは英語のみがダウンロードされていますが、
サイト「Packagist」からlaravel-langを検索し、言語ファイルをダウンロードする。
ファイルアップロード
if ($request-> hasFile(‘filename’) && $request-> file(‘filename’)->isValid()){
$name=md5(time().rand(100000,999999).’.’.$request->file(‘filename’)->extension();
$request->file(‘filename’)->move(‘./statics/upload’,$name);
$path = ‘/statics/upload/’.$name;
}
$data = $request->except([‘_token’,’filename’]);
$data[‘filename’] = isset($path)??”;
$res = User::insert($data);
}
ページネーション(ページング)
{
public function test(Request $request) {
$data = Session::paginate(2);
return view(‘admin.test’, compact(‘data’));
}
}
view:
<tr>
<td>{{$val ->id}}</td>
<td>{{$val ->name}}</td>
</tr>
@endforeach
{{$data->links()}}
captcha
パッケージのインストール
config/app.phpにproviders,aliasを追加
設定ファイルを出力
php artisan vendor:publish
migration
ファイル作成
ファイルにテーブルの定義作成
{
Schema::create(‘tests’, function (Blueprint $table) {
$table->id();
$table->timestamps();
});
}
マイグレーション実行
テーブル作成
php artisan migrate:install // migrationsテーブルが作成される
テーブル削除
seed
シーダーファイル作成
データの流し込みなどの記述を追加
{
DB::table(‘paper’)->insert([
[‘paper_name’ => ‘test1’, ‘total_score’ => ‘100’],
[‘paper_name’ => ‘test2’, ‘total_score’ => ‘200’],
[‘paper_name’ => ‘test3’, ‘total_score’ => ‘300’]
]);
}
シーダー実行
レスポンス
ビューのレスポンス
return “hello world”; // booleanのデータはNG
jsonのレスポンス
リダイレクト
一部のみを紹介します。
return rediretc()->to(ルート);
return rediretc(ルート);
return redirect(‘test/index’, 301); //ステータスコードあり
Session
デフォルトはファイルにデータを保存してる。パス:「storage/framework/sessions」
Session::put(‘key’,’value’);
$value = Session::get(‘key’);
$value = Session::get(‘key’,’default’);
$value = Session::get(‘key’,function() { return ‘default’;});
Session::all();
Session::has(‘users’); //存在チェック
Session::forget(‘key’); //削除
Session::flush(); // 全部削除
viewに{{Session::get(‘code’)}}
キャッシュ
設定
パス:storage/framework/cache/data
Cache::add(‘key’,’value’); // key存在したら、NG
Cache::forever(‘key’,’value); //2286年まで有効
値取得
Cache::get(‘key’,’default’);
Cache::get(‘key’,function(){
return ‘default’;
});
Cache::has(‘key’);
// キャッシュ存在したら、キャッシュを利用する、期限切れたら、取得し、キャッシュする
Cache::remember(‘key’,$minutes, function(){
return data;
});
削除
Cache::forget(‘key’); // 全部削除。ディレクトリが残る。
Cache::flush(); // 全部削除ディレクトリが削除
複数テーブル結合
テーブル結合
DB::table(‘テーブル t1’)->leftjoin(‘テーブル t2’, ‘t1.id’, ‘=’,’t2.id’)->get();
DB::table(‘talbe t1’)->select(‘t1.id’,’t1.name’)->leftjoin(‘table t2′,’t1.id’,’=’,’t2.id’)->get();
モデル結合(一対一)
{
use HasFactory;
protected $table = ‘author’;
public $timestamps = false;
}
{
use HasFactory;
protected $table = ‘comment’;
public $timestamps = false;
}
{
use HasFactory;
protected $table = ‘keyword’;
public $timestamps = false;
}
{
use HasFactory;
protected $table = ‘session’;
public $timestamps = false;
public function rel_author()
{
return $this->hasOne(‘App\Model\Author’,’Author.key’,’Articel.key’);
}
}
$data = Article:all();
foreach($data as $key =>$value) {
echo $value->rel_author->colume_name; // rel_authorは関数名
}
モデル結合(1対多)
{
use HasFactory;
protected $table = ‘session’;
public $timestamps = false;
public function rel_author()
{
return $this->hasOne(‘App\Model\Author’,’Author.key’,’Articel.key’);
}
public function rel_comment()
{
return $this->hasMany(‘App\Model\Comment’,’Comment.key’,’Articel.key’);
}
}
$data = Article:all();
foreach($data as $key =>$value) {
echo $value->rel_author->colume_name; // rel_authorは関数名
foreach($value->rel_comment as $k => $v) {
echo $v->colume_name;
}
}
モデル結合(多対多)
多対多は二つ1対多ですね。
{
use HasFactory;
protected $table = ‘session’;
public $timestamps = false;
public function rel_author()
{
return $this->hasOne(‘App\Model\Author’,’Author.key’,’Articel.key’);
}
public function rel_comment()
{
return $this->hasMany(‘App\Model\Comment’,’Comment.key’,’Articel.key’);
}
public function rel_keyword()
{
return $this->belongsToMany(‘App\Model\Keyword’, ‘rel_table‘, ‘Keyword.key’,’Articel.key’);
}
}
$data = Article:all();
foreach($data as $key =>$value) {
echo $value->rel_author->colume_name; // rel_authorは関数名
foreach($value->rel_comment as $k => $v) {
echo $v->colume_name;
}
foreach($value->rel_keyword as $k => $v) {
echo $v->colume_name;
}
}