为什么 old() 方法在 Laravel Blade 中不起作用?

Why does the old() method not work in Laravel Blade?

我的环境是 Laravel 6.0,PHP 7.3。我想在文本字段中显示旧的搜索值。但是,old() 方法不起作用。搜索后,搜索的旧值消失了。为什么不显示旧值?我研究过,在大多数情况下,你可以使用redirect()->withInput(),但我不想使用redirect()。我更愿意使用 view()。方法

控制器

class ClientController extends Controller
{
    public function index()
    {
        $clients = Client::orderBy('id', 'asc')->paginate(Client::PAGINATE_NUMBER);

        return view('auth.client.index', compact('clients'));
    }

    public function search()
    {
        $clientID = $request->input('clientID');
        $status = $request->input('status');
        $nameKana = $request->input('nameKana');
        $registerStartDate = $request->input('registerStartDate');
        $registerEndDate = $request->input('registerEndDate');

        $query = Client::query();
        if (isset($clientID)) {
            $query->where('id', $clientID);
        }
        if ($status != "default") {
            $query->where('status', (int) $status);
        }
        if (isset($nameKana)) {
            $query->where('nameKana', 'LIKE', '%'.$nameKana.'%');
        }
        if (isset($registerStartDate)) {
            $query->whereDate('registerDate', '>=', $registerStartDate);
        }
        if (isset($registerEndDate)) {
            $query->whereDate('registerDate', '<=', $registerEndDate);
        }
        $clients = $query->paginate(Client::PAGINATE_NUMBER);

        return view('auth.client.index', compact('clients'));
    }
}

路线

Route::get('/', 'ClientController@index')->name('client.index');
Route::get('/search', 'ClientController@search')->name('client.search');

更改加载视图的方式并将数组作为参数传递。

// Example:
// Create a newarray with new and old data
$dataSet = array (
    'clients'           => $query->paginate(Client::PAGINATE_NUMBER),
    // OLD DATA
    'clientID'          => $clientID,
    'status'            => $status,
    'nameKana'          => $nameKana,
    'registerStartDate' => $registerStartDate,
    'registerEndDate'   => $registerEndDate
);

// sent dataset
return view('auth.client.index', $dataSet);

然后您可以在视图中将它们作为变量访问 $registerStartDate,但最好先使用 isset() 方法检查它是否存在。

示例<input type='text' value='@if(isset($registerStartDate)) {{registerStartDate}} @endif />

您只需将变量传回视图即可:

Controller中:

public function search(Request $request){
  $clientID = $request->input('clientID');
  $status = $request->input('status');
  $nameKana = $request->input('nameKana');
  $registerStartDate = $request->input('registerStartDate');
  $registerEndDate = $request->input('registerEndDate');

  ...

  return view('auth.client.index', compact('clients', 'clientID', 'status', 'nameKana', 'registerStartDate', 'registerEndDate'));
}

然后,在您的索引中,对变量进行 isset() 检查:

index.blade.php中:

<input name="clientID" value="{{ isset($clientID) ? $clientID : '' }}"/>
<input name="status" value="{{ isset($status) ? $status : '' }}"/>
<input name="nameKana" value="{{ isset($nameKana) ? $nameKana : '' }}"/>
...

由于您在两个函数中返回相同的视图,但只将变量传递给其中一个,因此您需要使用 isset() 来确保变量存在,然后再尝试将它们用作 value() 输入的属性。

此外,请确保您的方法中有 Request $requestpublic function search(Request $request){ ... }(见上文)以便可以访问 $request->input()