- 投稿日:2020-04-30T21:33:12+09:00
Laravelのルーティング基本
web.php
routes\web.php
ルーティングに関する情報の記載。記入内容
・アドレス指定
・コントローラを指定
・コントローラのメソッドを指定コントローラ
Http\Controllers\コントローラ名
php artisan make::controller コントローラ名で作成する。
作成されたコントローラは、Http\Controllers\コントローラ名 に作成される。useでrequrestやresponseやフォームリクエスト等のクラスをインポートし、メソッドの引数で読み込むことで利用可能にする。
return view('テンプレートフォルダ名', 渡す値);この第1引数に読み込むテンプレートフォルダ名を記入。helloフォルダのindexファイルの場合は、hello.indexと記入する。
第2引数の値は、配列。この値をテンプレートに渡す。Bladeテンプレート
resourdes\views\フォルダ名.blade.php
{{$変数名}}で、コントローラ等から渡された値を表示できる。
- 投稿日:2020-04-30T21:07:30+09:00
[WIP] ヘルパ DI クラス一覧
以下は全ヘルパと実際のクラスまたは代替の一覧です。
配列とオブジェクト
helper class method Arr::* Illuminate\Support\Arr * data_fill Illuminate\Support\Arr add ※1 data_get Illuminate\Support\Arr get ※1 data_set Illuminate\Support\Arr set ※1 head Illuminate\Support\Arr first ※1 last Illuminate\Support\Arr end ※1 ※1 代替。同じではない。
パス
helper class method app_path Illuminate\Foundation\Application path base_path Illuminate\Foundation\Application basePath config_path Illuminate\Foundation\Application configPath database_path Illuminate\Foundation\Application databasePath mix Illuminate\Foundation\Mix そのまま呼ぶ(__invoke) public_path Illuminate\Foundation\Application publicPath resource_path Illuminate\Foundation\Application resourcePath storage_path Illuminate\Foundation\Application storagePath 文字列
helper class method __ Illuminate\Translation\Translator get class_basename e preg_replace_array Str::* Illuminate\Support\Str * trans(引数なし) Illuminate\Translation\Translator trans(引数あり) Illuminate\Translation\Translator get trans_choice Illuminate\Translation\Translator choice URL
helper class method action Illuminate\Routing\UrlGenerator action asset Illuminate\Routing\UrlGenerator asset route Illuminate\Routing\UrlGenerator route secure_asset Illuminate\Routing\UrlGenerator asset(第2引数に true を指定) secure_url Illuminate\Routing\UrlGenerator to(第3引数に true を指定) url(引数なし) Illuminate\Routing\UrlGenerator url(引数あり) Illuminate\Routing\UrlGenerator to その他
helper class method abort Illuminate\Foundation\Application abort abort_if Illuminate\Foundation\Application abort と if 文など abort_unless Illuminate\Foundation\Application abort と if 文など app(引数なし) Illuminate\Foundation\Application app(引数あり) Illuminate\Foundation\Application make auth(引数なし) Illuminate\Auth\AuthManager auth(引数あり) Illuminate\Auth\AuthManager guard back Illuminate\Routing\Redirector back bcrypt Illuminate\Contracts\Hashing\Hasher driver('bcrypt')->make blank broadcast Illuminate\Contracts\Broadcasting\Factory event cache(引数なし) Illuminate\Cache\CacheManager cache(引数あり) Illuminate\Cache\CacheManager get または put class_uses_recursive collect Illuminate\Support\Collection make config(引数なし) Illuminate\Config\Repository config(引数あり) Illuminate\Config\Repository get または set cookie(引数なし) Illuminate\Contracts\Cookie\Factory cookie(引数あり) Illuminate\Contracts\Cookie\Factory make csrf_field csrf_token Illuminate\Session\SessionManager token dd decrypt Illuminate\Encryption\Encrypter decrypt dispatch dispatch_now Illuminate\Contracts\Bus\Dispatcher dispatchNow dump encrypt Illuminate\Encryption\Encrypter encrypt env Illuminate\Support\Env get event Illuminate\Events\Dispatcher dispatch factory Illuminate\Database\Eloquent\Factory of filled info Illuminate\Log\LogManager info logger(引数なし) Illuminate\Log\LogManager logger(引数あり) Illuminate\Log\LogManager debug method_field now Illuminate\Support\DateFactory now old Illuminate\Http\Request old optional policy Illuminate\Contracts\Auth\Access\Gate getPolicyFor redirect(引数なし) Illuminate\Routing\Redirector redirect(引数あり) Illuminate\Routing\Redirector to report Illuminate\Contracts\Debug\ExceptionHandler report request(引数なし) Illuminate\Http\Request request(引数あり) Illuminate\Http\Request only またはプロパティアクセス (__get) rescue resolve Illuminate\Foundation\Application make response(引数なし) Illuminate\Contracts\Routing\ResponseFactory response(引数あり) Illuminate\Contracts\Routing\ResponseFactory make retry session(引数なし) Illuminate\Session\SessionManager session(引数あり) Illuminate\Session\SessionManager get または put tap throw_if throw_unless today Illuminate\Support\DateFactory today trait_uses_recursive transform validator(引数なし) Illuminate\Contracts\Validation\Factory validator(引数あり) Illuminate\Contracts\Validation\Factory make value view(引数なし) Illuminate\Contracts\View\Factory view(引数あり) Illuminate\Contracts\View\Factory make with
- 投稿日:2020-04-30T21:00:59+09:00
laravelで、LoginController.phpがない
php artisan make:model auth
を実行し、成功したのに、ディレクトリ app/Http/Auth の中に、LoginController.phpのファイルがありません。
ctrl+Hを押下しましたが、表示されません。
なぜでしょうか。
- 投稿日:2020-04-30T20:41:38+09:00
Laravelでビュー描画前処理を行う
Laravelのビュー描画前処理
Laravelのビュー描画前処理について書いていきます
Laravelではビューが描画される時に呼び出される処理を作成しておくことができます前提条件
下記前回記事の続きです
Laravelのレイアウトエンジンを使う
本記事は上記が完了している前提で書かれています
上記記事で使用したプロジェクトを引き続き使用していきますControllerにメソッド追加
(1) /sample/app/Http/Controllers/SampleController.phpにviewComposeメソッドを追記
public function viewCompose()
{
$data = ['key' => 123456789.123456];
return view('sample.viewCompose', $data);
}
(2) /sample/routes/web.phpに下記を追記
Route::get('sample/view-compose', 'SampleController@viewCompose');viewの作成
/sample/resources/views/sample/viewCompose.blade.phpファイル作成
viewCompose.blade.php<html> <head> <title>sample</title> </head> <body> {{$key}} </body> </html>描画前処理の作成
(1) /sample/app/Http/ViewComposersフォルダ作成
(2) /sample/app/Http/ViewComposers/SampleComposer.phpファイル作成SampleComposer.php<?php namespace App\Http\ViewComposers; use Illuminate\View\View; class SampleComposer { public function compose(View $view) { $view->with('key', number_format($view->getData()['key'], 2, '.', ',')); } }描画前処理が呼び出されるように登録する
(1) /sample/app/Providers/ViewComposerServiceProvider.phpファイル作成
ViewComposerServiceProvider.php<?php namespace App\Providers; use Illuminate\Support\Facades\View; use Illuminate\Support\ServiceProvider; class ViewComposerServiceProvider extends ServiceProvider{ public function boot() { View::composer( 'sample.viewCompose', 'App\Http\ViewComposers\SampleComposer' ); } public function register() { } }(2) /sample/config/app.php内のproviders配列に下記を追記
ViewComposerServiceProvider.php‥‥ 'providers' => [ ‥‥ App\Providers\ViewComposerServiceProvider::class, ], ‥‥これでレンダリングの際に
ViewComposerServiceProvider#boot→View::composer→SampleComposer#compose
が実行されます動作確認
http://localhost/laravelSample/sample/view-compose実行結果
123,456,789.12
- 投稿日:2020-04-30T20:22:47+09:00
ブラックボックスの罠 Guzzlehttpで解決しなかった文字化けが、cURLにしたらサクッと解決した
はじめに
APIを使う側の場合、サンプルコードなどがあれば、まずはそれに忠実な操作、処理をして疎通を確認する。
ライブラリは便利だが、ブラックボックスになる面もあるのでトラブルの原因把握や問題解決から遠くなる危険がある。
ソースが公開されているのなら、それを辿るがよろし。何が起こったか?
某決済業者のAPIを使い銀行振込用のバーチャル口座のリクエストを送った時に、全角文字が含まれているとその部分だけ文字化けが発生した。
なお、クレジットカード払いなどの別手段では発生しなかった。参考:当方サーバ側環境
- PHP7.X系
- Laravel5.X系
- guzzlehttp6.5.2
- システム内のデフォルトの文字コードはUTF-8
PHPやLaravelそのものは関係なくて、guzzleの中の問題(断言)
問題調査で発生したこと
途方に暮れる
文字コードをSJISに変換する必要がある
→変換しても、文字化けた後の内容が変わっただけで根本的な解決にはならなかった。リクエストを送るときのContent-Typeが問題
→ Postmanなどの、API送信ツールを使ったが、文字化けしていた。そのほか、URLエンコードした値を送信など様々な事を試みたがダメだった。
なお、業者がサンプルで提供している(本案件では採用しない)決済モジュールを動かしてみたら無事文字化けしなかった。
cURLで実装してみたら、問題なく送信できた!
決済モジュールのコードを辿ってみたら、全角文字列はSJISに変換する。
curl_setoptで、様々な設定をしたのちリクエストを送信。結局、いかにもありそうなcURLのサンプルコードを書いて動かしたら成功した。
cURLでリクエストを送る//前提:こんな感じのリクエスト値が存在する(実運用時には、他のメソッドで加工するケースが多いと思います) $params = [ 'access_code' => 'unique_access_code', 'price' => '3980', 'customer_name' => mb_convert_encoding('バカ殿様','SJIS','UTF-8') ]; //POSTする値を $post_fields = http_build_query($params); // APIのリクエスト先URL。各自の環境に置き換えて考えてください $request_url = "https://example.com/path/to/api/receiver"; //まず、オブジェクトを作る $curl = curl_init(); //リクエスト形式、戻り値の存在、リクエスト先などを設定する。 //URLは適宜考えてください curl_setopt($curl,CURLOPT_URL,$request_url); curl_setopt($curl,CURLOPT_POST,true); curl_setopt($curl,CURLOPT_RETURNNUMBER,true); //リクエスト先の仕様にそろえて、URLエンコード済の値をセットする curl_setopt($curl,CURLOPT_POSTFIELDS,$post_fields); //ここから下、cURLのリクエスト送信とレスポンス $response = curl_exec( $curl ); $curlinfo = curl_getinfo( $curl ); curl_close( $curl );顧客名は、時事ネタです(合掌)
犯人は(たぶん)お前だ!
guzzlehttp/guzzle/src/Client.php
applyOptionsメソッド内にてhttp_build_queryを使っていたが
ここでクエリを編集する部分に問題があるようだ。guzzlehttp/guzzle/src/Client.php// if (isset($options['query'])) { $value = $options['query']; if (is_array($value)) { $value = http_build_query($value, null, '&', PHP_QUERY_RFC3986);//この行に問題あり } if (!is_string($value)) { throw new \InvalidArgumentException('query must be a string or array'); } $modify['query'] = $value; unset($options['query']); }PHPリファレンスのhttp_build_queryのページによれば 4つ目の引数enc_typeは
デフォルトでは
PHP_QUERY_RFC1738つまり、RFC1738 に従ってエンコードされる。でよかったにも関わらず 上記ソースの抜粋のようにPHP_QUERY_RFC3986でエンコードされていた…これが原因のようだ。参考
PHP:http_build_query
- 投稿日:2020-04-30T19:43:56+09:00
Laravelのレイアウトエンジンを使う
Laravelのレイアウト処理
Laravelのレイアウト処理について書いていきます
viewsフォルダ配下に作成したblade.phpファイルを組み合わせて1つのビューとして処理をするものです前提条件
下記前回記事の続きです
Laravelのテンプレートエンジンを使う
本記事は上記が完了している前提で書かれています
上記記事で使用したプロジェクトを引き続き使用していきますControllerにメソッド追加
(1) /sample/app/Http/Controllers/SampleController.phpにchildメソッドを追記
public function child()
{
$data = ['msgList' => ["msg1", "msg2"]];
return view('sample.child', $data);
}
(2) /sample/routes/web.phpに下記を追記
Route::get('sample/child', 'SampleController@child');viewの作成
(1) /sample/resources/views/layoutフォルダ作成
(2) /sample/resources/views/layout/parent.blade.phpファイル作成parent.blade.php<html> <head> <title>@yield('title')</title> </head> <body> <ul> @section('menu') <li>共通メニュー1</li> <li>共通メニュー2</li> @show </ul> <div> @yield('content') </div> </body> </html>(3) /sample/resources/views/componentフォルダ作成
(4) /sample/resources/views/component/msgList.blade.phpファイル作成msgList.blade.php<div>{{ $msgTitle }}</div> @foreach ($msgList as $msg) <div>{{ $msg }}</div> @endforeach {{ $addMsg }}(5) /sample/resources/views/sample/child.blade.phpファイル作成
child.blade.php{{-- resources/views/layout/parent.blade.phpを使うのでlayout.parentにする --}} @extends('layout.parent') {{-- parent.blade.phpの@yield('title')を置換する --}} @section('title', 'Sample@tpl') {{-- parent.blade.phpの@section('menu')から@showまでを置換する --}} @section('menu') {{-- parent.blade.phpの@section('menu')から@showまでを描画する --}} @parent {{-- child.blade.php独自のメニューを描画する --}} <li>独自メニュー1</li> <li>独自メニュー2</li> @endsection {{-- parent.blade.phpの@yield('content')を置換する --}} @section('content') <p>child.blade.phpのコンテンツ</p> {{-- resources/views/component/msgList.blade.phpを描画する --}} @component('component.msgList', ['msgTitle' => 'コンポーネントタイトル', 'msgList' => $msgList]) @slot('addMsg') <div>addMsg1</div> <div>addMsg2</div> @endslot @endcomponent {{-- resources/views/component/msgList.blade.phpを描画する --}} @include('component.msgList', ['msgTitle' => 'インクルードタイトル', 'msgList' => $msgList, 'addMsg' => '<div>addMsg1</div><div>addMsg2</div>']) @endsection動作確認
http://localhost/laravelSample/sample/tpl実行結果
● 共通メニュー1 ● 共通メニュー2 ● 独自メニュー1 ● 独自メニュー2 child.blade.phpのコンテンツ コンポーネントタイトル msg1 msg2 addMsg1 addMsg2 インクルードタイトル msg1 msg2 <div>addMsg1</div><div>addMsg2</div>
- 投稿日:2020-04-30T19:16:18+09:00
Laravelのテンプレートエンジンを使う
Laravelの描画処理
Laravelの描画処理を行うbladeテンプレートエンジンの使い方を書いていきます
@と様々な予約語を組み合わせることでいろいろな描画処理をすることができます前提条件
下記前回記事の続きです
eclipseでLaravel開発環境を構築する。デバッグでブレークポイントをつけて止める。(WindowsもVagrantもdockerも)
本記事は上記が完了している前提で書かれています
プロジェクトの作成もapacheの設定も上記で行っていますControllerにメソッド追加
/sample/app/Http/Controllers/SampleController.phpにtplメソッドを追記
public function tpl()
{
$data = ['val' => 2,
'parentList' => ['key1' => 1],
'list' => ['key1' => 1, 'key2' => 2, 'key3' => 3],
'emptyList' => []
];
return view('sample.tpl', $data);
}
/sample/routes/web.phpに下記を追記
Route::get('sample/tpl', 'SampleController@tpl');viewの作成
- /sample/resources/views/sample/tpl.blade.phpファイル作成
tpl.blade.php<html> <head> <title>sample</title> </head> <body> {{-- コメント --}} {{-- {!! !!}はエスケープしないデータの表示 --}} <div>[{!! '@php' !!}]</div> @php $tplVal = 10; echo '<div>' . $tplVal . '</div>'; @endphp <br> <div>[echo]</div> <div>{{ $val }}</div> <br> <div>[if]</div> @if ($val === 1) <div>1</div> @elseif ($val === 2) <div>2</div> @else <div>else</div> @endif <br> <div>[switch]</div> @switch($val) @case(1) <div>1</div> @break @case(2) <div>2</div> @break @default <div>default</div> @endswitch <br> <div>[unless]</div> @unless (true) <div>true</div> @else <div>false</div> @endunless <br> <div>[isset]</div> @isset($list['key1']) <div>isset true</div> @else <div>isset false</div> @endisset <br> <div>[empty]</div> @empty($list['key1']) <div>empty true</div> @else <div>empty false</div> @endempty <br> <div>[for]</div> @for ($i = 0; $i < 10; $i++) @if ($i == 1) @continue @endif <div>{{ $i }}</div> @if ($i >= 3) @break @endif @endfor <br> <div>[foreach]</div> @foreach ($list as $listKey => $listVal) @if ($listVal == 1) @continue @endif <div>{{ $listKey }}:{{ $listVal }}</div> @if ($listVal >= 3) @break @endif @endforeach <br> <div>[forelse]</div> @forelse ($emptyList as $listKey => $listVal) <div>{{ $listKey }}:{{ $listVal }}</div> @empty <div>空っぽのリストです</div> @endforelse <br> <div>[while]</div> @php $whileIndex = 0; @endphp @while ($whileIndex <= 3) <div>{{ $whileIndex }}</div> @php $whileIndex++; @endphp @endwhile <br> <div>[$loop]</div> @foreach ($parentList as $parentListKey => $parentListVal) <div>parent:{{ $parentListKey }}:{{ $parentListVal }}</div> @foreach ($list as $listKey => $listVal) <div>child:{{ $listKey }}:{{ $listVal }}</div> <div>$loop->index: {{ $loop->index }}</div> <div>$loop->iteration:{{ $loop->iteration }}</div> <div>$loop->remaining:{{ $loop->remaining }}</div> <div>$loop->count: {{ $loop->count }}</div> <div>$loop->first: {{ $loop->first }}</div> <div>$loop->last: {{ $loop->last }}</div> <div>$loop->even: {{ $loop->even }}</div> <div>$loop->odd: {{ $loop->odd }}</div> <div>$loop->depth: {{ $loop->depth }}</div> <div>$loop->parent->index: {{ $loop->parent->index }}</div> <div>$loop->parent->iteration:{{ $loop->parent->iteration }}</div> <div>$loop->parent->remaining:{{ $loop->parent->remaining }}</div> <div>$loop->parent->count: {{ $loop->parent->count }}</div> <div>$loop->parent->first: {{ $loop->parent->first }}</div> <div>$loop->parent->last: {{ $loop->parent->last }}</div> <div>$loop->parent->even: {{ $loop->parent->even }}</div> <div>$loop->parent->odd: {{ $loop->parent->odd }}</div> <div>$loop->parent->depth: {{ $loop->parent->depth }}</div> @if ($listVal >= 2) @break @endif @endforeach @endforeach <br> </body> </html>動作確認
http://localhost/laravelSample/sample/tpl実行結果
[@php] 10 [echo] 2 [if] 2 [switch] 2 [unless] false [isset] isset true [empty] empty false [for] 0 2 3 [foreach] key2:2 key3:3 [forelse] 空っぽのリストです [while] 0 1 2 3 [$loop] parent:key1:1 child:key1:1 $loop->index: 0 $loop->iteration:1 $loop->remaining:2 $loop->count: 3 $loop->first: 1 $loop->last: $loop->even: $loop->odd: 1 $loop->depth: 2 $loop->parent->index: 0 $loop->parent->iteration:1 $loop->parent->remaining:0 $loop->parent->count: 1 $loop->parent->first: 1 $loop->parent->last: 1 $loop->parent->even: $loop->parent->odd: 1 $loop->parent->depth: 1 child:key2:2 $loop->index: 1 $loop->iteration:2 $loop->remaining:1 $loop->count: 3 $loop->first: $loop->last: $loop->even: 1 $loop->odd: $loop->depth: 2 $loop->parent->index: 0 $loop->parent->iteration:1 $loop->parent->remaining:0 $loop->parent->count: 1 $loop->parent->first: 1 $loop->parent->last: 1 $loop->parent->even: $loop->parent->odd: 1 $loop->parent->depth: 1
- 投稿日:2020-04-30T18:33:24+09:00
Laravel Dump Server インストールエラー Argument 1 passed to Symfony\Component\VarDumper\Server\Connection::__construct() must be of the type string
https://github.com/beyondcode/laravel-dump-server Laravel Dump Serverのライブラリをインストールしようとしたところ謎のエラーが発生してしまいました。
環境
- PHP 7.4.5
- Laravel 7.5.1
- Laravel Dump Server 2.7.0
問題
$ composer require --dev beyondcode/laravel-dump-server Using version ^1.4 for beyondcode/laravel-dump-server ./composer.json has been updated Loading composer repositories with package information Updating dependencies (including require-dev) Nothing to install or update Package zendframework/zend-code is abandoned, you should avoid using it. Use laminas/laminas-code instead. Package zendframework/zend-eventmanager is abandoned, you should avoid using it. Use laminas/laminas-eventmanager instead. Generating optimized autoload files > Illuminate\Foundation\ComposerScripts::postAutoloadDump > @php artisan package:discover --ansi In Connection.php line 32: Argument 1 passed to Symfony\Component\VarDumper\Server\Connection::__const ruct() must be of the type string, null given, called in /work/backend/vend or/beyondcode/laravel-dump-server/src/DumpServerServiceProvider.php on line 49 Script @php artisan package:discover --ansi handling the post-autoload-dump event returned with error code 1 Installation failed, reverting ./composer.json to its original content.インストールに失敗してちょっとビビリました。
対策
https://github.com/beyondcode/laravel-dump-server/issues/48
こちらのイシューを見たところ、キャッシュが悪さしてるようです。
$ rm bootstrap/cache/config.phpキャッシュファイルを削除して、再度インストールしなおせばokです。
$ composer require --dev beyondcode/laravel-dump-server
- 投稿日:2020-04-30T15:59:26+09:00
MVCってなんやねん
初めに
ちょっと前に書いたんだけど、簡単にしか書いてなかったので復習程度に綴っときます。
自分なりの理解の仕方なので、間違えてたりしたらすいません。MVCモデルとは?
Model,View,Controllerのの頭文字
機能ごとに分けて、役割だったり内容をわかりやすくする考え方。MVC、それぞれ何の役割なの?
Model
ビジネスロジックを担当します。
- データの検索
- データの変換
- データの検証
- データの関連
Controllerから受け取った処理に基づいて、必要なデータをDBで参照します。
そして、そこから取得したデータをControllerへ渡します。
ただModel = Databaseではありません。
あくまでもModelは基本的に上記5つの処理担当です。View
表示、入力に関する処理担当
- リクエストを取得する
- リクエストをControllerへ渡す
- Controllerから受け取ったデータをHTMLなどで出力する
Controller
ここが一番ややこしい担当
- Viewからリクエストを受け取る
- 受け取ったリクエストに基づいて該当するアクションを実行してModelに伝える
- Modelで処理したデータを受け取り、レスポンスをViewに返す
なんでそもそも分ける必要があるんや!
実際、LaravelなんかではControllerの中でModelの処理実行したりします。
簡単な処理とかならいいですけどそれが10行、20行、100行なんか行った際に・・・
そんなController見たいか?
となります。(というより研修課題で僕が完全にこれでした。急いで書き直した。)
なのでしっかりと役割を理解し、記述しましょう!まとめ
自分なりに理解して綴ってみましたがどうでしょうか?
ここまで読んでくださってありがとうございます!
最後に、MVCをしっかりと理解して効率的にWeb開発をしましょう!
じゃあね!
- 投稿日:2020-04-30T09:00:51+09:00
Laravel バリデーションを設定する ~コントローラ編~
目的
- 入力値をDBに保存する際にアプリケーション側でそのデータが要件を満たしているのかをフィルターする仕組みを実装する
実施環境
- ハードウェア環境
項目 情報 OS macOS Catalina(10.15.3) ハードウェア MacBook Pro (16-inch ,2019) プロセッサ 2.6 GHz 6コアIntel Core i7 メモリ 16 GB 2667 MHz DDR4 グラフィックス AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB
- ソフトウェア環境
項目 情報 備考 PHP バージョン 7.4.3 Homwbrewを用いて導入 Laravel バージョン 7.0.8 commposerを用いて導入 MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いて導入 説明に関する前提の説明
- 下記の方法、またはそれに準ずる方法でLaravelの環境を構築していること。
- Laravelのアプリケーションが存在すること。
説明に関する前提のコード
- 下記のような「ビューでの入力値をDBに格納する処理」が存在する事を前提として説明を行う。
ルーティングファイル
web.php//入力フォームを表示する Route::get('/new', 'ContentController@new'); //入力値を受け取ってDBに保存する Route::post('/create', 'ContentController@create');コントローラファイル(当該アクション部分のみ記載する)
ContentController.php//入力フォームを表示する contentディレクトリのnew.blade.phpを表示する public function new() { return view('content.new'); } //入力値を受け取ってDBに保存する DBへの格納処理の記載は省略する public function create(Request $request) { //受け取った値を連想配列に格納 $notice_info = $request->all(); //DBへの登録処理 }ビューファイル
content/new.blade.php<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <form action="/create" method="POST"> <input type="text" name="input_content"> <input type="submit" value="送信"> </form> </body> </html>実施方法概要
- コントローラにバリデーションを記載する方法をまとめる。
- バリデーションルールの設定
- バリデーション本体の記載
- 確認
実施方法詳細
バリデーションルールの設定
- 下記のようにコントローラに記載してバリデーションルールを定義する。
- バリデーション内容は「空状態での送信をブロックする」ものとする
バリデーションルールに引っかかった場合、
/newのページ(入力を行って送信ボタンをクリックしたページ)にリダイレクトされるようにする。ContentController.php//入力フォームを表示する contentディレクトリのnew.blade.phpを表示する public function new() { return view('content.new'); } //入力値を受け取ってDBに保存する DBへの格納処理の記載は省略する public function create(Request $request) { //バリデーションのルール設定 $rules = [ //'ビューのinput要素のnameで指定したキーの名前' => ['バリデーションのルール'],のように記載する、requiredは空の状態での送信をブロックするルールである 'input_content' => ['required'], ]; //受け取った値を連想配列に格納 $notice_info = $request->all(); //DBへの登録処理 }バリデーション本体の記載
バリデーションの命令を記載する
ContentController.php//入力フォームを表示する contentディレクトリのnew.blade.phpを表示する public function new() { return view('content.new'); } //入力値を受け取ってDBに保存する DBへの格納処理の記載は省略する public function create(Request $request) { //バリデーションのルール設定 $rules = [ //'ビューのinput要素のnameで指定したキーの名前' => ['バリデーションのルール'],のように記載する、requiredは空の状態での送信をブロックするルールである 'input_content' => ['required'], ]; //下記のように記載してバリデーションを設定する //$this->validate(ビューのform要素から送られた値が格納された変数$request, バリデーションルールが格納された変数$rules);のように記載する $this->validate($request, $rules); //受け取った値を連想配列に格納 $notice_info = $request->all(); //DBへの登録処理 }ビューファイルを編集してエラーメッセージを出力する記載を追加する。
content/new.blade.php<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <form action="/create" method="POST"> <!-- 下記を追記する --> <!-- バリデーションルールはひとつであるが、複数のエラーメッセージが出力される事を想定してforeach文でエラーを出力する --> <!-- 配列$errorsのキー'input_content'にメッセージが格納されているかの分岐 --> @if ($errors->has('input_content')) <!-- 配列$errorsのキー'input_content'に格納されているメッセージを行っこづつ変数$input_content_errorに格納する --> @foreach ($errors->get('input_content') as $input_content_error) <!-- 変数$input_content_errorを出力する --> <p>{{$input_content_errors}}</p> <br> @endforeach @endif <!-- ひとつのエラーメッセージのみ出力したい場合、下記の記載でも可 --> <!-- @if ($errors->has('input_content')) <p>{{$errors->first('input_content')}}</p> @endif --> <!-- 上記までを追記する --> <input type="text" name="input_content"> <input type="submit" value="送信"> </form> </body> </html>確認
/newにアクセスし、input要素で表示されている入力ボックスに何も入力せず「送信」ボタンをクリックする。/newが際表示される事を確認する。
- 投稿日:2020-04-30T01:58:39+09:00
【Laravel】Laravel DB設定
①MAMPを起動
アプリケーションからMAMPを開き、「サーバを起動」を押下する。
②phpMyAdminにアクセス
phpMyAdminにアクセスする。
③データベース作成
▪︎新規作成
左側のメニューから「新規作成」を押下する。▪︎データベース名入力
フォームに作成したいデータベース名を入力する。▪︎文字コード設定
プルダウンから文字コード「utf8_general_ci」を選択する。▪︎作成
「作成」ボタンを押下する。④特権の設定
▪︎データベースの選択
左側のメニューから特権を設定したいデータベースを選択する。
今回は先ほど③で作成したデータベースを選択する。▪︎特権タブを開く
上部から「特権タブ」を開く。▪︎ユーザアカウント追加
「ユーザアカウントを追加する」を押下する。▪︎ログイン情報フォーム入力
ユーザ名、パスワード、再入力を入力する。
他の設定は変えない。▪︎ユーザアカウント専用データベース設定
チェックボックスから「データベース laravel_task への全ての特権を与える。」を選択し、チェックを入れる。▪︎グローバル特権設定
チェックボックスから「すべてチェックする」を選択し、チェックを入れる。▪︎SSL設定
ラジオボタンから「REQUIRE NONE」を選択しする。▪︎実行
「実行」ボタンを押下する。⑤.envファイルのデータベース設定
.envファイルを開き、下記の通りデータベースを設定する。
公文) DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=8889 DB_DATABASE=【③で作成したデータベース名】 DB_USERNAME=【④で作成したユーザ名】 DB_PASSWORD=【④で設定したパスワード】 DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock 例) DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=8889 DB_DATABASE=laravel_task DB_USERNAME=laravel_user DB_PASSWORD=password123 DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock⑥DBマイグレート
▪︎ディレクトリ移動
公文) $ cd /Applications/MAMP/htdocs/プロジェクト名 例) $ cd /Applications/MAMP/htdocs/laravel_test▪︎DBマイグレート
$ php artisan migrate