「kaz_PHP自動作成◎自動生成お助けTOOL」・前回UPの修正漏れかつ、画面を、スマホ対応!レスポンシブサイトにした。VectorからOKが来た。
「kaz_PHP自動作成◎自動生成お助けTOOL」・前回UPの修正漏れかつ、画面を、スマホ対応!レスポンシブサイトにしたのものを掲載依頼していた件。VectorからOKが来た。
これで、たぶんPHP8.1.6対応出来ただろう。さらにそこそこの、スマホ対応!レスポンシブサイトになっただろう。
このあと、
kaz_javaSpringBootプログラム自動作成◎自動生成の詳細情報 : Vector ソフトを探す!
も、今回、スマホ対応!レスポンシブサイトに使用したCSSで、もうちょっと見栄えのするスマホ対応!レスポンシブサイトに変える。
いままでは、ハンバーガーメニューにしたぐらいなので、検索画面のとことか登録、更新画面のとことかよくなるはず。うれしいな。
www.vector.co.jp
「kaz_PHP自動作成◎自動生成お助けTOOL」・前回UPの修正漏れかつ、画面を、スマホ対応!レスポンシブサイトにしたので、VectorにUPした。
20:06
①前回「kaz_PHP自動作成◎自動生成お助けTOOL」をphp8.1.6用のXAMPP(xampp-windows-x64-8.1.6-0-VS16-installer.exe)で動く様にした時の修正漏れと、画面を、スマホ対応!レスポンシブサイトにした修正を行ったので、Vectorに載せた。OKがきたらまた報告する予定。
www.vector.co.jp
■スマホ対応!レスポンシブサイト
①自動生成した「企業情報検索画面」のPC側画像
②自動生成した「企業情報検索画面」のスマホ側画像
■修正内容は
・2.1(202209251800) 1.前回バージョン2.0にUpしたもので、修正漏れのため、ユーザー側画面で落ちる。のを修正した。 ①値を参照している個所を修正する 例:$_SESSION['u_login_id_login']→arryVal($_SESSION,'u_login_id_login') $_SESSION['login_type']→arryVal($_SESSION,'login_type') 補足:$_SESSION['search']は修正しなくても必ず値が入るのでOK 置換方法:\$_SESSION\[([^]]+)\]←値を入れている項目でないことを確認しながら ↓ arryVal($_SESSION, $1) ②ユーザー側のDBデータ追加で「$res = 」が抜けていて、ワーニングになる。のを修正 例:dbPrepareExeInsert($db, 't_corp', $columns); ↓ $res = dbPrepareExeInsert($db, 't_corp', $columns); 2.CSSでスマホ対応!レスポンシブサイトにした。スマホで表示する時、ドロワーメニューにした。 かつ、スマホ表示の時、テーブル表示(tbl-01クラス、tbl-02クラス)を見やすくした。 (CSSでスマホ対応!レスポンシブサイト) ■/resources/static/css/layout.css及び、 /resources/static/admin/css/layout.css <<追加 start>> 【6】スマホ対応!レスポンシブサイト <<追加 end>> ・・・ #wrapper { <<削除 start>> width: 100%; <<削除 end>> <<追加 start>> min-width: 100%; display: inline-block; <<追加 end>> margin: 0 auto; text-align: left; } ・・・ #contents { clear:both; background: url(../img/bg_contents.gif) repeat-x left top; background-color:#E6E6E6; padding:20px 0 20px 0; <<追加 start>> min-width: 100%; display: inline-block; <<追加 end>> } ・・・ <<追加 start>> /* ============================================================= ■□■ 6. スマホ対応!レスポンシブサイト ■□■ ============================================================= */ @media screen and (max-width: 480px) { /* ハンバーガーメニュー */ .hamburger { width: 30px; height: 30px; background: #205386; padding: 10px; display: flex; justify-content: center; align-items: center; position: absolute; z-index: 999; } .hamburger:hover { cursor: pointer; } .hamburger span { background: #fff; width: 25px; height: 2px; position: absolute; transition: 0.3s ease-out; } .hamburger span:nth-of-type(1) { top: 15px; } .hamburger span:nth-of-type(3) { bottom: 15px; } /* ハンバーガーメニューを左側に隠す */ .drawer-list { position: absolute; transform: translate(-300px); transition: 0.3s ease-out; } .drawer-list.open { transform: translate(0); transition: 0.3s ease-out; } #main { background-color: #990000; margin:0 10px 0 5px; background-color:#FFFFFF; border:solid 1px #C6C6C6; padding:15px 15px 40px 15px; font-size: 8px; } .sysTitle { font-size: small; color:#FFFFFF; text-align: center; } /* ------------- tbl-01(thが縦) ------------- */ .tbl-01 { /* width:99%; */ max-width: 373px; /* white-space: nowrap; */ border-top:solid 1px #B5B5B5; border-left:solid 1px #B5B5B5; border-right:solid 1px #B5B5B5; margin-bottom:10px; border-collapse:separate; border-spacing:0; } .tbl-01 th { display:block; padding:1px 3px 1px 5px; text-align:left; border-bottom:solid 1px #B5B5B5; border-right:solid 1px #B5B5B5; border-top:solid 1px #FFFFFF; border-left:solid 1px #FFFFFF; background-color:#DAECF3; width:auto /* vertical-align: top; vertical-align:middle; */ } .tbl-01 td { display:block; padding:1px 3px 1px 5px; border-bottom:solid 1px #B5B5B5; font-weight:normal; word-break:break-all; } .tbl-01 th.bg-blue { display:block; padding:3px 3px 3px 5px; text-align:left; border-bottom:solid 1px #B5B5B5; border-right:solid 1px #B5B5B5; border-top:solid 1px #FFFFFF; border-left:solid 1px #FFFFFF; background-color:#BECBD4; width:auto /* vertical-align: top; vertical-align:middle; */ } .scroll_table { max-width: 373px; overflow-x: auto; } .scroll_table .tbl-02 { white-space: nowrap; /* width:99%; */ border-top:solid 1px #B5B5B5; border-left:solid 1px #B5B5B5; margin-bottom:10px; border-collapse:separate; border-spacing:0; } .scroll_table::-webkit-scrollbar { height: 10px; /* スクロールバーの高さ */ } .scroll_table::-webkit-scrollbar-thumb { background: #aaa; /* ツマミの色 */ } .scroll_table::-webkit-scrollbar-track { background: #ddd; /* トラックの色 */ } } @media screen and (min-width: 480px) { .hamburger { display:none; } .drawer-list { display:block; } .sysTitle { font-size: large; color:#FFFFFF; text-align: center; } } /* ハンバーガーメニューにactiveクラスが付いているときは三本線ではなく×印にする */ .hamburger.active span:nth-of-type(1) { transform: translateY(9px) rotate(-45deg); transition: 0.3s ease-out; } .hamburger.active span:nth-of-type(3) { transform: translateY(-9px) rotate(45deg); transition: 0.3s ease-out; } .hamburger.active span:nth-of-type(2) { opacity: 0; } ■「class="tbl-02"」を「<div class="scroll_table">」の下に置いた これにより、スマホ表示の一覧は横スクロールする。 <div class="scroll_table"> <!-- tbl-02 start --> <table cellpadding="0" cellspacing="0" class="tbl-02"> ・・・ <!-- tbl-02 end --> </div> 3.ログイン画面をCSSでスマホ対応!レスポンシブサイトにした。 ①\作成先フォルダ\.kazphp\view\index.html ②\作成先フォルダ\.kazphp\view\admin\index.html
「kaz_PHP自動作成◎自動生成お助けTOOL」php8対応の掲載。VectorからOKが来た
「kaz_PHP自動作成◎自動生成お助けTOOL」php8対応の掲載。VectorからOKが来た
これで、PHP8.1.6で動く。ひと安心。
www.vector.co.jp
「kaz_PHP自動作成◎自動生成お助けTOOL」をphp8に対応したので、VectorにUPした。
17:20
①「kaz_PHP自動作成◎自動生成お助けTOOL」をphp8.1.6用のXAMPP(xampp-windows-x64-8.1.6-0-VS16-installer.exe)で動く様にした。
これから、Vectorに載せる。OKがきたらまた報告する予定。
www.vector.co.jp
php7.2→php8.1.6は、こんなに修正しないと動かない。なかなか大変だ~。
■Vectorに載せた修正履歴。(php7.2→php8.1.6バージョンアップ)
・202109191800 php8.1.6用のXAMPP(xampp-windows-x64-8.1.6-0-VS16-installer.exe)で動く様にした。 php7.2→php8.1.6VerUpに伴う以下のエラーなどに対応した。 ★エラー: Fatal error: Uncaught ArgumentCountError: Too few arguments to function userErrorHandler(), 4 passed in C:\xampp\htdocs\kaz\index.php on line 11 and exactly 5 expected in C:\xampp\htdocs\.kazphp\common.php:75 Stack trace: #0 C:\xampp\htdocs\kaz\index.php(11): userErrorHandler(2, 'Undefined array...', 'C:\\xampp\\htdocs...', 11) #1 {main} thrown in C:\xampp\htdocs\.kazphp\common.php on line 75 対処:php8では、引数$varsがなくなったので削除した。 解決: function userErrorHandler ($errno, $errmsg, $filename, $linenum, $vars) { ↓ function userErrorHandler ($errno, $errmsg, $filename, $linenum) { ★エラー: Notice: Only variables should be assigned by reference in C:\xampp\htdocs\kaz\admin\index.php on line 8 解決:&をなくした $o =& htmlspecialchars_r($_REQUEST); // output用(FORMからの入力値) ↓ $o = htmlspecialchars_r($_REQUEST); // output用(FORMからの入力値) ★エラー: Warning: Undefined array key "mode" in C:\xampp\htdocs\kaz\admin\index.php on line 11 解決:$_REQUEST['mode']のnullを考慮した。さらに、 ★エラー:http://localhost:3000/kaz/admin/ 画面に Warning: Undefined array key "login" in C:\xampp\htdocs\.kazphp\view\admin\index.html on line 52 表示された。配列に存在しない項目を参照するとワーニングになるらしい。 解決:$o['loginid']のnullを考慮した。 <?= $o['loginid']?> ↓ <?= arryVal($o, 'loginid')?> 手順: ①C:\xampp\htdocs\.kazphp\functions.phpに // 配列値取得 function arryVal ($vars, $itemName) { return $vars[$itemName] ?? ""; } を追加した。 ②html(hinagata\View)、php(\hinagata\Library\index.txt,\hinagata\Library\index_user.txt)を以下のように置換する \$err\['([^]]+)\] ↓ arryVal($err, $1) 及びhtml(hinagata\View) \$o\[([^]]+)\] ↓ arryVal($o, $1) 及びphp(inagata\Model以下のphp、txtおよび作成先フォルダ\.システムphpBasePgm以下のphp) \$_REQUEST\[([^]]+)\]←値を入れている項目でないことを確認しながら 但し ・unset($_REQUEST['KAZ_TOOL_token']);はこのままにしておく。 ・isset( $_REQUEST['pageID'] )以外の、「$_REQUEST['pageID']」は「$_REQUEST['pageID']??0」にする。 ↓ arryVal($_REQUEST, $1) そのほか、表示された。配列に存在しない項目を参照する箇所は修正した。(絶対、値が入っている場所はそのままにした) 補足:$_SERVERは現在のままでよい。(無いときはワーニングでよいので) ★エラー:”Non static method”エラー解消 解決:function → static functionに修正した C:\xampp\htdocs\.kazphp\common\AppCheckUtil.phpのメソッド修正 checkMoji checkDate checkDateFromTo checkStringCompareTo checkNumericCompareTo checkCodeValue checkNumeric checkDotNumeric typeOf getCharType getStringWidth checkPhoto checkIUPPhoto checkDateTime checkLrgCodeValue checkMidCodeValue checkSmlCodeValue C:\xampp\htdocs\.kazphp\common\TokenHandle.phpのメソッド修正 getTokenHtml isTokenValid C:\xampp\htdocs\.kazphp\common\AppSrchUtil.phpのメソッド修正 setSqlStrSub1 setSrchChkBoxArray C:\xampp\htdocs\.kazphp\common\AppHtmlUtil.phpのメソッド修正 getHTMLSelect getHTMLRadio getHTMLCheckBox getHTMLCheckBoxDispStr creJSvarCategory creJSvarAryLrgmidsmlAjaxKbn getHTMLSelectLrgPlus getHTMLSelectMidPlus getHTMLSelectSmlPlus ★エラー:C:\xampp\htdocs\.kazphp\common\AppCheckUtil.phpのエラー if( ($chartype & $type) == 0 ){で [{ "resource": "/c:/xampp/htdocs/.kazphp/common/AppCheckUtil.php", "owner": "_generated_diagnostic_collection_name_#1", "code": "1006", "severity": 8, "message": "Expected type 'null|bool|int|float|string'. Found '文字種を表す定数'.", "source": "intelephense", "startLineNumber": 618, "startColumn": 9, "endLineNumber": 618, "endColumn": 18 }]エラー 解決:ビット演算は(int)が必要らしい。入れたらOKになったから。 if( ($chartype & $type) == 0 ){で ↓ if( ((int)$chartype & $type) == 0 ){で ★エラー:C:\xampp\htdocs\.kazphp\common\AppDbCdUtil.phpのエラー $this->smlTblNm, $this->smlTblAriasNm, $this->smlKey1Item, $this->smlKey2Item, $this->smlKey3Item, $this->smlNmItem, $this->smlEngNmItem, $smlDelItem); [{ "resource": "/c:/xampp/htdocs/.kazphp/common/AppDbCdUtil.php", "owner": "_generated_diagnostic_collection_name_#1", "code": "1008", "severity": 8, "message": "Undefined variable '$smlDelItem'.", "source": "intelephense", "startLineNumber": 219, "startColumn": 147, "endLineNumber": 219, "endColumn": 158 }]エラー 解決: $smlDelItemを「$this->smlDelItem」に修正する $this->smlTblNm, $this->smlTblAriasNm, $this->smlKey1Item, $this->smlKey2Item, $this->smlKey3Item, $this->smlNmItem, $this->smlEngNmItem, $smlDelItem); ↓ $this->smlTblNm, $this->smlTblAriasNm, $this->smlKey1Item, $this->smlKey2Item, $this->smlKey3Item, $this->smlNmItem, $this->smlEngNmItem, $this->smlDelItem); と、同様のエラー箇所 $this->smlTblNm, $this->smlTblAriasNm, $this->smlKey1Item, $this->smlKey2Item, $this->smlKey3Item, $this->smlNmItem, $this->smlEngNmItem, $smlDelItem); ↓ $this->smlTblNm, $this->smlTblAriasNm, $this->smlKey1Item, $this->smlKey2Item, $this->smlKey3Item, $this->smlNmItem, $this->smlEngNmItem, $this->smlDelItem); ★エラー:C:\xampp\htdocs\.kazphp\common\AppHtmlUtil.phpのエラー $str = $str . "<script language='JavaScript'>\n";で [{ "resource": "/c:/xampp/htdocs/.kazphp/common/AppHtmlUtil.php", "owner": "_generated_diagnostic_collection_name_#1", "code": "1008", "severity": 8, "message": "Undefined variable '$str'.", "source": "intelephense", "startLineNumber": 162, "startColumn": 9, "endLineNumber": 162, "endColumn": 13 }]エラー 解決:$strを初期設定する。 <<追加 start>> $str = ''; <<追加 end>> $str = $str . "<script language='JavaScript'>\n"; と、同様のエラー箇所 ★エラー:C:\xampp\htdocs\.kazphp\view\admin\item\itemAAmendRegisterViewInc.htmlのエラー 及び、C:\xampp\htdocs\.kazphp\view\admin\item\itemAListView.htmlのエラー <script> <!-- var cal1_srch_item54_from = new JKL.Calendar("calid_srch_item54_from","frm","srch_item54_from");で [{ "resource": "/c:/xampp/htdocs/.kazphp/view/admin/item/itemAAmendRegisterViewInc.html", "owner": "_generated_diagnostic_collection_name_#1", "severity": 8, "message": "Expression expected.", "source": "javascript", "startLineNumber": 24, "startColumn": 1, "endLineNumber": 24, "endColumn": 2 }]エラー 解決:カレンダー表示の箇所。「<!-- 」→「//<!-- 」に修正した <script> //<!-- var cal1_srch_item54_from = new JKL.Calendar("calid_srch_item54_from","frm","srch_item54_from");で ★エラー:C:\xampp\htdocs\.kazphp\check_functions.phpのエラー $extStr = implode( $exts, ")|(" ); と、 $errorMessage = 'アップロード可能な画像拡張子は' . implode( $exts, ',' ) . 'です'; [{ "resource": "/c:/xampp/htdocs/.kazphp/check_functions.php", "owner": "_generated_diagnostic_collection_name_#1", "code": "1006", "severity": 8, "message": "Expected type 'null|array'. Found 'string'.", "source": "intelephense", "startLineNumber": 9, "startColumn": 28, "endLineNumber": 9, "endColumn": 33 }]エラー 解決:implodeの引数指定の順番が間違っていた。 $extStr = implode( $exts, ")|(" ); ↓ $extStr = implode( ")|(", $exts); $errorMessage = 'アップロード可能な画像拡張子は' . implode( $exts, ',' ) . 'です'; ↓ $errorMessage = 'アップロード可能な画像拡張子は' . implode( ',', $exts) . 'です'; ★エラー:C:\xampp\htdocs\kaz\admin\item\itemA.phpのエラー $result = AppCheckUtil::checkCodeValue($vars, $errorMessages, $o["c_elements_idx"]=='0'?"有効/無効データ":"use/nouse data", $result, "srch_deldt_flg", "YUKO_FLG", false,'0'); [{ "resource": "/c:/xampp/htdocs/kaz/admin/item/itemA.php", "owner": "_generated_diagnostic_collection_name_#1", "code": "1008", "severity": 8, "message": "Undefined variable '$o'.", "source": "intelephense", "startLineNumber": 760, "startColumn": 65, "endLineNumber": 760, "endColumn": 67 }]エラー 解決: global $o;を追加した。 // 検索条件入力値のチェック function srchValidCheck(&$vars) { <<追加 start>> global $o; <<追加 end>> ★エラー:C:\xampp\htdocs\kaz\admin\logininfo\logininfo.phpのエラー $pageNavi =new PageNavi(array(でPageNaviクラスのコンストラクタ(function PageNavi($options = array(), $eleIdx = '0'))が 動かない。 解決:クラス名と同じ名前のコンストラクタは、PHP 5.3.3 以降はコンストラクタとみなされない。とあったが、PHP7.2までは動いた。 C:\xampp\htdocs\.kazphp\PageNavi.class.phpを修正 function PageNavi($options = array(), $eleIdx = '0') ↓ function __construct($options = array(), $eleIdx = '0') ★エラー:C:\xampp\htdocs\.kazphp\functions.phpを修正 $url = ($_SERVER['HTTPS'] == 'on' ? 'https' : 'http') . '://' . $_SERVER['SERVER_NAME'] . $string;で $_SERVER['HTTPS'] が存在しないときワーニングになる。 解決:$_SERVER['HTTPS']は存在確認することにした。 $url = ($_SERVER['HTTPS'] == 'on' ? 'https' : 'http') . '://' . $_SERVER['SERVER_NAME'] . $string;で ↓ $url = (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on') ? 'https' : 'http') . '://' . $_SERVER['SERVER_NAME'] . $string; 同じよううに $url = ($_SERVER['HTTPS'] == 'on' ? 'https' : 'http') . '://' . $_SERVER['SERVER_NAME'] . dirname($_SERVER['PHP_SELF']). '/' . $string; ↓ $url = (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on') ? 'https' : 'http') . '://' . $_SERVER['SERVER_NAME'] . dirname($_SERVER['PHP_SELF']). '/' . $string; ★エラー:エラーログがうまく出ていない 解決:C:\xampp\htdocs\.kazphp\common.php userErrorHandler関数などのログ出力をerror_log使用に変えた。 function userErrorHandler ($errno, $errmsg, $filename, $linenum) { ・・・ <<修正前 start>> $fp = fopen(DIR_LOG . date('Ymd') . '_log.txt', 'a'); flock($fp, LOCK_EX); fwrite($fp, 'Date: ' . date('Y/m/d H:i:s') . "\n"); fwrite($fp, 'Errno: ' . $errno . "\n"); fwrite($fp, 'Errortype: ' . $errortype[$errno] . "\n"); fwrite($fp, 'Message: ' . $errmsg . "\n"); fwrite($fp, 'Filename: ' . $filename . "\n"); fwrite($fp, 'Linenum: ' . $linenum . "\n"); fwrite($fp, "----------\n"); flock($fp, LOCK_UN); fclose($fp); <<修正前 end>> <<修正後 start>> // $fp = fopen(DIR_LOG . date('Ymd') . '_log.txt', 'a'); // flock($fp, LOCK_EX); // fwrite($fp, 'Date: ' . date('Y/m/d H:i:s') . "\n"); // fwrite($fp, 'Errno: ' . $errno . "\n"); // fwrite($fp, 'Errortype: ' . $errortype[$errno] . "\n"); // fwrite($fp, 'Message: ' . $errmsg . "\n"); // fwrite($fp, 'Filename: ' . $filename . "\n"); // fwrite($fp, 'Linenum: ' . $linenum . "\n"); // fwrite($fp, "----------\n"); // flock($fp, LOCK_UN); // fclose($fp); <<修正後 end>> <<追加 start>> error_log('Date: ' . date('Y/m/d H:i:s') . "\n", 3, DIR_LOG . date('Ymd') . '_log.txt'); error_log('Errno: ' . $errno . "\n", 3, DIR_LOG . date('Ymd') . '_log.txt'); error_log('Errortype: ' . $errortype[$errno] . "\n", 3, DIR_LOG . date('Ymd') . '_log.txt'); error_log('Message: ' . $errmsg . "\n, 3, DIR_LOG . date('Ymd') . '_log.txt'"); error_log('Filename: ' . $filename . "\n", 3, DIR_LOG . date('Ymd') . '_log.txt'); error_log('Linenum: ' . $linenum . "\n", 3, DIR_LOG . date('Ymd') . '_log.txt'); error_log("----------\n", 3, DIR_LOG . date('Ymd') . '_log.txt'); <<追加 end>> if (!empty($db)) { ★改善:PearのDB.phpをやめて、PDOに変更する。 解決:以下など(以下以外にもある)のDB関連を修正 C:\xampp\htdocs\.kazphp\db_functions.php C:\xampp\htdocs\.kazphp\functions.php C:\xampp\htdocs\kaz\admin\shohin\shohinA.php ★初期データアップロードのview呼出し関数のパラメータから「$result」を削除する。 (理由:”Undefined variable $result”エラーになるので) 例:「iUp■{PRG_NAME}■CsvView($o, $err, $result) {」→「iUp■{PRG_NAME}■CsvView($o, $err) {」 そのほか、配列関係(CSVの項目数が少ない場合、存在しないINDEXを見にいくので落ちた)や、DB関係で修正した。 ★phpの日付が日本になっていないので、config.phpを修正した。 <<修正後>> // 日本にする //if (substr(PHP_OS, 0, 3) == 'WIN') { //} else { // define('TIMEZONE', 'Asia/Tokyo'); // putenv('TZ=' . TIMEZONE); //} define('TIMEZONE', 'Asia/Tokyo'); putenv('TZ=' . TIMEZONE); date_default_timezone_set(TIMEZONE); ★論理削除のとき「"削除してもよろしいですか?"」だとわかりづらいので 「"削除(論理削除)してもよろしいですか?"」にした。 ★秘密の画像(例:http://localhost/kaz01u/imageDsp.php?fname=item/A2209190001/item51.png&user=admin」が 「Uncaught Error: Call to undefined function imagecreatefrompng()」エラーで表示できない。 xammpのphp.iniの「;extension=gd」→「extension=gd.so」にした。 なぜだか。PHP8対応のxammpのphp.iniではコメントアウトされているので。 「PHP作成マクロ(お助けTOOL).xlsm」に追記した。 ★テーブル項目一覧などの定義エクセルの「項目チェック内容」にあった 「小数点なし及びカンマあり数値」「小数点なし及びカンマなし数値」「小数点あり及びカンマあり数値」を 削除した。・・・チェックロジックを作ってなかった。これからつくるのも面倒なので。 ハハハハハ、php8にするのに労力を使いはたしたって感じ。
PHP・Laravelの勉強中 ログイン機能のController・つづき
6:04
①4日前からのつづき『しかし、Laravel8のログイン機能のController達のプログラム内容が、さっぱりわからない。』をやっている。
①-1. 『web.phpのAuth::routes();について分かったこと。』のつづき
・なぜ、「C:\laravel-project\sample-project\vendor\laravel\framework\src\Illuminate\Support\Facades\Route.php」にgetメソッドが無いのに
Laravel\Ui\AuthRouteMethods.phpでは「$this->get('login', 'Auth\LoginController@showLoginForm')->name('login');」とか、getが使えているのか?
を、調べた。
・Route.phpにあった getFacadeAccessor()の「return 'router';」は、Laravelはサービスコンテナから
「router」に結び付けられたインスタンスを依存解決しているってことで、
サービスコンテナの「router」は「Illuminate\Routing\Router」のことだった。
確かに、Router.phpにはgetメソッドがある。
public function get($uri, $action = null) { return $this->addRoute(['GET', 'HEAD'], $uri, $action); }
・サービスコンテナ結合キー=routerで、ファサード=Route、
クラス=Illuminate\Routing\RouterなんだってNetに書いてあった。
’router’が、どこに書いてあるかを調べたら、
「C:\laravel-project\sample-project\vendor\laravel\framework\src\Illuminate\Foundation\Application.php」にあった。これだろうと思う。
これによると、'router' => [\Illuminate\Routing\Router::class, \Illuminate\Contracts\Routing\Registrar::class, \Illuminate\Contracts\Routing\BindingRegistrar::class],
なので、関係しているのは [\Illuminate\Routing\Router::class, \Illuminate\Contracts\Routing\Registrar::class, \Illuminate\Contracts\Routing\BindingRegistrar::class],の3個らしい。
\Illuminate\Contracts\Routing\Registrar::class, \Illuminate\Contracts\Routing\BindingRegistrar::classは両方interfaceだった。
/** * Register the core class aliases in the container. * * @return void */ public function registerCoreContainerAliases() { foreach ([ 'app' => [self::class, \Illuminate\Contracts\Container\Container::class, \Illuminate\Contracts\Foundation\Application::class, \Psr\Container\ContainerInterface::class], 'auth' => [\Illuminate\Auth\AuthManager::class, \Illuminate\Contracts\Auth\Factory::class], ・・・ 'request' => [\Illuminate\Http\Request::class, \Symfony\Component\HttpFoundation\Request::class], 'router' => [\Illuminate\Routing\Router::class, \Illuminate\Contracts\Routing\Registrar::class, \Illuminate\Contracts\Routing\BindingRegistrar::class], ・・・ 'view' => [\Illuminate\View\Factory::class, \Illuminate\Contracts\View\Factory::class], ] as $key => $aliases) { foreach ($aliases as $alias) { $this->alias($key, $alias); } } }
②ログインはphp artisan route:listによると、「 GET|HEAD login ................. login › Auth\LoginController@showLoginForm」なので
C:\laravel-project\sample-project\app\Http\Controllers\Auth\LoginController.phpになる。
コンストラクトに$this->middleware('guest')->except('logout');とある。
middleware('guest')はApp\Http\Kernel.phpに記述されている$routeMiddlewareの
'guest'に登録されているRedirectIfAuthenticatedクラスのこと
・App\Http\Kernel.php protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, ・・・ 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
③C:\laravel-project\sample-project\app\Http\Middleware\RedirectIfAuthenticated.php
handleメソッドが動くらしい。
ここでは、Illuminate\Auth\AuthManagerでguard()メソッドを実行するとSessionGuardインスタンスが作成される。
Auth::guard($guard)->check()はSessionGuardのcheckメソッドを実行している。
認証が完了している場合は/home(RouteServiceProvider::HOME)にリダイレクトする。
・$guardsってなんだろう?
・ガード (guard)とは、C:\laravel-project\sample-project\config\auth.phpにある、'guards'。
Laravel では「認証」と呼ぶ。ECサイトの「管理者」と「会員」など。
・ここにある$guardsって、だれが渡してくれるんだろう?
・なぜ、 foreachで回しているのだろう?
ガード (guard)が複数あるかららしい。
・return $next($request);でなぜログイン画面になるのか?
・次のmiddlewareの処理につながる$nextへ$requestが渡される。
・$next($request)はコントローラーのアクションが実行された結果が返されます。
・LoginController@showLoginFormのshowLoginFormはどこにあるのだろう?
・LoginController中に「 use AuthenticatesUsers;」とありtraitだった。
「C:\laravel-project\sample-project\vendor\laravel\ui\auth-backend\AuthenticatesUsers.php」は
showLoginFormメソッドを持っていて「return view('auth.login');」している。
・RedirectIfAuthenticated.php public function handle(Request $request, Closure $next, ...$guards) { $guards = empty($guards) ? [null] : $guards; foreach ($guards as $guard) { if (Auth::guard($guard)->check()) { return redirect(RouteServiceProvider::HOME); } } return $next($request); } ||< ④LoginController中のAuthenticatesUsers.phpは「ublic function login(Request $request)」でログインメソッドでログインしている ・ $this->validateLogin($request);でバリデーションしている。 ・以前サンプルで「class CreateTask extends FormRequest」作ったとき、バリデーションは 「 public function rules()」に「return [ 'title' => 'required|max:100', 'due_date' => 'required|date|after_or_equal:today', ];」と書いていたのだけど、Controller中にも書ける・・・のかな。 ・validateLoginメソッド使用した後エラーがあるかどうか聞いていないので、エラーの時は勝手にエラーに戻るのかな? >|| protected function validateLogin(Request $request) { $request->validate([ $this->username() => 'required|string', 'password' => 'required|string', ]); }
PHP・Laravelの勉強中 ログイン機能のController
13:45
①3日前からのつづき『しかし、Laravel8のログイン機能のController達のプログラム内容が、さっぱりわからない。』をやっている。
①-1. web.phpのAuth::routes();について分かったこと。
・C:\laravel-project\sample-project\routes\web.phpのAuth::routes();にログイン機能のルーティングが書いてある。ので、調査
・web.phpに、use Illuminate\Support\Facades\Auth;と書いてあるので、Auth::routes();は Illuminate\Support\Facades\Auth.phpのことで、
・「public static function routes(array $options = [])」のことだった。
・そしてこの関数には「static::$app->make('router')->auth($options);」とある。
make('router')のrouterとは、「C:\laravel-project\sample-project\vendor\laravel\framework\src\Illuminate\Support\Facades\Route.php」・
「class Route extends Facade」の「getFacadeAccessor()」に書いてある「return 'router';」のことだった。
疑問:$app->make('router')って、new Auth.php-じゃダメなのか?と調べたら、
Laravelのサービスコンテナにサービスコンテナ(app()) にインスタンスを作ってもらう時は
$app->make('router')って書くって、あった。さらにLaravelでは$app->makeしか使わなくなるって書いてあった。
・Route.phpについて、\laravel\uiパッケージの「C:\laravel-project\sample-project\vendor\laravel\ui\composer.json」に
以下のように書いてある
・composer.json "extra": { "branch-alias": { "dev-master": "3.x-dev" }, "laravel": { "providers": [ "Laravel\\Ui\\UiServiceProvider" ] } },
"Laravel\\Ui\\UiServiceProvider"により、「use Illuminate\Support\Facades\Route;」のRoute.phpに
Laravel\Ui\AuthRouteMethods.phpの内容がmixinされている。
・Laravel\\Ui\\UiServiceProvider" public function boot() { Route::mixin(new AuthRouteMethods); }
なので、「static::$app->make('router')->auth($options);」は
Laravel\Ui\AuthRouteMethods.phpのauth()のことだった。
補足:実フォルダはC:\laravel-project\sample-project\vendor\laravel\ui\src\AuthRouteMethods.php
だけど、「C:\laravel-project\sample-project\vendor\laravel\ui\composer.json」に
「"autoload": { "psr-4": {"Laravel\\Ui\\": "src/",・・・」あるので、srcが抜けてl→Lとu→Uになっている。
こんな風に書いてある。
・Laravel\Ui\AuthRouteMethods.php public function auth() { return function ($options = []) { $namespace = class_exists($this->prependGroupNamespace('Auth\LoginController')) ? null : 'App\Http\Controllers'; $this->group(['namespace' => $namespace], function() use($options) { // Login Routes... if ($options['login'] ?? true) { $this->get('login', 'Auth\LoginController@showLoginForm')->name('login'); $this->post('login', 'Auth\LoginController@login'); } ・・・ }
PHP・Laravelの勉強中
22:39
①おとといからのつづき『しかし、Laravel8のログイン機能のController達のプログラム内容が、さっぱりわからない。』
・まだ、わからない。
②わかってきたこと。まだ、まだ、だけど。
・Composerを使用し、サンプルを見ながら作った「sample-project」
(>composer create-project laravel/laravel sample-project --prefer-dist)は
laravel/laravelパッケージをGitからZip形式でダウンロードしてsample-project という名前で展開したものらしい。
・さらに、laravel/laravelパッケージにはいくつかのパッケージ(これは、composer.jsonの"require":に書いてあるもののことらしい)も一緒に入っているらしい。
・ログイン画面などを
(>composer require laravel/ui)で入れたが、これはlaravel/uiパッケージを入れたことになる。