friendsofcake/search の使い方が変わってる
CakePHP をお使いの方々に置かれましては、バージョンアップ作業で忙しいさなかかとお察しします。
弊社も例外ではなく、 CakePHP 3.5 で書かれたアプリケーションを CakePHP3.6 にアップデートしたら、Warning の嵐で泣きそうになりました。
よくあるWarning は、
$conig->config();
ではなく、
$conig->setConfig();
$conig->getConfig();
を使いなさいとかそのへんです。
これについては、CakePHP3.4で導入されたみたいです。
そのへんはせっせこ直していけば問題ありません。
でも、friendsofcake/search
の使い方が変わってたのは知らなかった。
ということで、自分が変化に気づいた2点(+ おまけ1点)を書いていこうと思います。
その1
呼び出し方が変わった。
以前の書き方は、
モデル
use Search\Manager;
class ApplesTable extends Table
{
public function initialize()
{
parent::initialize();
$this->addBehavior("Search.Search");
}
public function searchConfiguration()
{
$search = new Manager($this);
$search->value("fruit_id");
return $search;
}
}
コントローラー
class ApplesController extends Controller
{
public function initialize()
{
parent::initialize();
$this->loadComponent("Search.Prg",[
"actions" => ["index"]
]);
}
public function index()
{
$filter = $this->Emails->filterParams($this->request->getQuery());
$query = $this->Emails->find("search", $filter);
$apples = $this->paginate($query);
$this->set(compact("apples"));
}
}
という感じでした。
今はどのように書くかというと、、、
モデル
use Search\Manager;
class ApplesTable extends Table
{
public function initialize()
{
parent::initialize();
$this->addBehavior("Search.Search");
// 1. ここに直接書く
$this->searchManager()
->value("fruit_id");
}
// 2. 分けて書く
public function searchManager()
{
$searchManager = $this->behaviors()->Search->searchManager();
$searchManager
->value('fruit_id');
return $searchManager;
}
}
コントローラー
class ApplesController extends Controller
{
public function initialize()
{
parent::initialize();
$this->loadComponent("Search.Prg",[
"actions" => ["index"]
]);
}
public function index()
{
$filter = $this->request->getQuery();
$query = $this->Emails->find("search", $filter);
$apples = $this->paginate($query);
$this->set(compact("apples"));
}
}
というふうに書けます。
大きな違いは、
1. filterParams() がなくなった。
2. searchConfiguration() を呼んでくれなくなった。
といったところでしょうか。
今までは、searchConfiguration()
の中に、いろいろと書いていたので、
やるべきことはほとんど変わってないのですが、若干慣れが必要です。
ちなみに、自分は、
public function initialize()
{
parent::initialize();
/* いろいろな処理 */
$this->searchConfiguration();
}
public function searchConfiguration()
{
$this->searchManager()
->value("fluit_id");
}
というふうに書いています。
これで以前のコードを踏襲しつつ、変更できます。
その2
value メソッドの挙動が変わった
value メソッドの挙動が変わったように思います。
今までは、
// コントローラー
$q = ["fruit_id" => [3, 8]];
$query = $this->find("search", $q);
// モデル
public function searchConfiguration()
{
$m = new Manager($this);
$m->value("fruit_id")
return $m;
}
とすることにより、
fruit_id が 3, もしくは 8 のものが検索されていました。
しかし、この検索がうまく言っていないのか、仕様が変わっちゃったのか、今は、
// コントローラー
$q = ["fruit_id" => [3, 8]];
$query = $this->find("search", $q);
// モデル
public function searchConfiguration()
{
$this->searchManager()
->value("fruit_id", "Search.Callback", [
"callback" => function ($q, $args) {
// そもそも空だったらここに入ってこないと思うので、いらなさそう。
if (empty($qrgs["fruit_id"])) {
return $query;
}
return $query->where(["fruit_id IN" => $args["fruit_id"]]);
}
]);
}
という風に書く必要があります。
おまけ
いつからだろう、ctp
フィアルに、
echo $this->Form->create($apple);
$this->Form->setValueSources('query');
//もしくは、
echo $this->Form->create($apple, ['valueSources' => 'query']);
と書かなくてはならなくなったのは。。。
これを書いておかないと、検索クエリを表示することができないので注意が必要です。
ということで、CakePHP のバージョンアップ作業をしていて変化に気づいたことを書きました。
今回の修正で、いろいろなプラグインを修正して回っているので、結構楽しいです。
またバージョンアップしていてなにかに気づいたら書いていきます。
※ 上記は全てサンプルコードです。動作保証はしません。