Last active
November 9, 2020 16:56
-
-
Save shibbirweb/99dfa5c751b1d2bae2389e8a75fb515f to your computer and use it in GitHub Desktop.
Laravel Pipeline Stracture
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| namespace App\QueryFilters; | |
| use Closure; | |
| use Illuminate\Database\Eloquent\Builder; | |
| use Illuminate\Support\Str; | |
| abstract class BaseFilter implements QueryFilterContract | |
| { | |
| /** | |
| * @var string $request_key_name filter name | |
| */ | |
| protected $request_key_name; | |
| /** | |
| * @var string $request_key_value filter value | |
| */ | |
| private $request_key_value; | |
| public function __construct() | |
| { | |
| if (!$this->request_key_name) { | |
| $this->setRequestKeyName(); | |
| } | |
| $this->setFilterValue(); | |
| } | |
| /** | |
| * Database query filter | |
| * | |
| * @param Builder $builder Database eloquent model instance | |
| * @param Closure $next | |
| * @return mixed | |
| */ | |
| public function handle(Builder $builder, Closure $next): Builder | |
| { | |
| if (!request()->has($this->request_key_name) OR $this->skipFilterIf()) { | |
| return $next($builder); | |
| } | |
| return $next($this->applyFilters($builder, $this->request_key_value)); | |
| } | |
| /** | |
| * Apply the filter | |
| * | |
| * @param Builder $builder Eloquent Query builder | |
| * @param mixed $value Request key value | |
| * @return Builder Eloquent Builder instance | |
| */ | |
| protected abstract function applyFilters(Builder $builder, $value): Builder; | |
| /** | |
| * Skip filtering value condition | |
| * | |
| * @return bool | |
| */ | |
| protected function skipFilterIf(){ | |
| return $this->request_key_value === null; | |
| } | |
| /** | |
| * Set Filter name | |
| * | |
| * @return void | |
| */ | |
| private function setRequestKeyName(): void | |
| { | |
| $class_base_name = class_basename($this); | |
| $this->request_key_name = (string)Str::of($class_base_name) | |
| ->snake() | |
| ->beforeLast('_query'); | |
| } | |
| /** | |
| * Set Filter value | |
| * | |
| * @return void | |
| */ | |
| private function setFilterValue(): void | |
| { | |
| $this->request_key_value = request($this->request_key_name); | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| namespace App\Http\Controllers; | |
| class LessonController extends Controller | |
| { | |
| /** | |
| * Search result | |
| * | |
| * @param Request $request | |
| * @return Application|Factory|View|Response | |
| */ | |
| public function search(Request $request) | |
| { | |
| $lessons = app(Pipeline::class) | |
| ->send(Lesson::with('topic.subject')) | |
| ->through([ | |
| TopicIdQuery::class, | |
| NameQuery::class, | |
| Lesson_SubjectIdQuery::class | |
| ]) | |
| ->thenReturn() | |
| ->paginate(25); | |
| return view('actions.lesson.index', compact('lessons')) | |
| ->with($this->meta); | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| namespace App\QueryFilters\Globals; | |
| use App\QueryFilters\BaseFilter; | |
| use Illuminate\Database\Eloquent\Builder; | |
| class NameExactQuery extends BaseFilter | |
| { | |
| protected $request_key_name = 'name'; | |
| /** | |
| * Apply the filter | |
| * | |
| * @param Builder $builder Eloquent Query builder | |
| * @param mixed $value Request key value | |
| * @return Builder Eloquent Builder instance | |
| */ | |
| protected function applyFilters(Builder $builder, $value): Builder | |
| { | |
| return $builder->where('name', $value); | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| namespace App\QueryFilters\Globals; | |
| use App\QueryFilters\BaseFilter; | |
| use Illuminate\Database\Eloquent\Builder; | |
| class NameQuery extends BaseFilter | |
| { | |
| /** | |
| * Apply the filter | |
| * | |
| * @param Builder $builder Eloquent Query builder | |
| * @param mixed $value Request key value | |
| * @return Builder Eloquent Builder instance | |
| */ | |
| protected function applyFilters(Builder $builder, $value): Builder | |
| { | |
| return $builder->where('name', "like", "%". $value ."%"); | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| namespace App\QueryFilters\Globals; | |
| use App\QueryFilters\BaseFilter; | |
| use Illuminate\Database\Eloquent\Builder; | |
| class TopicIdQuery extends BaseFilter | |
| { | |
| /** | |
| * Apply the filter | |
| * | |
| * @param Builder $builder Eloquent Query builder | |
| * @param mixed $value Request key value | |
| * @return Builder Eloquent Builder instance | |
| */ | |
| protected function applyFilters(Builder $builder, $value): Builder | |
| { | |
| return $builder->where('topic_id', $value); | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| namespace App\QueryFilters\Globals; | |
| use App\QueryFilters\BaseFilter; | |
| use Illuminate\Database\Eloquent\Builder; | |
| class NameExactQuery extends BaseFilter | |
| { | |
| protected $request_key_name = 'name'; | |
| /** | |
| * Apply the filter | |
| * | |
| * @param Builder $builder Eloquent Query builder | |
| * @param mixed $value Request key value | |
| * @return Builder Eloquent Builder instance | |
| */ | |
| protected function applyFilters(Builder $builder, $value): Builder | |
| { | |
| return $builder->where('name', $value); | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| namespace App\QueryFilters\Globals; | |
| use App\QueryFilters\BaseFilter; | |
| use Illuminate\Database\Eloquent\Builder; | |
| class NameQuery extends BaseFilter | |
| { | |
| /** | |
| * Apply the filter | |
| * | |
| * @param Builder $builder Eloquent Query builder | |
| * @param mixed $value Request key value | |
| * @return Builder Eloquent Builder instance | |
| */ | |
| protected function applyFilters(Builder $builder, $value): Builder | |
| { | |
| return $builder->where('name', "like", "%". $value ."%"); | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| namespace App\QueryFilters; | |
| use Closure; | |
| use Illuminate\Database\Eloquent\Builder; | |
| interface QueryFilterContract | |
| { | |
| /** | |
| * Database query filter | |
| * | |
| * @param Builder $builder Database eloquent model instance | |
| * @param Closure $next | |
| * @return mixed | |
| */ | |
| public function handle(Builder $builder, Closure $next): Builder; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment