<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>プログラミング</title>
	<atom:link href="https://ojisan2355.com/tag/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0/feed/" rel="self" type="application/rss+xml" />
	<link>https://ojisan2355.com</link>
	<description></description>
	<lastBuildDate>Tue, 12 Aug 2025 09:32:37 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://ojisan2355.com/wp-content/uploads/2021/05/cropped-939995-2-32x32.png</url>
	<title>プログラミング</title>
	<link>https://ojisan2355.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<atom:link rel='hub' href='https://ojisan2355.com/?pushpress=hub'/>
	<item>
		<title>【Laravel】Duskで画面全体のスクリーンショットを取る</title>
		<link>https://ojisan2355.com/laravel_tips-6/</link>
					<comments>https://ojisan2355.com/laravel_tips-6/#respond</comments>
		
		<dc:creator><![CDATA[おじさん2355]]></dc:creator>
		<pubDate>Fri, 11 Feb 2022 11:11:37 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Laravel]]></category>
		<guid isPermaLink="false">https://ojisan2355.com/?p=1441</guid>

					<description><![CDATA[　Laravel Dusk でのスクリーンショットは、下記のようにscreenshotメソッドを使用することで、簡単に取ることができます。 　しかし、一画面に収まらない場合は画面全体のスクリーンショットが取れず、下記の画 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>　Laravel Dusk でのスクリーンショットは、下記のようにscreenshotメソッドを使用することで、簡単に取ることができます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>public function testBasicExample()
{
    $this-&gt;browse(function (Browser $browser) {
        $browser-&gt;visit(&#39;/&#39;);
        $browser-&gt;screenshot($browser,&#39;name1&#39;);
        $browser-&gt;assertSee(&#39;Laravel&#39;);
    });
}</code></pre></div>



<p>　しかし、一画面に収まらない場合は画面全体のスクリーンショットが取れず、下記の画像のように下の部分が見切れてしまいます。</p>



<div class="wp-block-image"><figure class="aligncenter size-full is-resized"><img fetchpriority="high" decoding="async" src="https://ojisan2355.com/wp-content/uploads/2022/02/name.png" alt="" class="wp-image-1444" width="840" height="630" srcset="https://ojisan2355.com/wp-content/uploads/2022/02/name.png 1024w, https://ojisan2355.com/wp-content/uploads/2022/02/name-300x225.png 300w, https://ojisan2355.com/wp-content/uploads/2022/02/name-768x576.png 768w" sizes="(max-width: 840px) 100vw, 840px" /><figcaption>画面の下部分のスクリーンショットが取れていない</figcaption></figure></div>



<p>　テストのエビデンスとして、画面の下の方のスクリーンショットが必要な場合、これでは目的を果たすことができません。</p>



<p>かといって、scrollToメソッドなどでスクリーンショットを取るためだけにテストに記述するのも、なんか嫌ですよね。</p>



<p>　そんな問題を解決する、非常に簡単な方法を見つけました。</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img decoding="async" width="810" height="1024" src="https://ojisan2355.com/wp-content/uploads/2022/02/name1-1-810x1024.png" alt="" class="wp-image-1446" srcset="https://ojisan2355.com/wp-content/uploads/2022/02/name1-1-810x1024.png 810w, https://ojisan2355.com/wp-content/uploads/2022/02/name1-1-237x300.png 237w, https://ojisan2355.com/wp-content/uploads/2022/02/name1-1-768x971.png 768w, https://ojisan2355.com/wp-content/uploads/2022/02/name1-1.png 1003w" sizes="(max-width: 810px) 100vw, 810px" /><figcaption>画面の最後まスクリーンショットが取れる！！</figcaption></figure></div>



<p>同じような問題を抱えている方の、解決につながればうれしいです。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2"><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">結論</a></li><li><a href="#toc2" tabindex="0">解説</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading" id="結論"><span id="toc1">結論</span></h2>



<p>　下記のscreenshot_whole_page()のようなメソッドを定義することで、画面全体のスクリーンショットが取れます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>public function testBasicExample()
{
    $this-&gt;browse(function (Browser $browser) {
        $browser-&gt;visit(&#39;/&#39;);
        $this-&gt;screenshot_whole_page($browser,&#39;name1&#39;);
        $browser-&gt;assertSee(&#39;Laravel&#39;);
    });
}

private function screenshot_whole_page($browser,$name)
{
    $currentSize = $browser-&gt;driver-&gt;manage()-&gt;window()-&gt;getSize();
    $browser-&gt;fitContent();
    $browser-&gt;screenshot($name);
    $browser-&gt;driver-&gt;manage()-&gt;window()-&gt;setSize($currentSize);
}</code></pre></div>



<h2 class="wp-block-heading" id="解説"><span id="toc2">解説</span></h2>



<p>　ご存じの方もいるかと思いますが、Duskはアサート失敗時、スクリーンショットを自動でとってくれます。</p>



<p>このスクリーンショット、実は画面全体のスクリーンショットなんです。</p>



<p>ということは、Duskのどこかに、画面全体のスクリーンショットを取る方法が記載されている、ということです。</p>



<p>　それが記載されているのが、captureFailuresForメソッドです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="vendor\laravel\dusk\src\Concerns\ProvidesBrowser.php" data-lang="PHP"><code>/**
 * Capture failure screenshots for each browser.
 *
 * @param  \Illuminate\Support\Collection  $browsers
 * @return void
 */
protected function captureFailuresFor($browsers)
{
    $browsers-&gt;each(function ($browser, $key) {
        if (property_exists($browser, &#39;fitOnFailure&#39;) && $browser-&gt;fitOnFailure) {
            $browser-&gt;fitContent();
        }

        $name = $this-&gt;getCallerName();

        $browser-&gt;screenshot(&#39;failure-&#39;.$name.&#39;-&#39;.$key);
    });
}</code></pre></div>



<p>　上記を見てお分かりの通り、screenshotメソッドでスクリーンショットを取る前に、fitContentメソッドでブラウザの画面サイズを変更しています。</p>



<p>　このことから、テスト中のスクリーンショットを画面全体を取るようにするためには、次の処理を行えばよいことがわかります。</p>



<div class="wp-block-cocoon-blocks-blank-box-1 blank-box block-box has-border-color has-light-blue-border-color">
<ol class="wp-block-list"><li>getSizeメソッドで、スクリーンショットを取る前の画面サイズを保存する</li><li>fitConentメソッドで画面サイズをコンテンツのサイズに合わせる</li><li>screenshotメソッドでスクリーンショットを取る</li><li>setSizeメソッド画面サイズをもとのサイズに戻す</li></ol>
</div>



<p>　以上の内容を実装したのが、前述したscreenshot_whole_pageメソッドです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>private function screenshot_whole_page($browser,$name)
{
    $currentSize = $browser-&gt;driver-&gt;manage()-&gt;window()-&gt;getSize();
    $browser-&gt;fitContent();
    $browser-&gt;screenshot($name);
    $browser-&gt;driver-&gt;manage()-&gt;window()-&gt;setSize($currentSize);
}</code></pre></div>



<p>以上、参考になればうれしいです。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ojisan2355.com/laravel_tips-6/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Excel+VBA】複数のシートを一括追加</title>
		<link>https://ojisan2355.com/excel_vba_tips-2/</link>
					<comments>https://ojisan2355.com/excel_vba_tips-2/#respond</comments>
		
		<dc:creator><![CDATA[おじさん2355]]></dc:creator>
		<pubDate>Sat, 18 Dec 2021 06:20:37 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[Excel]]></category>
		<guid isPermaLink="false">https://ojisan2355.com/?p=1386</guid>

					<description><![CDATA[　ひとつのExcelブックにシートを追加するとき、普通は、 「＋」ボタンでシート追加 右クリックで名前 としますよね？ しかし、たくさんのシートを追加するのはとても手間のかかる作業です。 　そこで、一度にたくさんのシート [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>　ひとつのExcelブックにシートを追加するとき、普通は、</p>



<ul class="wp-block-list"><li>「＋」ボタンでシート追加</li><li>右クリックで名前</li></ul>



<p>としますよね？</p>



<p>しかし、たくさんのシートを追加するのはとても手間のかかる作業です。</p>



<p>　そこで、一度にたくさんのシートを追加して、なおかつハイパーリンクを付けてくれるVBAプログラムを作成しました。</p>



<p>　単純な作業は自動化しましょう。</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img decoding="async" width="820" height="259" src="https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-18_15h03_44.png" alt="" class="wp-image-1387" srcset="https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-18_15h03_44.png 820w, https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-18_15h03_44-300x95.png 300w, https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-18_15h03_44-768x243.png 768w" sizes="(max-width: 820px) 100vw, 820px" /><figcaption>目次だけのシートから…</figcaption></figure></div>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="820" height="259" src="https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-18_15h04_06.png" alt="" class="wp-image-1388" srcset="https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-18_15h04_06.png 820w, https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-18_15h04_06-300x95.png 300w, https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-18_15h04_06-768x243.png 768w" sizes="(max-width: 820px) 100vw, 820px" /><figcaption>大量のシート追加とハイパーリンクを付けることができます</figcaption></figure></div>



<div class="wp-block-cocoon-blocks-label-box-1 label-box block-box has-border-color has-light-blue-border-color"><div class="label-box-label block-box-label box-label"><span class="label-box-label-text block-box-label-text box-label-text">この記事でできること</span></div><div class="label-box-content block-box-content box-content">
<ul class="wp-block-list"><li>Excelブックに複数のシートを一括追加できる。</li></ul>
</div></div>



<h2 class="wp-block-heading" id="完成形">完成形</h2>



<p>　以下が完成形です。簡単にできました。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>Sub シートの一括追加()
    
    &#39;追加するシートの名前が書かれたリスト
    Set SheetNameList = Sheets(&quot;目次&quot;).Range(&quot;$A$2:$A$5&quot;)
    
    For Each ListRow In SheetNameList
        &#39;追加するシート名
        NewSheetName = ListRow.Value
        
        &#39;右端にシートを追加
        Set NewSheet = Sheets.Add(After:=Sheets(Sheets.Count))
        
        &#39;シート名をセット
        NewSheet.Name = NewSheetName
        
        &#39;追加したシートへのハイパーリンクを「目次」シートに追加
        NewSheet.Hyperlinks.Add Anchor:=ListRow, Address:=&quot;&quot;, SubAddress:=NewSheetName + &quot;!$A$1&quot;, TextToDisplay:=NewSheetName
    Next
    
    &#39;フォーカスを「目次」シートに戻す
    Sheets(&quot;目次&quot;).Select

End Sub</code></pre></div>



<p>参考になればうれしいです。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ojisan2355.com/excel_vba_tips-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Excel+VBA】複数ファイルのレコードをマージしてひとつのファイルにする</title>
		<link>https://ojisan2355.com/excel_vba_tips/</link>
					<comments>https://ojisan2355.com/excel_vba_tips/#respond</comments>
		
		<dc:creator><![CDATA[おじさん2355]]></dc:creator>
		<pubDate>Sat, 11 Dec 2021 09:09:13 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[Excel]]></category>
		<guid isPermaLink="false">https://ojisan2355.com/?p=1371</guid>

					<description><![CDATA[　Excelの複数のファイルにレコードを、１つのファイルにマージするためのVBAを作成しました。 「営業担当者ごとの今月の受注データをひとつにまとめて、部全体の受注データを作成する」といった作業を行う場合、ファイルをひと [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>　Excelの複数のファイルにレコードを、１つのファイルにマージするためのVBAを作成しました。</p>



<p>「営業担当者ごとの今月の受注データをひとつにまとめて、部全体の受注データを作成する」といった作業を行う場合、ファイルをひとつずつ開いてコピペするのは地味に面倒な作業です。<br>仮に「ひとつのファイルを開く⇒コピペする⇒ファイルを閉じる」の一連の作業に１分かかるとして、１０人分だと１０分、１００人分だと１００分もかかる作業です。</p>



<p>　単純な作業は自動化しましょう。</p>



<div class="wp-block-cocoon-blocks-label-box-1 label-box block-box has-border-color has-light-blue-border-color"><div class="label-box-label block-box-label box-label"><span class="label-box-label-text block-box-label-text box-label-text">この記事でできること</span></div><div class="label-box-content block-box-content box-content">
<ul class="wp-block-list"><li>Excelの複数ファイルを自動集計できる。</li></ul>
</div></div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6"><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">完成形</a></li><li><a href="#toc2" tabindex="0">解説</a><ol><li><a href="#toc3" tabindex="0">ヘッダから下のデータをクリア</a></li><li><a href="#toc4" tabindex="0">行数</a></li><li><a href="#toc5" tabindex="0">貼り付け</a></li></ol></li><li><a href="#toc6" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading" id="完成形"><span id="toc1">完成形</span></h2>



<p>　以下が完成形です。詳細はのちほど解説します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>Public Const SHEET_FROM = &quot;Sheet1&quot;         &#39; マージするデータが保存されているシート名
Public Const SHEET_TO = &quot;マージ後&quot;         &#39; マージ後のデータを保存するシート名
Public COLUMN_END  As Long                 &#39; 最大カラム数

Public Function MergerFiles()

    Dim File As String

    COLUMN_END = Columns.Count

    &#39; マージする対象のファイルの場所
    FILE_PATH = ThisWorkbook.Path
    FILE_PATH_FROM = FILE_PATH & &quot;\From&quot;

    &#39;　ヘッダから下のデータをクリア
    ThisWorkbook.Sheets(SHEET_TO).Range(Cells(2, 1), Cells(Rows.Count, COLUMN_END)).Clear

    &#39; ファイルがあるだけループ
    File = Dir(FILE_PATH_FROM & &quot;\*.xlsx&quot;)
    Do While File &lt;&gt; &quot;&quot;
        MergeFile Path:=FILE_PATH_FROM & &quot;\&quot; & File
        File = Dir()
    Loop

End Function

Private Function MergeFile(Path As String)

    Dim BookFrom As Workbook

    Set BookFrom = Workbooks.Open(Filename:=Path, ReadOnly:=True, UpdateLinks:=False)
    
    Set SheetFrom = BookFrom.Sheets(SHEET_FROM)
    Set SheetTo = ThisWorkbook.Sheets(SHEET_TO)
    
    &#39; マージ元の行数(ヘッダを含む)
    With SheetFrom
        RowsFrom = .Cells(.Rows.Count, 1).End(xlUp).Row
    End With
    
    &#39; マージ先の行数(ヘッダを含む)
    With SheetTo
        RowsTo = .Cells(.Rows.Count, 1).End(xlUp).Row
    End With
    
    &#39; コピー元の範囲(ヘッダの次の行から最後の行まで)
    Set RangeFrom = SheetFrom.Range(SheetFrom.Cells(2, 1), SheetFrom.Cells(RowsFrom, COLUMN_END))
    &#39; コピー先の範囲(最終行の次の行から、コピー元の行数分)
    Set RangeTo = SheetTo.Range(SheetTo.Cells(RowsTo + 1, 1), SheetTo.Cells(RowsTo + RowsFrom - 1, COLUMN_END))
    
    RangeTo.Value = RangeFrom.Value
    
    BookFrom.Close SaveChanges:=False

End Function
</code></pre></div>



<h2 class="wp-block-heading" id="解説"><span id="toc2">解説</span></h2>



<p>　VBAの中で分かりにくそうな箇所を解説します。</p>



<h3 class="wp-block-heading" id="ヘッダから下のデータをクリア"><span id="toc3">ヘッダから下のデータをクリア</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>    &#39;　ヘッダから下のデータをクリア
    ThisWorkbook.Sheets(SHEET_TO).Range(Cells(2, 1), Cells(Rows.Count, COLUMN_END)).Clear</code></pre></div>



<p>　ここでは、マージ後のデータ格納領域のクリアを行っています。</p>



<p>「Range(Cells(2, 1), Cells(Rows.Count, COLUMN_END))」が、クリア対象となる領域です。ヘッダ行の次の行である２行目から、データが格納されている最終行までを指しています。</p>



<p>下図を例にすると、Cells(2,1)はA2のセル、Cells(Rows.Count, COLUMN_END)は、４行目の右端のセルを表しています。</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="597" height="262" src="https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-11_17h36_27.png" alt="" class="wp-image-1381" srcset="https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-11_17h36_27.png 597w, https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-11_17h36_27-300x132.png 300w" sizes="(max-width: 597px) 100vw, 597px" /><figcaption>赤枠の中をクリア</figcaption></figure></div>



<h3 class="wp-block-heading" id="行数"><span id="toc4">行数</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>    &#39; マージ元の行数(ヘッダを含む)
    With SheetFrom
        RowsFrom = .Cells(.Rows.Count, 1).End(xlUp).Row
    End With
    
    &#39; マージ先の行数(ヘッダを含む)
    With SheetTo
        RowsTo = .Cells(.Rows.Count, 1).End(xlUp).Row
    End With</code></pre></div>



<p>　コピペをするには「コピー元の行数」と「貼り付け先の最初の行の位置」の情報が必要になります。</p>



<p>上記では、A列の一番下のセルから「Ctrl+↑」で最終行に移動する要領で、コピー元・貼り付け先それぞれのヘッダ行を含む行数(最終行の行番号)を取得しています。</p>



<h3 class="wp-block-heading" id="貼り付け"><span id="toc5">貼り付け</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>    &#39; コピー元の範囲(ヘッダの次の行から最後の行まで)
    Set RangeFrom = SheetFrom.Range(SheetFrom.Cells(2, 1), SheetFrom.Cells(RowsFrom, COLUMN_END))
    &#39; コピー先の範囲(最終行の次の行から、コピー元の行数分)
    Set RangeTo = SheetTo.Range(SheetTo.Cells(RowsTo + 1, 1), SheetTo.Cells(RowsTo + RowsFrom - 1, COLUMN_END))
    
    RangeTo.Value = RangeFrom.Value</code></pre></div>



<p>　コピペを一括で行っています。</p>



<p>　For文などで１行ずつコピーして貼り付ける方法もありますが、その方法だと時間がかかりすぎるため、コピーする範囲を一括選択して貼り付けるようにしています。</p>



<p>　下図を例にすると、コピー元の行数が３行であるため、貼り付け先の領域は４～６行目になります。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="597" height="262" src="https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-11_18h03_33.png" alt="" class="wp-image-1382" srcset="https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-11_18h03_33.png 597w, https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-11_18h03_33-300x132.png 300w" sizes="(max-width: 597px) 100vw, 597px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="616" height="404" src="https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-11_18h04_21.png" alt="" class="wp-image-1383" srcset="https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-11_18h04_21.png 616w, https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-11_18h04_21-300x197.png 300w" sizes="(max-width: 616px) 100vw, 616px" /></figure>



<h2 class="wp-block-heading" id="まとめ"><span id="toc6">まとめ</span></h2>



<p>　今回紹介した内容は、コピペに最低限必要な部分を記載しました。</p>



<p>必要に応じて、マージボタンを追加したり、コピー元のファイルのオープン・クローズを見せないようにしたり、カスタイマイズしていただければと思います。</p>



<p>参考になればうれしいです。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ojisan2355.com/excel_vba_tips/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Laravel】リクエストボディにQUERY_STRING形式のデータがあったら</title>
		<link>https://ojisan2355.com/laravel_tips-7/</link>
					<comments>https://ojisan2355.com/laravel_tips-7/#respond</comments>
		
		<dc:creator><![CDATA[おじさん2355]]></dc:creator>
		<pubDate>Sun, 14 Nov 2021 06:19:45 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Laravel]]></category>
		<guid isPermaLink="false">https://ojisan2355.com/?p=1360</guid>

					<description><![CDATA[　あまり需要がないかもしれませんが、POST時のリクエストボディにQUERY_STRING形式のデータがあった場合に、クエリパラメータを変数にセットする方法です。 　LaravelにはRequestクラスがあって、リクエ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>　あまり需要がないかもしれませんが、POST時のリクエストボディにQUERY_STRING形式のデータがあった場合に、クエリパラメータを変数にセットする方法です。</p>



<p>　LaravelにはRequestクラスがあって、リクエストデータのパラメータへのアクセスは非常に簡単にできるようになっています。</p>



<p>　ここで紹介するのは、APIからのコールバック時のリクエストボディに、API呼び出し時のクエリパラメータが丸ごとコピーされていて、かつコールバック時の処理で使用したい、なんてケースに使える方法です。</p>



<h2 class="wp-block-heading" id="結論">結論</h2>



<p>　 parse_str()を使用するだけです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$query_string = $request-&gt;query_string ; // 例：param1=hoge1&param2=hoge2 
parse_str($query_string,$params);
dd($params);
// array:2 [
//  &quot;param1&quot; =&gt; &quot;hoge1&quot;
//  &quot;param2&quot; =&gt; &quot;hoge2&quot;
//]</code></pre></div>



<p>参考になればうれしいです。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ojisan2355.com/laravel_tips-7/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Laravel】ソーシャルログイン後のアプリケーションへのログイン or ユーザー登録</title>
		<link>https://ojisan2355.com/laravel_tips-5-2/</link>
					<comments>https://ojisan2355.com/laravel_tips-5-2/#respond</comments>
		
		<dc:creator><![CDATA[おじさん2355]]></dc:creator>
		<pubDate>Sun, 14 Nov 2021 05:36:21 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Laravel]]></category>
		<guid isPermaLink="false">https://ojisan2355.com/?p=1351</guid>

					<description><![CDATA[　Laravelで作成したアプリケーションにgoogleやFacebookのアカウントでログインする方法は、様々なサイトで紹介されています。その大部分がSocialiteやSAML2を利用するものですが、それらの機能でシ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>　Laravelで作成したアプリケーションにgoogleやFacebookのアカウントでログインする方法は、様々なサイトで紹介されています。<br>その大部分がSocialiteやSAML2を利用するものですが、それらの機能でシングルサインオンを実現した後で、Laravelのアプリケーションのログインやユーザー登録との連携を記載されている記事が少ないような気がしたので、記事にすることにしました。</p>



<p>　ここではgoogleアカウントを利用したSSO認証を例に、認証後のLaravelアプリケーションへのログインやユーザー登録方法を紹介します。</p>



<div class="wp-block-cocoon-blocks-label-box-1 label-box block-box has-border-color has-light-blue-border-color"><div class="label-box-label block-box-label box-label"><span class="label-box-label-text block-box-label-text box-label-text">この記事でできること</span></div><div class="label-box-content block-box-content box-content">
<ul class="wp-block-list"><li>ソーシャルログイン後に使用したユーザーを、Laravelアプリケーションにユーザー登録できる。</li><li>ソーシャルログイン後に、Laravelアプリケーションに自動ログインできる。</li></ul>



<p></p>
</div></div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-10"><label class="toc-title" for="toc-checkbox-10">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">前提条件</a><ol><li><a href="#toc2" tabindex="0">Laravel標準の認証機能(Auth)を使用していること</a></li><li><a href="#toc3" tabindex="0">認証プロバイダ側の設定が完了していること</a></li><li><a href="#toc4" tabindex="0">ソーシャルログイン用のコードが稼働する状態であること</a></li></ol></li><li><a href="#toc5" tabindex="0">ログイン画面表示部分を認証プロバイダへのリダイレクトに変更する</a></li><li><a href="#toc6" tabindex="0">認証プロバイダからのコールバック処理を記述する</a><ol><li><a href="#toc7" tabindex="0">ログイン処理</a></li><li><a href="#toc8" tabindex="0">ユーザー登録</a></li><li><a href="#toc9" tabindex="0">作成したコールバック処理</a></li></ol></li><li><a href="#toc10" tabindex="0">ルーティングを設定する</a></li><li><a href="#toc11" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading" id="前提条件"><span id="toc1">前提条件</span></h2>



<h3 class="wp-block-heading" id="laravel標準の認証機能-auth-を使用していること"><span id="toc2">Laravel標準の認証機能(Auth)を使用していること</span></h3>



<p>　この記事で紹介する方法は、Laravel標準の認証機能(Auth)に組み込まれているコントローラーやブレードファイルをカスタマイズするものなので、Authが利用可能になっている必要があります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code># php artisan route:list
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+---------------------------------------------+
| Domain | Method   | URI                    | Name             | Action                                                                 | Middleware                                  |
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+---------------------------------------------+
|        | GET|HEAD | login                  | login            | App\Http\Controllers\Auth\LoginController@showLoginForm                | web                                         |
|        |          |                        |                  |                                                                        | AppHttpMiddlewareRedirectIfAuthenticated |
|        | POST     | login                  |                  | App\Http\Controllers\Auth\LoginController@login                        | web                                         |
|        |          |                        |                  |                                                                        | AppHttpMiddlewareRedirectIfAuthenticated |
|        | POST     | logout                 | logout           | App\Http\Controllers\Auth\LoginController@logout                       | web                                         |
|        | GET|HEAD | password/confirm       | password.confirm | App\Http\Controllers\Auth\ConfirmPasswordController@showConfirmForm    | web                                         |
|        |          |                        |                  |                                                                        | AppHttpMiddlewareAuthenticate            |
|        | POST     | password/confirm       |                  | App\Http\Controllers\Auth\ConfirmPasswordController@confirm            | web                                         |
|        |          |                        |                  |                                                                        | AppHttpMiddlewareAuthenticate            |
|        | POST     | password/email         | password.email   | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail  | web                                         |
|        | GET|HEAD | password/reset         | password.request | App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm | web                                         |
|        | POST     | password/reset         | password.update  | App\Http\Controllers\Auth\ResetPasswordController@reset                | web                                         |
|        | GET|HEAD | password/reset/{token} | password.reset   | App\Http\Controllers\Auth\ResetPasswordController@showResetForm        | web                                         |
|        | GET|HEAD | register               | register         | App\Http\Controllers\Auth\RegisterController@showRegistrationForm      | web                                         |
|        |          |                        |                  |                                                                        | AppHttpMiddlewareRedirectIfAuthenticated |
|        | POST     | register               |                  | App\Http\Controllers\Auth\RegisterController@register                  | web                                         |
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+---------------------------------------------+</code></pre></div>



<h3 class="wp-block-heading" id="認証プロバイダ側の設定が完了していること"><span id="toc3">認証プロバイダ側の設定が完了していること</span></h3>



<p>　今回の記事は、googleアカウントを利用したSSO認証を例にしているので、認証プロバイダ側の設定が完了している状態とは、Google Cloud Platform の「APIとサービス」にて「OAuth 2.0 クライアント ID」の設定が完了している状態です。<br>なお今回の記事では、googleアカウント認証後のリダイレクト先である「承認済みのリダイレクトURI」は、「http://localhost:8080/callback」として記述します。</p>



<h3 class="wp-block-heading" id="ソーシャルログイン用のコードが稼働する状態であること"><span id="toc4">ソーシャルログイン用のコードが稼働する状態であること</span></h3>



<p>　今回の記事はSocialiteを利用したソーシャルログインを例にしているので、コントローラーで以下コードが機能する状態です。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="App/Http/Controllers/Auth/LoginController.php" data-lang="PHP"><code>Socialite::driver(&#39;google&#39;)-&gt;redirect();          // googleアカウントログインへのリダイレクト
Socialite::driver(&#39;google&#39;)-&gt;stateless()-&gt;user(); // googleアカウント認証後のコールバック受信</code></pre></div>



<h2 class="wp-block-heading" id="ログイン画面表示部分を認証プロバイダへのリダイレクトに変更する"><span id="toc5">ログイン画面表示部分を認証プロバイダへのリダイレクトに変更する</span></h2>



<p>　Authでのログイン画面表示は、LoginControllerクラスのshowLoginForm()メソッドで行っています。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>+--------+----------+------------------------+------------------+------------------------------------------------------------------------+---------------------------------------------+
| Domain | Method   | URI                    | Name             | Action                                                                 | Middleware                                  |
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+---------------------------------------------+
|        | GET|HEAD | login                  | login            | App\Http\Controllers\Auth\LoginController@showLoginForm                | web                                         |
|        |          |                        |                  |                                                                        | AppHttpMiddlewareRedirectIfAuthenticated |
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+---------------------------------------------+</code></pre></div>



<p>　showLoginForm()は、 AuthenticatesUsersクラスから継承されたメソッドです。中身を見ると、「auth/login.blade.php」を表示していることがわかります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="AuthenticatesUsers.php" data-lang="PHP"><code>public function showLoginForm()
{
    return view(&#39;auth.login&#39;);
}</code></pre></div>



<p>　そこで、auth/login.blade.phpを表示させる代わりに、認証プロバイダにリダイレクトするよう、showLoginForm()をオーバーライドします。</p>



<pre class="wp-block-code php has-small-font-size"><code></code></pre>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="App/Http/Controllers/Auth/LoginController.php" data-lang="PHP"><code>public function showLoginForm()
{
    return Socialite::driver(&#39;google&#39;)-&gt;redirect();
}</code></pre></div>



<h2 class="wp-block-heading" id="認証プロバイダからのコールバック処理を記述する"><span id="toc6">認証プロバイダからのコールバック処理を記述する</span></h2>



<p>　認証プロバイダからのコールバックされたユーザーが、アプリケーションに登録済みの場合はログイン、存在しなければユーザー登録をするようにします。</p>



<h3 class="wp-block-heading" id="ログイン処理"><span id="toc7">ログイン処理</span></h3>



<p>　Authでのログイン処理は、LoginControllerクラスのlogin()メソッドで行っています。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>+--------+----------+------------------------+------------------+------------------------------------------------------------------------+---------------------------------------------+
| Domain | Method   | URI                    | Name             | Action                                                                 | Middleware                                  |
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+---------------------------------------------+
|        | POST     | login                  |                  | App\Http\Controllers\Auth\LoginController@login                        | web                                         |
|        |          |                        |                  |                                                                        | AppHttpMiddlewareRedirectIfAuthenticated |
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+---------------------------------------------+
</code></pre></div>



<p>　login()は AuthenticatesUsersクラスから継承されたメソッドです。しかし、login()メソッドによるアプリケーションへのログインには、ユーザーIDとパスワードが必要になるため、ユーザーIDのみでログインができる、AuthクラスのloginUsingId()メソッドを使用します。</p>



<h3 class="wp-block-heading" id="ユーザー登録"><span id="toc8">ユーザー登録</span></h3>



<p> Authでのユーザー登録は、RegisterControllerクラスのregister()メソッドで行っているので、コールバック処理時にregister()メソッドを呼び出すようにします。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>+--------+----------+------------------------+------------------+------------------------------------------------------------------------+---------------------------------------------+
| Domain | Method   | URI                    | Name             | Action                                                                 | Middleware                                  |
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+---------------------------------------------+
|        | POST     | register               |                  | App\Http\Controllers\Auth\RegisterController@register                  | web                                         |
|        |          |                        |                  |                                                                        | AppHttpMiddlewareRedirectIfAuthenticated |
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+---------------------------------------------+
</code></pre></div>



<h3 class="wp-block-heading" id="作成したコールバック処理"><span id="toc9">作成したコールバック処理</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="App/Http/Controllers/Auth/LoginController.php" data-lang="PHP"><code>public function callback()
{
    $_ = Socialite::driver(&#39;google&#39;)-&gt;stateless()-&gt;user();
    $user = User::where(&#39;email&#39;,$_-&gt;email)-&gt;first(); // 認証プロバイダからの戻り値から、アプリケーションのログインIDを取得する

    if (! empty($user))
    {
        Auth::loginUsingId($user-&gt;id);      // ログインIDのみでアプリケーションにログインする。
        return redirect($this-&gt;redirectTo); // ログイン後のリダイレクト
    }

    $request = new Request ;
    $request-&gt;merge([
        &#39;name&#39; =&gt; $_-&gt;name,
        &#39;email&#39; =&gt; $_-&gt;email,
    ]);

    $regist = new RegisterController;
    return $regist-&gt;register($request) ;
}</code></pre></div>



<h2 class="wp-block-heading" id="ルーティングを設定する"><span id="toc10">ルーティングを設定する</span></h2>



<p>　認証プロバイダからコールバックされたときにだけ、アプリケーションへのログインやユーザー登録をさせるようにするため、ルーティングを変更します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="routes/web.php" data-lang="PHP"><code>Auth::routes([
    &#39;register&#39; =&gt; false, // ユーザー登録はプロバイダからのコールバック時に限定する
    &#39;reset&#39; =&gt; false,    // パスワード初期化：認証プロバイダを利用するのに不活性化
    &#39;confirm&#39; =&gt; false,  // パスワード確認：認証プロバイダを利用するのに不活性化
    &#39;verify&#39; =&gt; false,   // メール認証：認証プロバイダを利用するのに不活性化
]);

Route::get(&#39;callback&#39;, &#39;App\Http\Controllers\Auth\LoginController@callback&#39;); // 認証プロバイダからのコールバック
Route::post(&#39;login&#39; , function() {
    return redirect(&#39;login&#39;); // ログインは認証プロバイダからのコールバック時に限定する
}) ;</code></pre></div>



<p>　なお、最後の「Route::post(&#8216;login&#8217;&#8230;」の部分は、外部からのLaravelのIDでのログインを無効化する対策です。</p>



<p>Authを使用することによって「Auth\LoginController@login」の呼び出しが可能になってしまうため、「/login」へのリダイレクト(「LoginController@showLoginForm」の呼び出し)に上書きしています。</p>



<h2 class="wp-block-heading" id="まとめ"><span id="toc11">まとめ</span></h2>



<p>　以上で、googleアカウントでの認証後に、Laravelアプリケーションへのログインやユーザー登録できるようになります。</p>



<p>参考になればうれしいです。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ojisan2355.com/laravel_tips-5-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Laravel】ソーシャルログイン後のアプリケーションへのログイン or ユーザー登録</title>
		<link>https://ojisan2355.com/laravel_tips-5/</link>
					<comments>https://ojisan2355.com/laravel_tips-5/#respond</comments>
		
		<dc:creator><![CDATA[おじさん2355]]></dc:creator>
		<pubDate>Sun, 31 Oct 2021 08:58:41 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Laravel]]></category>
		<guid isPermaLink="false">https://ojisan2355.com/?p=1303</guid>

					<description><![CDATA[　Laravelで作成したアプリケーションにgoogleやFacebookのアカウントでログインする方法は、様々なサイトで紹介されています。その大部分がSocialiteやSAML2を利用するものですが、それらの機能でシ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>　Laravelで作成したアプリケーションにgoogleやFacebookのアカウントでログインする方法は、様々なサイトで紹介されています。<br>その大部分がSocialiteやSAML2を利用するものですが、それらの機能でシングルサインオンを実現した後で、Laravelのアプリケーションのログインやユーザー登録との連携を記載されている記事が少ないような気がしたので、記事にすることにしました。</p>



<p>　ここではgoogleアカウントを利用したSSO認証を例に、認証後のLaravelアプリケーションへのログインやユーザー登録方法を紹介します。</p>



<div class="wp-block-cocoon-blocks-label-box-1 label-box block-box has-border-color has-light-blue-border-color"><div class="label-box-label block-box-label box-label"><span class="label-box-label-text block-box-label-text box-label-text">この記事でできること</span></div><div class="label-box-content block-box-content box-content">
<ul class="wp-block-list"><li>ソーシャルログイン後に使用したユーザーを、Laravelアプリケーションにユーザー登録できる。</li><li>ソーシャルログイン後に、Laravelアプリケーションに自動ログインできる。</li></ul>



<p></p>
</div></div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-12"><label class="toc-title" for="toc-checkbox-12">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">前提条件</a><ol><li><a href="#toc2" tabindex="0">Laravel標準の認証機能(Auth)を使用していること</a></li><li><a href="#toc3" tabindex="0">認証プロバイダ側の設定が完了していること</a></li><li><a href="#toc4" tabindex="0">ソーシャルログイン用のコードが稼働する状態であること</a></li></ol></li><li><a href="#toc5" tabindex="0">ログイン画面表示部分を認証プロバイダへのリダイレクトに変更する</a></li><li><a href="#toc6" tabindex="0">認証プロバイダからのコールバック処理を記述する</a><ol><li><a href="#toc7" tabindex="0">ログイン処理</a></li><li><a href="#toc8" tabindex="0">ユーザー登録</a></li><li><a href="#toc9" tabindex="0">作成したコールバック処理</a></li></ol></li><li><a href="#toc10" tabindex="0">ルーティングを設定する</a></li><li><a href="#toc11" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading" id="前提条件"><span id="toc1">前提条件</span></h2>



<h3 class="wp-block-heading" id="laravel標準の認証機能-auth-を使用していること"><span id="toc2">Laravel標準の認証機能(Auth)を使用していること</span></h3>



<p>　この記事で紹介する方法は、Laravel標準の認証機能(Auth)に組み込まれているコントローラーやブレードファイルをカスタマイズするものなので、Authが利用可能になっている必要があります。</p>



<div class="hcb_wrap"><pre class="prism off-numbers lang-bash" data-lang="Bash" data-show-lang="0"><code>&gt; php artisan route:list
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+---------------------------------------------+
| Domain | Method   | URI                    | Name             | Action                                                                 | Middleware                                  |
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+---------------------------------------------+
|        | GET|HEAD | login                  | login            | App\Http\Controllers\Auth\LoginController@showLoginForm                | web                                         |
|        |          |                        |                  |                                                                        | App\Http\Middleware\RedirectIfAuthenticated |
|        | POST     | login                  |                  | App\Http\Controllers\Auth\LoginController@login                        | web                                         |
|        |          |                        |                  |                                                                        | App\Http\Middleware\RedirectIfAuthenticated |
|        | POST     | logout                 | logout           | App\Http\Controllers\Auth\LoginController@logout                       | web                                         |
|        | GET|HEAD | password/confirm       | password.confirm | App\Http\Controllers\Auth\ConfirmPasswordController@showConfirmForm    | web                                         |
|        |          |                        |                  |                                                                        | App\Http\Middleware\Authenticate            |
|        | POST     | password/confirm       |                  | App\Http\Controllers\Auth\ConfirmPasswordController@confirm            | web                                         |
|        |          |                        |                  |                                                                        | App\Http\Middleware\Authenticate            |
|        | POST     | password/email         | password.email   | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail  | web                                         |
|        | GET|HEAD | password/reset         | password.request | App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm | web                                         |
|        | POST     | password/reset         | password.update  | App\Http\Controllers\Auth\ResetPasswordController@reset                | web                                         |
|        | GET|HEAD | password/reset/{token} | password.reset   | App\Http\Controllers\Auth\ResetPasswordController@showResetForm        | web                                         |
|        | GET|HEAD | register               | register         | App\Http\Controllers\Auth\RegisterController@showRegistrationForm      | web                                         |
|        |          |                        |                  |                                                                        | App\Http\Middleware\RedirectIfAuthenticated |
|        | POST     | register               |                  | App\Http\Controllers\Auth\RegisterController@register                  | web                                         |
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+---------------------------------------------+</code></pre></div>



<h3 class="wp-block-heading" id="認証プロバイダ側の設定が完了していること"><span id="toc3">認証プロバイダ側の設定が完了していること</span></h3>



<p>　今回の記事は、googleアカウントを利用したSSO認証を例にしているので、認証プロバイダ側の設定が完了している状態とは、Google Cloud Platform の「APIとサービス」にて「OAuth 2.0 クライアント ID」の設定が完了している状態です。<br>なお今回の記事では、googleアカウント認証後のリダイレクト先である「承認済みのリダイレクトURI」は、「http://localhost:8080/callback」として記述します。</p>



<h3 class="wp-block-heading" id="ソーシャルログイン用のコードが稼働する状態であること"><span id="toc4">ソーシャルログイン用のコードが稼働する状態であること</span></h3>



<p>　今回の記事はSocialiteを利用したソーシャルログインを例にしているので、コントローラーで以下コードが機能する状態です。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="App/Http/Controllers/Auth/LoginController.php" data-lang="PHP"><code>Socialite::driver(&#39;google&#39;)-&gt;redirect();          // googleアカウントログインへのリダイレクト
Socialite::driver(&#39;google&#39;)-&gt;stateless()-&gt;user(); // googleアカウント認証後のコールバック受信</code></pre></div>



<h2 class="wp-block-heading" id="ログイン画面表示部分を認証プロバイダへのリダイレクトに変更する"><span id="toc5">ログイン画面表示部分を認証プロバイダへのリダイレクトに変更する</span></h2>



<p>　Authでのログイン画面表示は、LoginControllerクラスのshowLoginForm()メソッドで行っています。</p>



<div class="hcb_wrap"><pre class="prism off-numbers lang-bash" data-lang="Bash" data-show-lang="0"><code>+--------+----------+------------------------+------------------+------------------------------------------------------------------------+---------------------------------------------+
| Domain | Method   | URI                    | Name             | Action                                                                 | Middleware                                  |
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+---------------------------------------------+
|        | GET|HEAD | login                  | login            | App\Http\Controllers\Auth\LoginController@showLoginForm                | web                                         |
|        |          |                        |                  |                                                                        | App\Http\Middleware\RedirectIfAuthenticated |
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+---------------------------------------------+</code></pre></div>



<p>　showLoginForm()は、 AuthenticatesUsersクラスから継承されたメソッドです。中身を見ると、「auth/login.blade.php」を表示していることがわかります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="AuthenticatesUsers.php" data-lang="PHP"><code>public function showLoginForm()
{
    return view(&#39;auth.login&#39;);
}</code></pre></div>



<p>　そこで、auth/login.blade.phpを表示させる代わりに、認証プロバイダにリダイレクトするよう、showLoginForm()をオーバーライドします。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="App/Http/Controllers/Auth/LoginController.php" data-lang="PHP"><code>public function showLoginForm()
{
    return Socialite::driver(&#39;google&#39;)-&gt;redirect();
}</code></pre></div>



<h2 class="wp-block-heading" id="認証プロバイダからのコールバック処理を記述する"><span id="toc6">認証プロバイダからのコールバック処理を記述する</span></h2>



<p>　認証プロバイダからのコールバックされたユーザーが、アプリケーションに登録済みの場合はログイン、存在しなければユーザー登録をするようにします。</p>



<h3 class="wp-block-heading" id="ログイン処理"><span id="toc7">ログイン処理</span></h3>



<p>　Authでのログイン処理は、LoginControllerクラスのlogin()メソッドで行っています。</p>



<div class="hcb_wrap"><pre class="prism off-numbers lang-bash" data-lang="Bash" data-show-lang="0"><code>+--------+----------+------------------------+------------------+------------------------------------------------------------------------+---------------------------------------------+
| Domain | Method   | URI                    | Name             | Action                                                                 | Middleware                                  |
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+---------------------------------------------+
|        | POST     | login                  |                  | App\Http\Controllers\Auth\LoginController@login                        | web                                         |
|        |          |                        |                  |                                                                        | App\Http\Middleware\RedirectIfAuthenticated |
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+---------------------------------------------+</code></pre></div>



<p>　login()は AuthenticatesUsersクラスから継承されたメソッドです。しかし、login()メソッドによるアプリケーションへのログインには、ユーザーIDとパスワードが必要になるため、ユーザーIDのみでログインができる、AuthクラスのloginUsingId()メソッドを使用します。</p>



<h3 class="wp-block-heading" id="ユーザー登録"><span id="toc8">ユーザー登録</span></h3>



<p> Authでのユーザー登録は、RegisterControllerクラスのregister()メソッドで行っているので、コールバック処理時にregister()メソッドを呼び出すようにします。</p>



<div class="hcb_wrap"><pre class="prism off-numbers lang-bash" data-lang="Bash" data-show-lang="0"><code>+--------+----------+------------------------+------------------+------------------------------------------------------------------------+---------------------------------------------+
| Domain | Method   | URI                    | Name             | Action                                                                 | Middleware                                  |
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+---------------------------------------------+
|        | POST     | register               |                  | App\Http\Controllers\Auth\RegisterController@register                  | web                                         |
|        |          |                        |                  |                                                                        | App\Http\Middleware\RedirectIfAuthenticated |
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+---------------------------------------------+</code></pre></div>



<h3 class="wp-block-heading" id="作成したコールバック処理"><span id="toc9">作成したコールバック処理</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="App/Http/Controllers/Auth/LoginController.php" data-lang="PHP"><code>public function callback()
{
    $_ = Socialite::driver(&#39;google&#39;)-&gt;stateless()-&gt;user();
    $user = User::where(&#39;email&#39;,$_-&gt;email)-&gt;first(); // 認証プロバイダからの戻り値から、アプリケーションのログインIDを取得する

    if (! empty($user))
    {
        Auth::loginUsingId($user-&gt;id);      // ログインIDのみでアプリケーションにログインする。
        return redirect($this-&gt;redirectTo); // ログイン後のリダイレクト
    }

    $request = new Request ;
    $request-&gt;merge([
        &#39;name&#39; =&gt; $_-&gt;name,
        &#39;email&#39; =&gt; $_-&gt;email,
    ]);

    $regist = new RegisterController;
    return $regist-&gt;register($request) ;
}</code></pre></div>



<h2 class="wp-block-heading" id="ルーティングを設定する"><span id="toc10">ルーティングを設定する</span></h2>



<p>　認証プロバイダからコールバックされたときにだけ、アプリケーションへのログインやユーザー登録をさせるようにするため、ルーティングを変更します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="routes/web.php" data-lang="PHP"><code>Auth::routes([
    &#39;register&#39; =&gt; false, // ユーザー登録はプロバイダからのコールバック時に限定する
    &#39;reset&#39; =&gt; false,    // パスワード初期化：認証プロバイダを利用するのに不活性化
    &#39;confirm&#39; =&gt; false,  // パスワード確認：認証プロバイダを利用するのに不活性化
    &#39;verify&#39; =&gt; false,   // メール認証：認証プロバイダを利用するのに不活性化
]);

Route::get(&#39;callback&#39;, &#39;\App\Http\Controllers\Auth\LoginController@callback&#39;); // 認証プロバイダからのコールバック
Route::post(&#39;login&#39; , function() {
    return redirect(&#39;login&#39;); // ログインは認証プロバイダからのコールバック時に限定する
}) ;
</code></pre></div>



<h2 class="wp-block-heading" id="まとめ"><span id="toc11">まとめ</span></h2>



<p>　以上で、googleアカウントでの認証後に、Laravelアプリケーションへのログインやユーザー登録できるようになります。</p>



<p>参考になればうれしいです。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ojisan2355.com/laravel_tips-5/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Laravel】丸ごとコピーして使える法人番号のバリデーション</title>
		<link>https://ojisan2355.com/laravel_tips-4/</link>
					<comments>https://ojisan2355.com/laravel_tips-4/#respond</comments>
		
		<dc:creator><![CDATA[おじさん2355]]></dc:creator>
		<pubDate>Sun, 10 Oct 2021 07:07:41 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Laravel]]></category>
		<guid isPermaLink="false">https://ojisan2355.com/?p=1240</guid>

					<description><![CDATA[　法人番号のチェックを行うプログラムは様々なサイトに記載されていましたが、Laravelのバリデーションルールの作成方法を記載した記事がなかったので、記載することにしました。 ここで紹介するのは法人番号のバリデーションの [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>　法人番号のチェックを行うプログラムは様々なサイトに記載されていましたが、Laravelのバリデーションルールの作成方法を記載した記事がなかったので、記載することにしました。</p>



<p>ここで紹介するのは法人番号のバリデーションの作成方法ですが、その他の<strong><span class="marker">オリジナルのバリデーションルールを作成する</span></strong>のにも役に立ちます。</p>



<div class="wp-block-cocoon-blocks-label-box-1 label-box block-box has-border-color has-light-blue-border-color"><div class="label-box-label block-box-label box-label"><span class="label-box-label-text block-box-label-text box-label-text">この記事でできること</span></div><div class="label-box-content block-box-content box-content">
<ul class="wp-block-list"><li>デフォルトのバリデーションルールと同じように使える、オリジナルのバリデーションルールを作成できる。</li><li>法人番号のバリデーションルールを作成できる。</li></ul>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="app/Http/Requests/JcnTest.php" data-lang="PHP"><code>    public function rules()
    {
        return [
            // 「jcn」がオリジナルのバリデーションルール
            &#39;houjin_bangou&#39; =&gt; [&#39;required&#39;,&#39;digits:13&#39;,&#39;bail&#39;,&#39;jcn&#39;], 
        ];
    }</code></pre></div>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="app/Http/Requests/JcnTest.php" data-lang="PHP"><code>    public function messages()
    {
        return [
            &#39;houjin_bangou.jcn&#39; =&gt; &#39;:attributeの入力値に誤りがあります。&#39;,
        ];
    }</code></pre></div>
</div></div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-14"><label class="toc-title" for="toc-checkbox-14">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">バリデーションルールクラスを作成する</a><ol><li><a href="#toc2" tabindex="0">ルールクラスのひな型を作成する</a></li><li><a href="#toc3" tabindex="0">バリデーションルールを記載する</a></li><li><a href="#toc4" tabindex="0">バリデーションエラー時のメッセージを記載する</a></li></ol></li><li><a href="#toc5" tabindex="0">デフォルトのバリデーションルール同様に使えるようにする</a><ol><li><a href="#toc6" tabindex="0">サービスプロバイダクラスのひな型を作成する</a></li><li><a href="#toc7" tabindex="0">bootメソッドにバリデーションのルール追加(バリデータの拡張)を記載する</a></li><li><a href="#toc8" tabindex="0">作成したサービスプロバイダを追加する</a></li></ol></li><li><a href="#toc9" tabindex="0">完成</a></li><li><a href="#toc10" tabindex="0">ちなみに</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading" id="バリデーションルールクラスを作成する"><span id="toc1">バリデーションルールクラスを作成する</span></h2>



<h3 class="wp-block-heading" id="ルールクラスのひな型を作成する"><span id="toc2">ルールクラスのひな型を作成する</span></h3>



<p>　オリジナルのバリデーションルールのクラスファイルは、app/Rules配下に作成します。<br>クラスファイルのひな型は、下記のコマンドで作成します。</p>



<div class="hcb_wrap"><pre class="prism off-numbers lang-bash" data-lang="Bash" data-show-lang="0"><code>&gt; php artisan make:rule Jcn
※「Jcn」はクラス名です。好きな名前を指定することができます。</code></pre></div>



<p>　ひな形の作成が成功すると、app/Rules配下に以下のファイルが作成されます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="app/Rules/Jcn.php" data-lang="PHP"><code>&lt;?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class Jcn implements Rule
{
    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        //
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return &#39;The validation error message.&#39;;
    }
}</code></pre></div>



<p>このファイルに、オリジナルのバリデーションルールを記載していきます。</p>



<h3 class="wp-block-heading" id="バリデーションルールを記載する"><span id="toc3">バリデーションルールを記載する</span></h3>



<p>　<a rel="noopener" href="https://www.houjin-bangou.nta.go.jp/setsumei/pamphlet/images/houjinbangou_gaiyou.pdf" data-type="URL" data-id="https://www.houjin-bangou.nta.go.jp/setsumei/pamphlet/images/houjinbangou_gaiyou.pdf" target="_blank">法人番号の仕様<span class="fa fa-external-link external-icon anchor-icon"></span></a>に基づいて、バリデーションルールを記載します。<br>バリデーションのOK・NGの判定ロジックは、passes()メソッドに記載します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="app/Rules/Jcn.php" data-lang="PHP"><code>    public function passes($attribute, $value)
    {
        return 
            preg_match(&#39;/^[1-9][0-9]{12}$/&#39;,$value) &&   // 1～9で始まる13桁の数字
            $this-&gt;Error_judgment_by_check_digit($value) // チェックディジットによる判定(後述)
        ;
    }</code></pre></div>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="app/Rules/Jcn.php" data-lang="PHP"><code>    private function Error_judgment_by_check_digit($value)
    {
        // 最初の１桁目が検査用数字(チェックディジット)
        $check_digit = substr($value,0,1) ;   

        // 最初の１桁目を除く１２桁の番号が基礎番号
        $basic_number = substr($value,1,12) ; 

        $sum_even_digit = 0;  // 最下位から偶数桁の和
        $sum_odd_digit = 0;   // 最下位から奇数桁の和

        for ($i = 1 ; $i &lt;= 12 ; $i++)
        {
            // 最下位から{$i}桁目の数字
            $digit = substr($basic_number, - $i , 1) ; 

            if ($i % 2 == 0) {
                // 最下位から偶数桁の和
                $sum_even_digit += $digit; 
            } else {
                // 最下位から奇数桁の和
                $sum_odd_digit += $digit ;
            }
        }

        // 基礎番号から算出したチェックディジット
        $calculeated_check_digit = 9 - (($sum_even_digit * 2 + $sum_odd_digit) % 9) ; 

        // 「検査用数字＝基礎番号から算出したチェックディジット」であれば正しい
        return ($check_digit == $calculeated_check_digit) ;

    }</code></pre></div>



<p>　チェックディジットの判定は少々複雑なので、ここでは関数を作成しましたが、passes()内に直接記載しても動作に影響はありません。</p>



<h3 class="wp-block-heading" id="バリデーションエラー時のメッセージを記載する"><span id="toc4">バリデーションエラー時のメッセージを記載する</span></h3>



<p>　バリデーションエラー時のメッセージは、message()に記載します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="app/Rules/Jcn.php" data-lang="PHP"><code>    public function message()
    {
        return &#39;:attributeに誤りがあります。番号が正しいかご確認ください。&#39;;
    }</code></pre></div>



<p>　ちなみに、message()を下記のように記載することで、言語別のエラーメッセージを表示させることができます。(※使用言語は、config/app.php のlocaleで設定します)</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="app/Rules/Jcn.php" data-lang="PHP"><code>    public function message()
    {
        return trans(&#39;validation.jcn&#39;);
    }</code></pre></div>



<p>　表示するエラーメッセージは、resources/lang/{locale}/validation.phpに記載します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="resources/lang/ja/validation.php" data-lang="PHP"><code>return [
    &#39;jcn&#39;                  =&gt; &#39;:attributeに誤りがあります。番号が正しいかご確認ください。&#39;,</code></pre></div>



<h2 class="wp-block-heading" id="デフォルトのバリデーションルール同様に使えるようにする"><span id="toc5">デフォルトのバリデーションルール同様に使えるようにする</span></h2>



<p>　以上の設定を行うと、作成したバリデーションルールクラスを利用することができます。<br>例えば、FormRequestクラスのrules()に以下のように記載することで、法人番号によるバリデーションを行うことができます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="app/Http/Requests/JcnTest.php" data-lang="PHP"><code>use App\Rules\Jcn; // 作成したルールをuseする。

    public function rules()
    {
        return [
            &#39;houjin_bangou&#39; =&gt; [&#39;required&#39;,&#39;digits:13&#39;,&#39;bail&#39;,new Jcn], // 「new Jcn」でルールを適用する。
        ];
    }</code></pre></div>



<p>　しかしこの方法だと、「required」「digits:」のようなデフォルトのバリデーションルールのように、messages()でバリデーションエラーメッセージを<span class="marker-under">カスタマイズすることができません</span>。</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="718" height="157" src="https://ojisan2355.com/wp-content/uploads/2021/10/2021-10-09_15h50_51.png" alt="" class="wp-image-1272" srcset="https://ojisan2355.com/wp-content/uploads/2021/10/2021-10-09_15h50_51.png 718w, https://ojisan2355.com/wp-content/uploads/2021/10/2021-10-09_15h50_51-300x66.png 300w" sizes="(max-width: 718px) 100vw, 718px" /></figure></div>



<p>　そこで、<a rel="noopener" href="https://readouble.com/laravel/8.x/ja/providers.html" data-type="URL" data-id="https://readouble.com/laravel/8.x/ja/providers.html" target="_blank">サービスプロバイダ<span class="fa fa-external-link external-icon anchor-icon"></span></a>を利用してバリデータの拡張を行い、バリデーションルールを追加します。</p>



<h3 class="wp-block-heading" id="サービスプロバイダクラスのひな型を作成する"><span id="toc6">サービスプロバイダクラスのひな型を作成する</span></h3>



<p>　オリジナルのサービスプロバイダのクラスファイルは、app/Providers配下に作成します。<br>クラスファイルのひな型は、バリデーションルール同様「php artisan」を使用します。</p>



<div class="hcb_wrap"><pre class="prism off-numbers lang-bash" data-lang="Bash" data-show-lang="0"><code>&gt; php artisan make:provider ValidationServiceProvider
※「ValidationServiceProvider」はクラス名です。好きな名前を指定することができます。</code></pre></div>



<p>　ひな形の作成が成功すると、app/Providers配下に以下のファイルが作成されます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="app/Providers/ValidationServiceProvider.php" data-lang="PHP"><code>&lt;?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class ValidationServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}
﻿</code></pre></div>



<p>　このファイルを使ってバリデータを拡張し、法人番号のバリデーションルールをデフォルトのバリデーションルール同じように使用できるようにします。</p>



<h3 class="wp-block-heading" id="bootメソッドにバリデーションのルール追加-バリデータの拡張-を記載する"><span id="toc7">bootメソッドにバリデーションのルール追加(バリデータの拡張)を記載する</span></h3>



<p>　サービスプロバイダのbootメソッドは、全サービスプロバイダの登録後に呼び出されるメソッドです。このbootメソッドに、バリデータの拡張を記載します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="app/Providers/ValidationServiceProvider.php" data-lang="PHP"><code>use Illuminate\Support\Facades\Validator;

    public function boot()
    {
        Validator::extend(&#39;jcn&#39;, &#39;App\Rules\Jcn@passes&#39;);
    }</code></pre></div>



<h3 class="wp-block-heading" id="作成したサービスプロバイダを追加する"><span id="toc8">作成したサービスプロバイダを追加する</span></h3>



<p>　作成したサービスプロバイダを、config/app.phpに記載します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="config/app.php" data-lang="PHP"><code>    &#39;providers&#39; =&gt; [
        Illuminate\View\ViewServiceProvider::class,</code></pre></div>



<h2 class="wp-block-heading" id="完成"><span id="toc9">完成</span></h2>



<p>　以上の設定を行うことで、法人番号のバリデーションルールはデフォルトのバリデーションルールと同じ記載方法で利用できるようになります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="app/Http/Requests/JcnTest.php" data-lang="PHP"><code>    public function rules()
    {
        return [
            &#39;houjin_bangou&#39; =&gt; [&#39;required&#39;,&#39;digits:13&#39;,&#39;bail&#39;,&#39;jcn&#39;],
        ];
    }</code></pre></div>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="app/Http/Requests/JcnTest.php" data-lang="PHP"><code>    public function messages()
    {
        return [
            &#39;houjin_bangou.jcn&#39; =&gt; &#39;:attributeの入力値に誤りがあります。&#39;,
        ];
    }
﻿</code></pre></div>



<h2 class="wp-block-heading" id="ちなみに"><span id="toc10">ちなみに</span></h2>



<p>　オリジナルのバリデーションルールを実装するにあたって、既存のバリデーションルールを活用したい場合は、Validatorファザードを使用することで実現できます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="app/Rules/Jcn.php" data-lang="PHP"><code>use Illuminate\Support\Facades\Validator;

    public function passes($attribute, $value)
    {
        $validator = Validator::make([$attribute =&gt; $value], [
            $attribute =&gt; [
                &#39;digits:13&#39;,       // 13桁の数字
                &#39;regex:/^[1-9]/&#39;], // 1～9で始まる
        ]) ;

        return 
            (! $validator-&gt;fails()) && 
            $this-&gt;Error_judgment_by_check_digit($value) // チェックディジットによる判定
        ;
    }</code></pre></div>



<p>以上、参考になればうれしいです。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ojisan2355.com/laravel_tips-4/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Laravel】session(セッション)内のデータをFormRequestでバリデーション</title>
		<link>https://ojisan2355.com/laravel_tips-3/</link>
					<comments>https://ojisan2355.com/laravel_tips-3/#respond</comments>
		
		<dc:creator><![CDATA[おじさん2355]]></dc:creator>
		<pubDate>Sat, 28 Aug 2021 06:25:32 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Laravel]]></category>
		<guid isPermaLink="false">https://ojisan2355.com/?p=1185</guid>

					<description><![CDATA[　Laravelには、受信データのバリデーションするための手段のひとつに、Requestクラスを拡張したFormRequestクラスがあります。 　FormRequestを使ってバリデーションを行うと、コントローラーのソ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>　Laravelには、受信データのバリデーションするための手段のひとつに、<span class="marker">Request</span>クラスを拡張した<span class="marker">FormRequest</span>クラスがあります。</p>



<p>　<span class="marker">FormRequest</span>を使ってバリデーションを行うと、コントローラーのソースコードをシンプルに記述できる便利なものですが、バリデーションできるのはPOSTのリクエストボディとGETのクエリパラメータのみです。<br>しかしコントローラーに渡されるデータは、POSTのリクエストボディとGETのクエリパラメータだけでなく、<span class="marker">session</span>(セッション)データやファイルだったりと多岐にわたります。</p>



<p>　 <span class="marker">session</span>(セッション)データをバリデーションすることはできるのでしょうか？</p>



<p><span class="fz-32px"><span class="bold-green"><span class="bold-red">　できます！！</span></span></span></p>



<p>　具体的には、<span class="marker">FormRequest</span>クラスの <span class="marker">validationData()</span>メソッドを拡張します。</p>



<p><span class="marker">FormRequest</span>クラスの <span class="marker">validationData()</span>メソッドは、以下のように<span class="marker">all()</span>メソッドでバリデーションデータの取り出しを行っています。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="Illuminate\Foundation\Http\FormRequest.php" data-lang="PHP"><code>    /**
     * Get data to be validated from the request.
     *
     * @return array
     */
    public function validationData()
    {
        return $this-&gt;all();
    }</code></pre></div>



<p> したがって、バリデーションデータに<span class="marker">session</span>(セッション)データ を追加するためには、次のように <span class="marker">validationData()</span>メソッドを拡張すればよいことがわかります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="App\Http\Request\myFormRequest.php" data-lang="PHP"><code>    public function validationData()
    {
        return array_merge(
            $this-&gt;all(),
            $this-&gt;session()-&gt;all()
        );
    }
﻿</code></pre></div>



<p>参考になればうれしいです。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ojisan2355.com/laravel_tips-3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Laravel】バージョンを確認する</title>
		<link>https://ojisan2355.com/laravel_tips-10/</link>
		
		<dc:creator><![CDATA[おじさん2355]]></dc:creator>
		<pubDate>Sun, 15 May 2022 08:39:12 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Laravel]]></category>
		<guid isPermaLink="false">https://ojisan2355.com/?p=1601</guid>

					<description><![CDATA[Laravelのプロジェクトを扱っていると、「今使っているLaravelのバージョンは何？」という場面がよくあります。本記事では、Laravelのバージョンを確認する3つの方法を実行例付きで解説します。パッケージ互換性チ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Laravelのプロジェクトを扱っていると、「今使っているLaravelのバージョンは何？」という場面がよくあります。<br>本記事では、Laravelのバージョンを確認する3つの方法を実行例付きで解説します。パッケージ互換性チェックやバージョンアップ時に役立ちます。</p>



<div class="wp-block-cocoon-blocks-label-box-1 label-box block-box has-border-color has-light-blue-border-color cocoon-block-label-box"><div class="label-box-label block-box-label box-label"><span class="label-box-label-text block-box-label-text box-label-text">この記事でできること</span></div><div class="label-box-content block-box-content box-content">
<ul class="wp-block-list">
<li>artisanコマンドでバージョンを確認できる</li>



<li>composerコマンドでバージョンを確認できる</li>



<li>ファイル（composer.json）からバージョンを確認できる</li>



<li>バージョン確認が必要なケースを理解できる</li>
</ul>
</div></div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-18"><label class="toc-title" for="toc-checkbox-18">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">artisanコマンドで確認する（最も簡単な方法）</a></li><li><a href="#toc2" tabindex="0">composerコマンドで確認する（依存パッケージ一覧から）</a></li><li><a href="#toc3" tabindex="0">composer.jsonファイルから確認する（開発環境がない場合）</a></li><li><a href="#toc4" tabindex="0">バージョン確認が必要になるケース</a></li><li><a href="#toc5" tabindex="0">まとめ</a></li><li><a href="#toc6" tabindex="0">おまけ・参考</a><ol><li><a href="#toc7" tabindex="0">おまけ：artisanコマンドの主なオプション一覧</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading" id="入力フォーム"><span id="toc1">artisanコマンドで確認する（最も簡単な方法）</span></h2>



<div class="hcb_wrap"><pre class="prism line-numbers lang-bash" data-lang="Bash" data-show-lang="1"><code>php artisan --version
# または
php artisan -V</code></pre></div>



<p>出力例：</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain" data-file="nginx" data-show-lang="1"><code>Laravel Framework 8.67.0</code></pre></div>



<ul class="wp-block-list">
<li><code>php artisan</code> はLaravelの管理コマンドツール</li>



<li><code>-V</code> は <code>--version</code> の短縮形</li>



<li>ほぼすべての環境で使える</li>
</ul>



<h2 class="wp-block-heading"><span id="toc2">composerコマンドで確認する（依存パッケージ一覧から）</span></h2>



<div class="hcb_wrap"><pre class="prism line-numbers lang-bash" data-lang="Bash" data-show-lang="1"><code>composer show laravel/framework</code></pre></div>



<p>出力例：</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain" data-file="yaml" data-show-lang="1"><code>name     : laravel/framework
versions : * 8.67.0</code></pre></div>



<ul class="wp-block-list">
<li>Laravelを含むすべての依存パッケージの情報が取得できる</li>



<li>PHP Composerが必要</li>
</ul>



<h2 class="wp-block-heading"><span id="toc3">composer.jsonファイルから確認する（開発環境がない場合）</span></h2>



<ol class="wp-block-list">
<li>プロジェクトのルートディレクトリにある composer.json を開く</li>



<li>require の中の laravel/framework のバージョンを確認する</li>
</ol>



<p>例：</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-json" data-lang="JSON" data-show-lang="1"><code>&quot;require&quot;: {
    &quot;laravel/framework&quot;: &quot;^8.0&quot;
}</code></pre></div>



<ul class="wp-block-list">
<li>この場合、実際のインストールバージョンは composer.lock または composer show で確認</li>
</ul>



<h2 class="wp-block-heading"><span id="toc4">バージョン確認が必要になるケース</span></h2>



<ul class="wp-block-list">
<li>Laravelをアップグレードするとき</li>



<li>パッケージ導入時の互換性確認</li>



<li>セキュリティアップデートの必要性確認</li>



<li>チーム開発で環境統一する場合</li>
</ul>



<h2 class="wp-block-heading"><span id="toc5">まとめ</span></h2>



<p>Laravelのバージョン確認は、php artisan &#8211;version が最も手軽です。<br>詳細な情報が欲しい場合は composer show、開発環境がない場合は composer.json を確認しましょう。</p>



<h2 class="wp-block-heading"><span id="toc6">おまけ・参考</span></h2>



<h3 class="wp-block-heading"><span id="toc7">おまけ：artisanコマンドの主なオプション一覧</span></h3>



<p>「php artisan」を実行すると、artisanに指定できる引数のリストが出ます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-bash" data-lang="Bash" data-show-lang="1"><code>php artisan</code></pre></div>



<p>出力例：</p>



<div class="hcb_wrap"><pre class="prism off-numbers lang-plain" data-file="nginx" data-show-lang="1"><code>Laravel Framework 8.67.0

Usage:
  command [options] [arguments]

Options:
  -h, --help            Display help for the given command. When no command is given display help for the list command
  -q, --quiet           Do not output any message
  -V, --version         Display this application version
      --ansi|--no-ansi  Force (or disable --no-ansi) ANSI output
  -n, --no-interaction  Do not ask any interactive question
      --env[=ENV]       The environment the command should run under
  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Available commands:
  clear-compiled       Remove the compiled class file
  db                   Start a new database CLI session
  down                 Put the application into maintenance / demo mode
  env                  Display the current framework environment
  help                 Display help for a command
  inspire              Display an inspiring quote
  list                 List commands
  migrate              Run the database migrations
  optimize             Cache the framework bootstrap files
  serve                Serve the application on the PHP development server
  test                 Run the application tests
  tinker               Interact with your application
  ui                   Swap the front-end scaffolding for the application
  up                   Bring the application out of maintenance mode
 auth
  auth:clear-resets    Flush expired password reset tokens
 cache
  cache:clear          Flush the application cache
  cache:forget         Remove an item from the cache
  cache:table          Create a migration for the cache database table
 config
  config:cache         Create a cache file for faster configuration loading
  config:clear         Remove the configuration cache file
 db
  db:seed              Seed the database with records
  db:wipe              Drop all tables, views, and types
 event
  event:cache          Discover and cache the application&#39;s events and listeners
  event:clear          Clear all cached events and listeners
  event:generate       Generate the missing events and listeners based on registration
  event:list           List the application&#39;s events and listeners
 key
  key:generate         Set the application key
 make
  make:cast            Create a new custom Eloquent cast class
  make:channel         Create a new channel class
  make:command         Create a new Artisan command
  make:component       Create a new view component class
  make:controller      Create a new controller class
  make:event           Create a new event class
  make:exception       Create a new custom exception class
  make:factory         Create a new model factory
  make:job             Create a new job class
  make:listener        Create a new event listener class
  make:mail            Create a new email class
  make:middleware      Create a new middleware class
  make:migration       Create a new migration file
  make:model           Create a new Eloquent model class
  make:notification    Create a new notification class
  make:observer        Create a new observer class
  make:policy          Create a new policy class
  make:provider        Create a new service provider class
  make:request         Create a new form request class
  make:resource        Create a new resource
  make:rule            Create a new validation rule
  make:seeder          Create a new seeder class
  make:test            Create a new test class
 migrate
  migrate:fresh        Drop all tables and re-run all migrations
  migrate:install      Create the migration repository
  migrate:refresh      Reset and re-run all migrations
  migrate:reset        Rollback all database migrations
  migrate:rollback     Rollback the last database migration
  migrate:status       Show the status of each migration
 model
  model:prune          Prune models that are no longer needed
 notifications
  notifications:table  Create a migration for the notifications table
 optimize
  optimize:clear       Remove the cached bootstrap files
 package
  package:discover     Rebuild the cached package manifest
 queue
  queue:batches-table  Create a migration for the batches database table
  queue:clear          Delete all of the jobs from the specified queue
  queue:failed         List all of the failed queue jobs
  queue:failed-table   Create a migration for the failed queue jobs database table
  queue:flush          Flush all of the failed queue jobs
  queue:forget         Delete a failed queue job
  queue:listen         Listen to a given queue
  queue:monitor        Monitor the size of the specified queues
  queue:prune-batches  Prune stale entries from the batches database
  queue:prune-failed   Prune stale entries from the failed jobs table
  queue:restart        Restart queue worker daemons after their current job
  queue:retry          Retry a failed queue job
  queue:retry-batch    Retry the failed jobs for a batch
  queue:table          Create a migration for the queue jobs database table
  queue:work           Start processing jobs on the queue as a daemon
 route
  route:cache          Create a route cache file for faster route registration
  route:clear          Remove the route cache file
  route:list           List all registered routes
 sail
  sail:install         Install Laravel Sail&#39;s default Docker Compose file
  sail:publish         Publish the Laravel Sail Docker files
 schedule
  schedule:list        List the scheduled commands
  schedule:run         Run the scheduled commands
  schedule:test        Run a scheduled command
  schedule:work        Start the schedule worker
 schema
  schema:dump          Dump the given database schema
 session
  session:table        Create a migration for the session database table
 storage
  storage:link         Create the symbolic links configured for the application
 stub
  stub:publish         Publish all stubs that are available for customization
 ui
  ui:auth              Scaffold basic login and registration views and routes
  ui:controllers       Scaffold the authentication controllers
 vendor
  vendor:publish       Publish any publishable assets from vendor packages
 view
  view:cache           Compile all of the application&#39;s Blade templates
  view:clear           Clear all compiled view files
</code></pre></div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【Laravel】バリデーションルールをJSONファイルから取り込む</title>
		<link>https://ojisan2355.com/laravel_tips-9/</link>
		
		<dc:creator><![CDATA[おじさん2355]]></dc:creator>
		<pubDate>Sun, 10 Apr 2022 08:23:25 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Laravel]]></category>
		<guid isPermaLink="false">https://ojisan2355.com/?p=1569</guid>

					<description><![CDATA[目次 入力フォームコントローラーFormRequestバリデーションルール(JSONファイル)id=100の場合のバリデーションルールid=200の場合のバリデーションルール 入力フォーム コントローラー FormReq [&#8230;]]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-cocoon-blocks-label-box-1 label-box block-box has-border-color has-light-blue-border-color"><div class="label-box-label block-box-label box-label"><span class="label-box-label-text block-box-label-text box-label-text">この記事でできること</span></div><div class="label-box-content block-box-content box-content">
<ul class="wp-block-list"><li>バリデーションルールを外部のファイルから取り込むことができる</li><li>バリデーションルールをJSONファイルの形式で記述できる</li><li>フォームの入力値によって、バリデーションルールを使い分けることができる</li></ul>
</div></div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-20"><label class="toc-title" for="toc-checkbox-20">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">入力フォーム</a></li><li><a href="#toc2" tabindex="0">コントローラー</a></li><li><a href="#toc3" tabindex="0">FormRequest</a></li><li><a href="#toc4" tabindex="0">バリデーションルール(JSONファイル)</a><ol><li><a href="#toc5" tabindex="0">id=100の場合のバリデーションルール</a></li><li><a href="#toc6" tabindex="0">id=200の場合のバリデーションルール</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading" id="入力フォーム"><span id="toc1">入力フォーム</span></h2>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="resources\views\DynamicValidation\index.blade.php" data-lang="PHP"><code>@extends(&#39;layouts.app&#39;)

@section(&#39;content&#39;)
&lt;div class=&quot;container&quot;&gt;
&lt;form action=&quot;DynamicValidation&quot; method=&quot;post&quot;&gt;
    @csrf
    &lt;table&gt;
        &lt;tr&gt;
            &lt;th&gt;ＩＤ&lt;/th&gt;
            &lt;td&gt;
                &lt;input id=&quot;id&quot; name=&quot;id&quot; type=&quot;text&quot; value=&quot;{{ old(&#39;id&#39;,$id) }}&quot;&gt;
                @error(&#39;id&#39;)
                    &lt;span class=&quot;alert alert-danger&quot;&gt;{{ $message }}&lt;/span&gt;
                @enderror
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;th&gt;値１&lt;/th&gt;
            &lt;td&gt;
                &lt;input id=&quot;value_1&quot; name=&quot;value_1&quot; type=&quot;text&quot; value=&quot;{{ old(&#39;value_1&#39;,$value_1) }}&quot;&gt;
                @error(&#39;value_1&#39;)
                    &lt;span class=&quot;alert alert-danger&quot;&gt;{{ $message }}&lt;/span&gt;
                @enderror
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;th&gt;値２&lt;/th&gt;
            &lt;td&gt;
                &lt;input id=&quot;value_2&quot; name=&quot;value_2&quot; type=&quot;text&quot; value=&quot;{{ old(&#39;value_2&#39;,$value_2) }}&quot;&gt;
                @error(&#39;value_2&#39;)
                    &lt;span class=&quot;alert alert-danger&quot;&gt;{{ $message }}&lt;/span&gt;
                @enderror
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/table&gt;
    &lt;button type=&quot;submit&quot;&gt;送信&lt;/button&gt;
&lt;/form&gt;
&lt;/div&gt;
@endsection</code></pre></div>



<h2 class="wp-block-heading"><span id="toc2">コントローラー</span></h2>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="app\Http\Controllers\DynamicValidation\DynamicValidationController.php" data-lang="PHP"><code>&lt;?php

namespace App\Http\Controllers\DynamicValidation;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Http\Requests\DynamicValidation\DynamicValidationPost;

class DynamicValidationController extends Controller
{
    public function index(Request $request)
    {
        return view(&#39;DynamicValidation.index&#39;)
        -&gt;with([
            &#39;id&#39; =&gt; $request-&gt;session()-&gt;get(&#39;id&#39;),
            &#39;value_1&#39; =&gt; $request-&gt;session()-&gt;get(&#39;value_1&#39;),
            &#39;value_2&#39; =&gt; $request-&gt;session()-&gt;get(&#39;value_2&#39;)
        ])
    ;

    }

    public function post(DynamicValidationPost $request)
    {
        return redirect(&#39;DynamicValidation&#39;)
            -&gt;with([
                &#39;id&#39; =&gt; $request-&gt;id,
                &#39;value_1&#39; =&gt; $request-&gt;value_1,
                &#39;value_2&#39; =&gt; $request-&gt;value_2
            ])
        ;
    }

}</code></pre></div>



<h2 class="wp-block-heading"><span id="toc3">FormRequest</span></h2>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="app\Http\Requests\DynamicValidation\DynamicValidationPost.php" data-lang="PHP"><code>&lt;?php

namespace App\Http\Requests\DynamicValidation;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
use Storage;

class DynamicValidationPost extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return array_merge(
            [
                &#39;id&#39; =&gt; [
                    &#39;required&#39;,
                    Rule::in([&#39;100&#39;, &#39;200&#39;, &#39;300&#39;])
                ]
            ],
            $this-&gt;getRuleFiile($this-&gt;id)
        );
    }

    private function getRuleFiile($id)
    {
        if (! Storage::exists(&quot;Validation/${id}.json&quot;))
        {
            return [] ;
        }
        $file = Storage::get(&quot;Validation/${id}.json&quot;);
        $json = json_decode($file,true);
        return $json;

    }
}</code></pre></div>



<h2 class="wp-block-heading"><span id="toc4">バリデーションルール(JSONファイル)</span></h2>



<h3 class="wp-block-heading"><span id="toc5">id=100の場合のバリデーションルール</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="storage\app\Validation\100.json" data-lang="PHP"><code>{
    &quot;value_1&quot;:[
        &quot;required&quot;,
        &quot;string&quot;
    ],
    &quot;value_2&quot;:[
        &quot;required&quot;,
        &quot;integer&quot;,
        &quot;max:100&quot;
    ]
}</code></pre></div>



<h3 class="wp-block-heading"><span id="toc6">id=200の場合のバリデーションルール</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="storage\app\Validation\200.json" data-lang="PHP"><code>{
    &quot;value_1&quot;:[
        &quot;required&quot;,
        &quot;string&quot;
    ],
    &quot;value_2&quot;:[
        &quot;required&quot;,
        &quot;integer&quot;,
        &quot;max:200&quot;
    ]
}</code></pre></div>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
