LoginSignup
Amn378
@Amn378

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

ヘルパ関数に登録されているold関数を理解したい

Q&AClosed

解決したいこと

helpers.phpに記載されている次のコードを理解したい(old関数)

helpers.phpというファイル名から、こちらがヘルパー関数であることは察していますが、これが自作のものか、Laravelの初期機能として持っているものかも知りたいです。(自作かどうかの見分け方ってあるものなのでしょうか?)

さらに、内容的に画面に表示された変更前の情報を取得するためのold関数なのだろうと推測していますが、画面の変更前の情報をプログラマーは何も意識せずに(Laravelの仕組みで)保存してあるものか、もしくはどこかで何らかのコーディングを施して保存処理をしているのかも理解したいです。(あまりLaravelの基幹の部分は説明が難しすぎると思いますので、ある程度うわべだけでも理解できたらと思います)
どうぞよろしくお願いいたします。

コード

--- helpers.php
if (! function_exists('old')) {
    /**
     * Retrieve an old input item.
     *
     * @param  string|null  $key
     * @param  mixed  $default
     * @return mixed
     */
    function old($key = null, $default = null)
    {
        return app('request')->old($key, $default);
    }
}

---  FormBuilder.php
if (! function_exists('app')) {
    /**
     * Get the available container instance.
     *
     * @param  string|null  $abstract
     * @param  array  $parameters
     * @return mixed|\Illuminate\Contracts\Foundation\Application
     */
    function app($abstract = null, array $parameters = [])
    {
        if (is_null($abstract)) {
            return Container::getInstance();
        }

        return Container::getInstance()->make($abstract, $parameters);
    }
}

例)使っている箇所(home.blade.php)

@php
    $cent_code = old('cent_code',
        (isset($ref['search_item']['cent_code']) ? $ref['search_item']['cent_code'] : null)
    );
    $orgn_id = old('orgn_id',
        (isset($ref['search_item']['orgn_id']) ? $ref['search_item']['orgn_id'] : null)
    );
@endphp

背景

既存のシステムのお世話をすることになりLaravel学習中です。(WEB系初挑戦)
日々コーディングを追っていますが、初学者のためなかなか理解に苦しんでいます。
自分で簡単なものを一から組んでみるとまた違うのかもしれませんが、残念ながらその時間が与えられておりません。すでにある業務システムをサンプルとして機能追加も少しずつ行っている状況です。

0

2Answer

これが自作のものか、Laravelの初期機能として持っているものかも知りたいです。

プロジェクトのvendorディレクトリ以下には、パッケージ管理システムによってインストールされたライブラリがあります。
エディタやIDEの機能で辿っていった先がvendorディレクトリ以下であれば、ライブラリが定義した関数になりますし、さらにLaravelのディレクトリにあればLaravelが定義した関数です。
ライブラリ自体が自作したものでなれば、「自作ではない」ということになりますね。

さらに、内容的に画面に表示された変更前の情報を取得するためのold関数なのだろうと推測していますが、画面の変更前の情報をプログラマーは何も意識せずに(Laravelの仕組みで)保存してあるものか、もしくはどこかで何らかのコーディングを施して保存処理をしているのかも理解したいです。

old関数で取得できる値は、Laravelの仕組みで保持されています。
old関数の説明は次のとおりです。

old関数はセッションに一時保持データーとして保存されている直前の入力値を取得します。

また、HTTPリクエストの章では次のように説明があります。

Laravelは、今のリクエストから次のリクエストまで入力を保持できます。この機能は、バリデーションエラーを検出した後にフォームを再入力するときに特に便利です。

リクエストした値が自動で保持されているので、old関数で取得するための事前準備はないです。

参考

2Like

Comments

  1. @Amn378

    Questioner

    @blue32a さん
    回答ありがとうございます。
    vendorディレクトリ以下はパッケージ管理システムによって初期インストールされている機能であること、理解いたしました。

    old関数はセッションに一時保持データーとして保存されている直前の入力値を取得します。

    例えば画面表示時のテキスト内の情報をそのテキスト内容を変更して今は違う値が入っていたとしても、old関数を使えば呼び出せる、そしてその機能がLaravelで用意されている、ということなのですね。
    詳しいサイトのご紹介までありがとうございました。

  2. 参考になったようで良かったです。

    例えば、編集画面において初期値は登録済みの値がデフォルト値となりますが、バリデーションエラーで再度フォームを表示する時は直前に入力した値を設定したいと思います。
    そういう時にold関数が使えます。

    記載したサイトはLaravel本家の翻訳サイトです。基本的な機能についての説明があるので一通り参照されるのが良いと思います。
    またWeb系が初めてということであれば、フレームワークを使わない言語そのものの学習コンテンツも参照されることをお勧めします。背景となる知識を得ておくとフレームワークの機能も理解がし易いと思います。

  3. @Amn378

    Questioner

    すみません、正しい理解を得るために少し整理させてください。
    ①最初にデフォルト値Aが表示された状態でロード
    ②値をBに変更
    ③バリデーションエラーで同じ画面に戻ってきたときにold関数を使うと?
    ④-1 バリデーションエラーの値Bをセットできる(こんな間違いしてたよ?の意味で表示)
    ④-2 バリデーションエラー前のデフォルト値Aが表示される(変更前はこんな風に登録されていたよ、の意味で表示)
    これで言うとoldは「直前に入力した値」を設定するということなので、④-1の値Bがセットされる、という認識は正しいですか?

    記載したサイトはLaravel本家の翻訳サイトです。基本的な機能についての説明があるので一通り参照されるのが良いと思います。

    そうでしたか・・・。
    トップページに「川瀬の個人運営サイトです。」です、とあったのですが、まるっと公式のものを翻訳されている、ということなのですね。

    またWeb系が初めてということであれば、フレームワークを使わない言語そのものの学習コンテンツも参照されることをお勧めします。背景となる知識を得ておくとフレームワークの機能も理解がし易いと思います。

    全くおっしゃる通りです。(ただいま痛感中💦)
    いきなり開発環境をdockerで見様見真似で立て、すべて一から覚えていますが、そもそもWEB系が初めてなので、(多少の予備知識や基本的なことはあったにせよ)HTML・PHPも全く初めて・・・。
    問題やエラーが起こってもどこに起因するのかを特定するのにすごく時間がかかっています・・・。
    一応当初より学びながら進めていくことはOKをいただいているのですが、(WEBの知識・Docker・Laravel・PHP・PhpStormを並行で学習中)どの知識も最優先事項に感じ、どれも少しずつかじりながら進めていること、やはり限界があるかもと思い始めていたところです。
    もしおすすめの動画(サイトといいたいところですが、取り急ぎとっつきやすい動画で💦)などありましたらご紹介いただければ幸いです。

  4. old関数自体はシンプルに直前に送信された値を取得するもので、第2引数に値がない場合のデフォルト値を設定できます。
    用途としては ④-1 のイメージですね。(むしろ他の用途が思いつかないですが・・・)

    おすすめの動画

    アドバイスしていながら最近の学習コンテンツはキャッチアップしていなくて、具体例は紹介できないです・・・
    書籍で良ければですが、最近基本に立ち返るために『独習PHP 第4版』を購入しまして、ざっと眺めた感じではPHPをしっかり理解するには良さそうな内容となっています。(ボリュームは多めですが)

    Dockerはこちらの書籍は堅くなくて読みやすかったですよ。
    『開発系エンジニアのためのDocker絵とき入門』

old()だけ知っても意味なくて「フォームで使う」ってことを理解する必要がある。

<input type="text" name="email" value="{{ old('email') }}">

フォームに入力して送信後、バリデーションエラーで元のページに戻った場合、old()によって前回入力していた内容が再度入力された状態になる。
「バリデーションとセットで直前の入力内容に戻すために使う」覚えるのはこれだけでいい。他の使い方することはほぼない。

既存のコードは参考にしないほうがいい。

0Like

Comments

  1. @Amn378

    Questioner

    @pop-culture-studio さん
    ありがとうございます^^
    お礼が遅くなりすみません。
    多分、深読みしすぎて、きっと動かしてみると単純なんだろうな、と思いつつ、私の技量ではその部分だけ切り出して動かしてみるのもまだままならない状態です。
    もっとシンプルに、「直前の入力内容に戻すため」にold関数があるということだけはしっかり叩き込みます!

Your answer might help someone💌