friendsofcake/search の使い方が変わってた

friendsofcake/search の使い方が変わってる

CakePHP をお使いの方々に置かれましては、バージョンアップ作業で忙しいさなかかとお察しします。
弊社も例外ではなく、 CakePHP 3.5 で書かれたアプリケーションを CakePHP3.6 にアップデートしたら、Warning の嵐で泣きそうになりました。  
よくあるWarning は、 

```php
$conig->config();
```
ではなく、 

```php
$conig->setConfig();
$conig->getConfig();
```
を使いなさいとかそのへんです。
これについては、CakePHP3.4で導入されたみたいです。
そのへんはせっせこ直していけば問題ありません。

でも、`friendsofcake/search` の使い方が変わってたのは知らなかった。  
ということで、自分が変化に気づいた2点(+ おまけ1点)を書いていこうと思います。  


# その1

呼び出し方が変わった。
以前の書き方は、

モデル

```php:ApplesTable.php
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;
    }
}

```

コントローラー

```php:ApplesController.php
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"));
    }
}

```

という感じでした。
今はどのように書くかというと、、、

モデル

```php:ApplesTable.php
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;
    }
}

```

コントローラー

```php:ApplesController.php
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()` の中に、いろいろと書いていたので、
やるべきことはほとんど変わってないのですが、若干慣れが必要です。

ちなみに、自分は、  

```php:ApplesTable.php
    public function initialize()
    {
      parent::initialize();
      /* いろいろな処理 */
      $this->searchConfiguration();
    }

    public function searchConfiguration()
    {
        $this->searchManager()
          ->value("fluit_id");
    }

```

というふうに書いています。
これで以前のコードを踏襲しつつ、変更できます。  


# その2

value メソッドの挙動が変わった

value メソッドの挙動が変わったように思います。
今までは、

```php
// コントローラー
$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 のものが検索されていました。
しかし、この検索がうまく言っていないのか、仕様が変わっちゃったのか、今は、

```php
// コントローラー
$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` フィアルに、

```php
echo $this->Form->create($apple);
$this->Form->setValueSources('query');
//もしくは、
echo $this->Form->create($apple, ['valueSources' => 'query']);

```

と書かなくてはならなくなったのは。。。
これを書いておかないと、検索クエリを表示することができないので注意が必要です。


ということで、CakePHP のバージョンアップ作業をしていて変化に気づいたことを書きました。
今回の修正で、いろいろなプラグインを修正して回っているので、結構楽しいです。
またバージョンアップしていてなにかに気づいたら書いていきます。


※ 上記は全てサンプルコードです。動作保証はしません。