Laravel에서 매우 간단한 검색 기능 패키지 만들기

14531 단어 PHPLaravel
이 글은 Laravel #2 Advent Calendar 2019의 다음 날이다.

검색 기능?


웹 앱을 만들면 검색 기능을 자주 만들죠?
↓ 이런 검색 화면이다.

이렇게 간단하면ifやEloquentを使って条件を追加する도 괜찮지만 검색 항목이 많아지고 복잡해지면 가독성이 떨어지고 귀찮아진다.
이를 위해 라벨의 검색 기능 제작 방법, 검색에 특화된 패키지 등을 만들었지만 검색을 간단하게 설치할 수 있는 것이 없어 만들어 봤다.

포장


만들 때 신경 쓰이는 포인트.

  • 검색 기능을 간단하게 실현할 수 있음(검색을 위해 쓰기 싫음)
  • 어떤 상황에서도 유연한 검색 가능
  • Laravel 스타일
  • Seaaarch에서 할 수 있는 일.

  • Searchable 클래스를 생성하여 쓰기 검색 조건의 위치를 서로 다른 클래스로 나눈다
  • 검색 조건에서 콜백을 받아들여 유연하게 검색할 수 있음
  • 간단한 검색은 설정만 쓰면 검색이 가능
  • Filter 클래스를 작성하여 검색 조건을 유니버설화할 수 있음
  • 기본용법


    설치

    composer require fusic/Seaaaaarch
    

    블레이드 준비


    index.blade.php 등에서 검색용 화면을 만들다.
    이곳은 평범한 블레이드가 될 것이다.
    ※ 이름과 주소로 검색
    index.blade.php
    <form action="{{ route('users.search') }}" method="post">
        @csrf
        <div class='row'>
            <div class='col-md-6'>
                <div class='form-group'>
                    <input name="name" />
                </div>
            </div>
            <div class='col-md-6'>
                <div class='form-group'>
                    <input name="address" />
                </div>
            </div>
        </div>
        <div style="text-align: center;">
            <button class='btn-default'>検索</button>
        </div>
    </form>
    

    설정 가능 만들기


    Seaaaarch를 설치하면 생성할 수 있습니다Searchable.
    Searchable은 검색 실제 상황을 설명하는 클래스입니다.
    php artisan make:searchable UsersSearch
    
    간단한 검색이라면 다음과 같이 할 수 있다設定だけで検索を実装.
    UsersSearch.php
    <?php
    namespace App\Search;
    
    use Search\Searchable;
    
    class UserSearch extends Searchable
    {
        public function __construct()
        {
            $this->params = [
                // ここに検索条件を記載します
                // 名前 と 住所を検索できるようにします
                'name' => [
                    // typeにvalueを設定すると、入力値を完全一致で検索します。
                    'type' => 'value'
                ],
                'address' => [
                    // typeにvalueを設定すると、入力値を部分一致で検索します。
                    'type' => 'like'
                ],
            ];
        }
    }
    
    ※ 검색을 위해value,like,in,callback 등이 준비되어 있습니다.
    ※ Searchable에 대한 자세한 설정 항목은 참조구성 가능.

    컨트롤러에서 검색 작업 생성하기


    위에서 만든form을 만들어서 검색을 위한 자동 검사를 받습니다.
    설정 가능한 클래스 실례를 QueryParser::parse에 전달하여 오프라인 자체 검사 값에서 검색에 필요한 값을 검색합니다.
    ※ 루트를 설정하세요.
    UsersController.php
    public function search() {
        $query = QueryParser::parse(new UsersSearch());
        return redirect()->route('users.index', $query);
    }
    

    검색 실행


    Seaaaach를 설치한 후 Eloquent에 searchメソッド 를 추가합니다.
    Searchable 인스턴스를 search 에 전달하여 Searchable로 설정된 검색 조건에 따라 검색합니다.search도 방법 전후에 Eloquent 기능을 통해 조건과 정렬 등을 추가할 수 있다.
    UsersController.php
    public function index() {
        UserModel::search(new UserSearch())->where('example', 'test');
        // or
        UserModel::where('example', 'test')->search(new UserSearch())
    }
    

    유연한 검색


    검색 조건은 Searchable에 쓰지만 완전히 일치하거나 부분적으로 일치하는 것이 아니라 JoinやPHPの処理を挟む 등 복잡한 처리도 있다고 생각합니다.
    이 경우 사용Searchableのcallback.
    콜백 매개변수$builder에서는 Eloquent 기능을 사용할 수 있습니다.
    UsersSearch.php
    <?php
    namespace App\Search;
    
    use Search\Searchable;
    
    class UserSearch extends Searchable
    {
        public function __construct()
        {
            $this->params = [
                'name' => [
                    // typeにcallbackを指定すると、methodに検索処理を書くことが出来ます。
                    'type' => 'callback',
                    'method' => function (Builder $builder, $key, $value) {
                        // ここで条件を組み立てます
                        $name = mb_convert_kana($value, 'Hc');
                        $builder->where('name', $name);
                    }
                ]
            ];
        }
    }
    

    처리 유니버설


    프로젝트 전체 등 공통적으로 활용하고 싶은 검색 조건을 만드는 기능도 준비되어 있다Seaaaaarch.
    필터 클래스를 만들어서 유니버설화할 수 있습니다.

    필터 생성


    필터를 생성하여 검색 조건을 생성할 수 있습니다.
    php artisan make:filter ExampleFilter
    
    App\Search\Filter\ExampleFilter.php
    <?php
    namespace App\Search\Filter;
    
    use Illuminate\Database\Eloquent\Builder;
    use Search\Filter\Filter;
    use Search\Filter\FilterInterface;
    
    class ExampleFilter extends Filter implements FilterInterface {
        protected $defaultOptions = [];
    
        public function process(Builder $builder, $field, $value)
        {
            // ここに検索条件の処理を記載します
            // 例:20歳以上を検索条件にする
            $builder->where('age', '>=', 20);
        }
    }
    

    필터 사용


    UsersSearch.php
    <?php
    namespace App\Search;
    
    use Search\Searchable;
    
    class UserSearch extends Searchable
    {
        public function __construct()
        {
            $this->params = [
                'age' => [
                    // この指定で、20歳以上の条件がかかるので検索条件の共通化をすることが可能です。
                    'type' => ExampleFilter::class
                ]
            ];
        }
    }
    

    기타 상세한 이용 방법


    GitHub에 기재되어 있으니 확인하십시오.
    https://github.com/fusic/Seaaaaarch/tree/master/docs/ja
    마음에 드시면 Pull request와 star를 잘 부탁드립니다.

    좋은 웹페이지 즐겨찾기