LoginSignup
5
5

More than 5 years have passed since last update.

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

Posted at

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

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

よくあるWarning は、

$conig->config();

ではなく、

$conig->setConfig();
$conig->getConfig();

を使いなさいとかそのへんです。
これについては、CakePHP3.4で導入されたみたいです。
そのへんはせっせこ直していけば問題ありません。

でも、friendsofcake/search の使い方が変わってたのは知らなかった。

ということで、自分が変化に気づいた2点(+ おまけ1点)を書いていこうと思います。

その1

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

モデル

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;
    }
}

コントローラー

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"));
    }
}

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

モデル

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;
    }
}

コントローラー

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

ちなみに、自分は、

ApplesTable.php
    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 のバージョンアップ作業をしていて変化に気づいたことを書きました。
今回の修正で、いろいろなプラグインを修正して回っているので、結構楽しいです。
またバージョンアップしていてなにかに気づいたら書いていきます。

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

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5