<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های sina khaghani</title><link>https://virgool.ir/feed/@sina.it91</link><description>توسعه دهنده بک اند (پارس سیستم)</description><language>fa</language><pubDate>2026-11-11 10:07:16</pubDate><image><url>https://files.virgool.ir/upload/users/87947/avatar/FQFpUH.jpeg</url><title>sina khaghani</title><link>https://virgool.ir/@sina.it91</link></image><item><title>الگوی طراحی مخزن (Repository design pattern) در لاراول</title><link>https://virgool.ir/@sina.it91/الگوی-طراحی-مخزن-repository-design-pattern-در-لاراول-tueuub07nzfm</link><description>Design Pattern Repositoryدر این مقاله میخواهم کاربرد و نحوه‌ی استفاده از دیزاین پترن Repository را در لاراول را توضیح دهم.Laravel Repository Patternمشکل: فرض کنید شما یک سایت نوبت دهی برای بیماران دارید، شما یک جدول دارید به نام users که اطلاعات بیمار و پزشک را در آن ذخیره می‌کنید و تنها از طریق نقش آنها می‌توانید تفاوت بیمار و پزشک را تشخیص دهید. شما برای هر کاربر (بیمار و پزشک) یک کنترلر در سمت کاربر نیاز دارید حتی یک کنترلر هم سمت پنل ادمین، شاید حتی بخواهید صفحه‌ی ورود و ثبت نام متفاوت هم داشته باشید در این صورت احتمالا به دلیل اینکه هر دو کاربر در یک جدول ذخیره می‌شوند خیلی از کدهای شما تکراری می‌شود و خوانایی کد شما پایین می‌آید، در اینجا الگوی طراحی repository به کمک شما می‌آید و خوانایی کدهای شما را بهتر می‌کند.users tableدر اینجا من دو کنترلر از نوع resource دارم که یکی مربوط به پزشک و دیگری مربوط به بیمار می‌باشد.DoctorControllerPatientControllerحال می‌خواهم برای این کنترلرهای خود متودهای لازم را بنویسم، توجه داشته باشید که موجودیت هر دو کاربر یکی می‌باشد یعنی هر دو از نوع users می‌باشند مثلا برای هردو کاربر متودی برای تغییر آواتار لازم داریم که برای هردو یک کار را انجام می‌دهد لذا برای برای جلوگیری از تکرار کدها و خوانایی بالاتر من یک repository برای کاربران خود ایجاد می‌کنم و تمامی متودهای لازم را در آن قرار می‌دهم و تنها از آنها در هر کنترلری که بخواهم استفاده می‌کنم، اینجوری تمامی متودهای مربوط به user ها در یکجا قرار می‌گیرد و ما لازم نیست در کنترلرهای متفاوت دنبال آن بگردیم.در ابتدا می‌خواهم یک interface ایجاد بکنم پس یک پوشه برای interface های خود در مسیر App/Http ایجاد می‌کنم (شما می‌توانید این پوشه را به دلخواه خود در هر مسیری که دوست داشتید ایجاد کنید) سپس یک interface به نام UserRepositoryInterface درون آن ایجاد می‌کنم.UserRepositoryInterfaceحال متودهایی که لازم دارم را درون آن تعریف می‌کنم.UserRepositoryInterfaceحالا من در مسیر App/Http  یک abstrac class ایجاد می‌کنم که implement شده از interface بالا (البته این بخش رو من خودم اضافه کردم شما می‌توانید این abstract را اضافه نکنید، دلیل اینکارم این است که بتوانم بعدا در صورت نیاز متودها را در UserRepository  که در پایین ایجاد می‌کنم بازنویسی کنم)UserRepositoryAbstractحالا یک کلاس UserRepository در مسیر App/Http و در پوشه‌ای به نام Repository ایجاد می‌کنم که extends شده از UserRepositoryAbstract  (اگر شما نخواستید abstract بالا را ایجاد کنید می‌توانید کلاس UserRepository را مستقیما از interface ایجاد شده implement کنید)UserRepositoryحالا لازم است کلاس ایجاد شده را در service container  لاراول اضافه کنیم.برای این کار یک service provider مجزا ایجاد می‌کنیم که از این پس تمامی repository های خود را در آن bind کنیم.php artisan make:provider RepositoryServiceProviderحالا در provider ایجاد شده Repository و interface خود را bind می‌کنیم.RepositoryServiceProviderحالا باید provider ایجاد شده را در مسیر config/app.php در بخش providers ثبت کنیم.config/app.phpحالا دیگه تقریبا کار تموم شده و فقط باید بدنه‌ی متودهای خود را در UserRepositoryAbstract ایجاد کنیم و در صورت نیاز در UserRepository بازنویسی کنیم اگر هم که نیازی به بازنویسی نبود دقیقا همانها را در کنترلر خود فراخوانی می‌کنیم.namespace App\Http\Repository;&#xA;&#xA;&#xA;use App\Http\Abstracts\UserRepositoryAbstract;&#xA;&#xA;class UserRepository extends UserRepositoryAbstract&#xA;{&#xA;    public function loginDoctor($request)&#xA;    {&#xA;        return Parent::loginDoctor();&#xA;    }&#xA;&#xA;    public function loginPatient($request)&#xA;    {&#xA;        // TODO: Implement loginPatient() method.&#xA;    }&#xA;&#xA;    public function registerDoctor($request)&#xA;    {&#xA;        // TODO: Implement registerDoctor() method.&#xA;    }&#xA;&#xA;    public function registerPatient($request)&#xA;    {&#xA;        // TODO: Implement registerPatient() method.&#xA;    }&#xA;&#xA;    public function avatar($avatarFile)&#xA;    {&#xA;        // TODO: Implement avatar() method.&#xA;    }&#xA;&#xA;    public function updateAvatar()&#xA;    {&#xA;        // TODO: Implement updateAvatar() method.&#xA;    }&#xA;&#xA;    public function getAllDoctor()&#xA;    {&#xA;        // TODO: Implement getAllDoctor() method.&#xA;    }&#xA;&#xA;    public function updateDoctor($request)&#xA;    {&#xA;        // TODO: Implement updateDoctor() method.&#xA;    }&#xA;&#xA;    public function updatePatient($request)&#xA;    {&#xA;        // TODO: Implement updatePatient() method.&#xA;    }&#xA;}تزریق interface به کنترلر:برای اینکه از متودهای UserRepository در کنترلر خود استفاده کنیم ابتدا باید interface آن را به کلاس کنترلر خود inject کنیم. اینکار را با تعریف یک property به نام userRepository و inject آن به متود construct انجام می‌دهیم.namespace App\Http\Controllers;&#xA;&#xA;use App\Http\Interfaces\UserRepositoryInterface;&#xA;&#xA;class DoctorController extends Controller&#xA;{&#xA;    &#xA;    private UserRepositoryInterface $userRepository;&#xA;    &#xA;    public function __construct(UserRepositoryInterface $userRepository)&#xA;    {&#xA;        $this-&gt;userRepository = $userRepository;&#xA;    }&#xA;    &#xA;    public function index()&#xA;    {&#xA;        return $this-&gt;userRepository-&gt;getAllDoctor();&#xA;    }&#xA;&#xA;     public function avatar(Request $request)&#xA;    {&#xA;        return $this-&gt;userRepository-&gt;avatar($request);&#xA;    }&#xA;}همانطور که در کدهای بالا مشخص است ما در متود index خود، متود getAllDoctor را از UserRepository فراخوانی کردیم و همین کار را برای کنترلر بیمار و حتی سایر کنترلرهای مربوط به user انجام می‌دهیم و از تکرار کدها جلوگیری و خوانایی کدها را افزایش می‌دهیم. (درکنترلر بالا و پایین متود avatar مشترک است که برای هر دو کنترلر از متود avatar در UserRepository استفاده شده است و نیازی به تکرار این متود نبود)namespace App\Http\Controllers;&#xA;&#xA;use App\Http\Interfaces\UserRepositoryInterface;&#xA;use Illuminate\Http\Request;&#xA;&#xA;class PatientController extends Controller&#xA;{&#xA;    private UserRepositoryInterface $userRepository;&#xA;&#xA;    public function __construct(UserRepositoryInterface $userRepository)&#xA;    {&#xA;        $this-&gt;userRepository = $userRepository;&#xA;    }&#xA;&#xA;    public function avatar(Request $request)&#xA;    {&#xA;        return $this-&gt;userRepository-&gt;avatar($request);&#xA;    }&#xA;}امیدورام این مقاله مفید بوده باشد، اگر سوالی داشتید کامنت بگذارید در اسرع وقت پاسخ خواهم داد.</description><category>sina khaghani</category><author>sina khaghani</author><pubDate>Fri, 22 Jul 2022 20:04:54 +0430</pubDate></item><item><title>رفع مشکل DatePicker در Livewire</title><link>https://virgool.ir/laravel-community/رفع-مشکل-datepicker-در-livewire-cyj0qa5ki9gr</link><description>Laravel and livewireخب این پست مخصوص کسانی است که تجربه ی کار با فریم‌ورک laravel و Livewire را داشته باشند پس اگر شما جزو این دسته نیستید شاید این مطالب خیلی بدردتون نخوره :)اگر تجربه ی کار با livewire را داشته باشید احتمالا موقع استفاده از دیت‌پیکر به مشکل عدم ارسال پارامتر به کلاس بک‌اند خود شده اید. در واقع مقدار فیلد تاریخ شما به صورت Null به سمت بک‌اند ارسال می‌شود.DatePickerتفاوتی ندارد که شما از چه نوع DatePicker استفاده می‌کنید (شمسی یا میلادی) در هر صورت با این مشکل مواجه خواهید شد.اما علت مشکل چیست؟همانطور که احتمالا خودتون می‌دونید هسته‌ی لایو وایر با جاوا اسکریپت (Vue js) نوشته شده است و داده‌ها به صورت Ajax به سمت بک‌اند ارسال می‌شود لذا بنا به محدودیتهایی که در نسخه‌ی فعلی لایو وایر (2.5) وجود دارد امکان set کردن مقادیر فیلدها با جاوا اسکریپت وجود ندارد و اگر شما این کار را انجام دهید مقادیر فیلدهای شما null ارسال می‌شود. پس باید در این شرایط چیکار کرد؟رفع مشکل DatePickerخب خوشبختانه توسعه دهنده‌های لایو وایر فکر اینجا رو کردن و براش راه حلی در نظر گرفتن و این راه حل استفاده از event های خود لایو وایر می‌باشد. به مثال زیر توجه کنید:در اینجا من فیلدی دارم با عنوان تاریخ تولد:&lt;input  id=&#34;persianDatePicker&#34; type=&#34;text&#34; class=&#34;form-control&#34; placeholder=&#34;تاریخ تولد&#34;  wire:model.defer=&#34;dateBirth&#34;&gt;که وقتی کاربر روی آن کلیک می‌کند DatePicker شمسی من فعال می‌شود و کاربر تاریخ مورد نظر خود را با استفاده از آن انتخاب و بر روی دکمه‌ی submit کلیک می‌کند تا تاریخ تولد او ثبت شود.$(&#34;#persianDatePicker&#34;).persianDatepicker({&#xA;    autoClose: true,&#xA;    initialValueType: &#39;gregorian&#39;,&#xA;    persianDigit: true,&#xA;    initialValue: true,&#xA;    observer: true,&#xA;    calendarType: &#39;persian&#39;,&#xA;    calendar:{&#xA;        persian: {&#xA;            locale:&#39;en&#39;&#xA;        },&#xA;        gregorian:{&#xA;            locale:&#39;en&#39;&#xA;        }&#xA;    },&#xA;    format: &#39;YYYY/MM/DD&#39;,&#xA;});در حالت عادی مقدار فیلد dateBirth به صورت Null ارسال می‌شود و شما برای رفع این مشکل باید با استفاده از دستورات لایو وایر مقدار DatePicker خود را بر روی فیلد dateBirth سِت کنید.@this.set(&#39;dateBirth&#39;, &#39;valueDatePicker&#39;, true);این دستور را درون event دیت‌پیکر خود () قرار دهید تا مقادیر DatePicker بر روی فیلد مورد نظر set شوند.کد کامل آن:&lt;html&gt;&#xA;    &lt;body&gt;&#xA;        &lt;div class=&#34;main&#34;&gt;&#xA;            &lt;form wire:submit.prevent=&#34;methodName&#34;&gt;&#xA;&#xA;                &lt;div class=&#34;col-md-6&#34;&gt;&#xA;                    &lt;input  id=&#34;persianDatePicker&#34; type=&#34;text&#34; class=&#34;form-control&#34; placeholder=&#34;تاریخ تولد&#34; wire:model.defer=&#34;dateBirth&#34;&gt;&#xA;                &lt;/div&gt;&#xA;&#xA;                &lt;div class=&#34;col-md-6 col-sm-6&#34;&gt;&#xA;                    &lt;input type=&#34;submit&#34; class=&#34;btn btn-info&#34; value=&#34;ثبت کن&#34;&gt;&#xA;                &lt;/div&gt;&#xA;&#xA;            &lt;/form&gt;&#xA;        &lt;/div&gt;&#xA;&#xA;    &#xA;        $(document).ready(function () {&#xA;            $(&#34;.persianDatePicker&#34;).persianDatepicker({&#xA;                autoClose: true,&#xA;                initialValueType: &#39;gregorian&#39;,&#xA;                persianDigit: true,&#xA;                initialValue: true,&#xA;                observer: true,&#xA;                calendarType: &#39;persian&#39;,&#xA;                calendar:{&#xA;                    persian: {&#xA;                        locale:&#39;en&#39;&#xA;                    },&#xA;                    gregorian:{&#xA;                        locale:&#39;en&#39;&#xA;                    }&#xA;                },&#xA;                format: &#39;YYYY/MM/DD&#39;,&#xA;&#xA;                : function(unix){&#xA;                    @this.set(&#39;dateBirth&#39;, unix, true);&#xA;                },&#xA;&#xA;            });&#xA;        });&#xA;    &#xA;    &lt;/body&gt;&#xA;&lt;/html&gt;نکته‌ای که باید در نظر داشته باشید این است که حتما کدهای DatePicker شما باید در همان کامپونت فیلد تاریخ شما باشد، مثلا اگر از master page یا layouts استفاده می‌کنید نباید کدهای مربوط به DatePicker خود را درون کامپوننت دیگری (مثلا کامپوننت footer) خود قرار دهید چون در این صورت با خطای ناشناس بودن id مواجه خواهید شد.موفق باشید :)</description><category>sina khaghani</category><author>sina khaghani</author><pubDate>Tue, 12 Apr 2022 14:00:32 +0430</pubDate></item><item><title>فیلتر مدلهای لاراول (Advanced Eloquent)</title><link>https://virgool.ir/@sina.it91/فیلتر-مدلهای-لاراول-advanced-eloquent-bnuerfo0efcb</link><description>در این مقاله می‌خواهم پکیج کاربردی (Advanced Eloquent Model Filters) را بهتون معرفی کنم. وظیفه‌ی این پکیج ایجاد فیلترهای از پیش آماده شده برای ما می‌باشد اما چطور؟احتمالا تاحالا در برخی از پروژه‌ها برای شما پیش آمده که خواستید یک سری فیلترهای خاصی را بر روی کوئری‌های خود اعمال کنید و مجبور شدید که این فیلترها را در جاهای مختلف کنترلرهای خود بنویسید. این پکیج باعث میشه که شما فیلترهای خود را در یک پوشه‌ی مشخص، در کلاس مربوطه‌ی خود به صورت مرتب شده بنویسید و فقط این کلاسها را در جاهای مختلف فراخوانی کنید. در این صورت کدهای شما بسیار منظم‌تر و خواناتر خواهد شد.و اما بریم سراغ آموزش پکیج...ابتدا دستور زیر را برای نصب پکیج وارد کنید.composer require pricecurrent/laravel-eloquent-filtersبا اجرای دستور بالا پکیج مربوطه نصب شد، حالا trait زیر را در مدلی که می‌خواهید داده‌های آن را فیلتر کنید، یوز کنید (در مثال زیر ما در مدل یوزر این کار را انجام می‌دهیم)use Pricecurrent\LaravelEloquentFilters\Filterable;&#xA;use Illuminate\Database\Eloquent\Model;&#xA;&#xA;class User extends Model&#xA;{&#xA;    use Filterable;&#xA;}حال شما باید کلاس مربوطه را برای ایجاد فیلترهایی که می‌خواهید بسازید.نام کلاس را بر اساس نوع فیلتر خود انتخاب کنید. (با دستور زیر)php artisan eloquent-filter:make NameFilterبا اجرای دستور بالا یک کلاس با نام NameFilter برای شما در پوشه‌ی app/Filters ایجاد شده است. (مطابق عکس)حال در کلاس ایجاد شده ما فیلتر خود را بر روی کوئری‌های مدل User اعمال می‌کنیم. در اینجا ما اسامی کاربران را با دستور LIKE جستجو می‌کنیم.use App\Filters;&#xA;use Illuminate\Database\Eloquent\Builder;&#xA;use Pricecurrent\LaravelEloquentFilters\AbstractEloquentFilter;&#xA;&#xA;class NameFilter extends AbstractEloquentFilter&#xA;{&#xA;    protected $name;&#xA;&#xA;    public function __construct($name)&#xA;    {&#xA;        $this-&gt;name = $name;&#xA;    }&#xA;    public function apply(Builder $builder): Builder&#xA;    {&#xA;        return $builder-&gt;where(&#39;name&#39;,  &#39;like&#39;,  &#34;{$this-&gt;name}%&#34;);&#xA;    }&#xA;}در نهایت در کنترلر خود، کلاس مربوطه (NameFilter) را فراخوانی می‌کنیم و در کوئری خود از آن استفاده می‌کنیم.use App\Filters\NameFilter;&#xA;use App\Models\User;&#xA;use Illuminate\Http\Request;&#xA;use Pricecurrent\LaravelEloquentFilters\EloquentFilters;&#xA;&#xA;class UserController extends Controller&#xA;{&#xA;    public function index()&#xA;    {&#xA;        $filters = EloquentFilters::make([new NameFilter(&#34;example&#34;)]);&#xA;&#xA;        return User::filter($filters)-&gt;get();&#xA;    }&#xA;}حتی می‌توانیم از فیلترهای خود برای ریکوئستهای دریافتی از سمت کاربر هم استفاده کنیم.use App\Filters\NameFilter;&#xA;use Pricecurrent\LaravelEloquentFilters\EloquentFilters;&#xA;&#xA;class ProductsController&#xA;{&#xA;    public function index(Request $request)&#xA;    {&#xA;        $filters = EloquentFilters::make([new NameFilter($request-&gt;name)]);&#xA;&#xA;        $products = Product::filter($filters)-&gt;get();&#xA;    }&#xA;}اطلاعات بیشتر را می‌توانید در آدرس گیت‌هاب زیر کسب کنید. (موفق باشید)https://github.com/pricecurrent/laravel-eloquent-filters</description><category>sina khaghani</category><author>sina khaghani</author><pubDate>Wed, 15 Dec 2021 11:09:58 +0330</pubDate></item><item><title>معرفی پکیج Excludable در لاراول</title><link>https://virgool.ir/@sina.it91/معرفی-پکیج-excludable-در-لاراول-i5ewlpez6jpb</link><description>Laravel Excludableدر برخی از پروژه‌ها شما می‌خواهید که مثلا تعدادی از محصولات یا مقالات سایت شما توسط کاربران عادی قابل رویت یا حتی جستجو نباشد و فقط تعداد خاصی از اعضا (مثلا فقط ادمین‌ها) بتوانند آنها را ببینند. خب برای پیاده سازی این امکان شما باید کلی کد بزنید و حتی تغییراتی در ساختار جداول دیتابیس ایجاد کنید تا بتوانید چنین فیچری را به سایت خودتان اضافه کنید.اما حالا توسعه دهندگان لاراول با ارائه‌ی یک پکیج خوب به نام Excludable این امکان را برای شما به راحتی فراهم کردند. در این مقاله سعی میکنم کار با این پکیج را که خیلی هم راحت است، به شما آموزش دهم.آموزش کار با پکیج Laravel Excludable https://github.com/h-farm/laravel-excludable ابتدا با کامپوزر پکیج را نصب می‌کنید.composer require h-farm/laravel-excludableسپس فایل مایگریشن آنرا ایجاد و با دستور ماگریشن جدول مورد نیاز آن را می‌سازیم.php artisan vendor:publish --provider=&#34;HFarm\Excludable\ExcludableServiceProvider&#34; --tag=&#34;excludable-migrations&#34;php artisan migrateبا دستور زیر فایل کانفیگ آن را ایجاد می‌کنیم.php artisan vendor:publish --provider=&#34;HFarm\Excludable\ExcludableServiceProvider&#34; --tag=&#34;excludable-config&#34;حالا کافیه trait مورد نیاز آن را به مُدلی که میخواهید این امکان را داشته باشد، اضافه کنید.&lt;?php&#xA;&#xA;namespace App\Models;&#xA;&#xA;use HFarm\Excludable\Excludable;&#xA;&#xA;class Article extends Model&#xA;{&#xA;    use Excludable;&#xA;&#xA;    protected $fillable = [&#xA;        &#39;title&#39;,&#xA;        &#39;body&#39;,&#xA;    ];&#xA;}حالا با دستورات زیر به راحتی می‌توانید اون رکورد مورد نظر خودتون رو به جدول excludable اضافه کنید و به این ترتیب اون رکورد (که میتواند یک مقاله یا حتی یک کاربر باشد) را از دید سایر کاربران پنهان کنید.use App\Models\Article;&#xA;&#xA;$article = Article::query()-&gt;findOrFail(1)&#xA;&#xA;$article-&gt;addToExclusion();&#xA;&#xA;$article-&gt;excluded();  // returns trueدستور زیر می‌توانید همه مقالات مورد نظر را (هم مقالات استثناء شده و هم سایر مقالات) را نمایش دهید.use App\Models\Article;&#xA;&#xA;Article::withExcluded()-&gt;get();همچنین با دستور زیر می‌توانید تنها مقالات استثناء شده را ببینید.use App\Models\Article;&#xA;&#xA;Article::onlyExcluded()-&gt;get();اگر سوالی داشتید در کامنتها بپرسید، حتما پاسخ خواهم داد.</description><category>sina khaghani</category><author>sina khaghani</author><pubDate>Fri, 18 Jun 2021 21:44:21 +0430</pubDate></item><item><title>elasticsearch در لاراول</title><link>https://virgool.ir/@sina.it91/elasticsearch-در-لاراول-ghmzzii2fw17</link><description>Laravel elasticsearchاگر تجربه‌ی کار با elasticsearch در لاراول رو داشته باشین احتمالا می‌دانید که یک پکیج (درایور) خوب برای اتصال لاراول به elasticsearch وجود ندارد و پکیجهای موجود کارایی لازم رو ندارند و همچنین کانفیگ سختی هم دارند. شاید این یکی از ضعف‌های لاراول بود.خب خبر خوب اینجاست که توسعه دهندگان لاراول یک درایور خوب با نام Explorer برای اتصال لاراول به الستیک‌سرچ ایجاد کردن که من میخوام بهتون معرفیش کنم و آموزش نحوه‌ی کار با اون رو بهتون یاد بدم.آموزش اتصال لاراول به elasticsearch:قبل از شروع آموزش باید بگم که elasticsesarch باید بر روی سیستم شما نصب باشد.اگر روش نصب elasticsearch بر روی سیستم خود را یاد ندارید می‌توانید از طریق لینک زیر برای نصب آن اقدام کنید. https://www.elastic.co/guide/en/elasticsearch/reference/current/install-elasticsearch.html در ابتدا که شما لاراول را نصب می کنید یک مدل پیشفرض با نام User برای شما ایجاد می‌شود.برای مثال ما می‌خواهیم این مدل را به الستیک‌سرچ متصل کنیم.پس از نصب لاراول و ایجاد جداول با دستور php artisan migrate میریم سراغ نصب پکیج Explorerبا دستور زیر پکیج را نصب کنید و فایل پیکربندی آن را ایجاد کنید.composer require jeroen-g/explorer&#xA;&#xA;//and&#xA;&#xA;php artisan vendor:publish --tag=explorer.config https://github.com/Jeroen-G/Explorer حال به آدرس config/explorer.php بروید و مقدار indexes را به صورت زیر تغییر دهید.در اینجا شما نام ستونهای جدول users را باید وارد کنید. (برای مثال من فقط نام چهار ستون را وارد کردم)&#39;indexes&#39; =&gt; [&#xA;    \App\Models\User::class,&#xA;    &#39;subscribers&#39; =&gt; [&#xA;        &#39;properties&#39; =&gt; [&#xA;            &#39;id&#39; =&gt; &#39;keyword&#39;,&#xA;            &#39;name&#39; =&gt; &#39;text&#39;,&#xA;            &#39;email&#39; =&gt; &#39;text&#39;,&#xA;            &#39;created_at&#39; =&gt; &#39;date&#39;,&#xA;        ],&#xA;    ],&#xA;],همانطور که احتمالا می‌دانید explorer یک درایور برای پکیج Scout لاراول است در نتیجه ما برای کار با الستیک به این پکیج قدرتمند لاراول نیاز داریم پس در گام دوم میریم سراغ نصب Laravel Scout:با دستورات زیر پکیج را نصب و فایل پیکربندی آن را ایجاد کنید.composer require laravel/scout&#xA;&#xA;//and&#xA;&#xA;php artisan vendor:publish --provider=&#34;Laravel\Scout\ScoutServiceProvider&#34;پس از اجرای دستورات فوق یک فایل در آدرس config/scout.php برای شما ایجاد شده است.وارد فایل شوید و مقدار queue و driver را که به صورت پیشفرض algolia قرار دارد را به elastic تغییر دهید.&#39;driver&#39; =&gt; env(&#39;SCOUT_DRIVER&#39;, &#39;elastic&#39;),&#xA;//and&#xA;&#39;queue&#39; =&gt; env(&#39;SCOUT_QUEUE&#39;, true),حال وارد مدل user شوید و searchable را در مدل خود use کنید و کلاس User را از اینترفیس Explored ایمپلیمنت کنید. پس از اینکار یک متود با نام mappableAs برای شما ایجاد می‌شود که در اینجا هم باید نام ستونهای جدول یوزر را return کنید. (مانند زیر)use Illuminate\Contracts\Auth\MustVerifyEmail;&#xA;use Illuminate\Database\Eloquent\Factories\HasFactory;&#xA;use Illuminate\Foundation\Auth\User as Authenticatable;&#xA;use Illuminate\Notifications\Notifiable;&#xA;use JeroenG\Explorer\Application\Explored;&#xA;use Laravel\Scout\Searchable;&#xA;&#xA;class User extends Authenticatable implements Explored&#xA;{&#xA;    use HasFactory, Notifiable, Searchable;&#xA;&#xA;    /**&#xA;     * The attributes that are mass assignable.&#xA;     *&#xA;     * @var array&#xA;     */&#xA;    protected $fillable = [&#xA;        &#39;name&#39;,&#xA;        &#39;email&#39;,&#xA;        &#39;password&#39;,&#xA;    ];&#xA;&#xA;    /**&#xA;     * The attributes that should be hidden for arrays.&#xA;     *&#xA;     * @var array&#xA;     */&#xA;    protected $hidden = [&#xA;        &#39;password&#39;,&#xA;        &#39;remember_token&#39;,&#xA;    ];&#xA;&#xA;    /**&#xA;     * The attributes that should be cast to native types.&#xA;     *&#xA;     * @var array&#xA;     */&#xA;    protected $casts = [&#xA;        &#39;email_verified_at&#39; =&gt; &#39;datetime&#39;,&#xA;    ];&#xA;&#xA;    public function mappableAs(): array&#xA;    {&#xA;        return [&#xA;            &#39;id&#39; =&gt; &#39;keyword&#39;,&#xA;            &#39;name&#39; =&gt; &#39;text&#39;,&#xA;            &#39;email&#39; =&gt; &#39;text&#39;,&#xA;            &#39;created_at&#39; =&gt; &#39;date&#39;,&#xA;        ];&#xA;    }&#xA;}سپس دستور زیر را وارد کنید تا سوابق جدول یوزر به scout اضافه شود.php artisan scout:import &#34;App\Models\User&#34;همچنین با اجرای دستورات زیر می‌توانید تنظیمات مربوط به سرور elasticsearch را مدیریت کنید.# create indexes&#xA;php artisan elastic:create&#xA;&#xA;# delete indexes&#xA;php artisan elastic:delete&#xA;&#xA;# search indexes&#xA;php artisan elastic:search &#34;App\Models\User&#34; loremبه یاد داشته باشید که در ابتدای کار حتما باید دستور php artisan elastic:create را وارد کنید.خب تقریبا کار به اتمام رسیده و از اینجا به بعد یک رکورد در جدول یوزر ایجاد می‌کنیم و نتیجه‌ی آن را در الستیک جستجو می‌کنیم. برای اینکار به فایل web.php رفته و یک روت مانند زیر ایجاد می‌کنیم  و یک داده در جدول ذخیره می‌کنیم. (برای ثبت داده های بیشتر می‌توانید از seeder های لاراول بهره بگیرید)Route::get(&#39;/&#39;, function () {&#xA;&#xA;    $user = new \App\Models\User();&#xA;    $user-&gt;name = &#39;john&#39;;&#xA;    $user-&gt;email = &#34;john@gamil.com&#34;&#xA;    $user-&gt;password = \Illuminate\Support\Facades\Hash::make(&#39;12345678&#39;);&#xA;    $user-&gt;save();&#xA;&#xA;    if ($user)&#xA;        return &#34;success&#34;&#xA;&#xA;    return &#39;Unsuccessful&#39;;&#xA;&#xA;&#xA;});حالا می‌توانیم با دستورات زیر داده‌ی های موجود در مدل یوزر یا هر مدل دیگری که به الستیک‌سرچ متصل باشد را جستجو کنیم.$users = \App\Models\User::search(&#39;john&#39;)-&gt;get();&#xA;&#xA;//or&#xA;&#xA;$users = \App\Models\User::search(&#39;email:(john@gamil.com)&#39;)-&gt;get();&#xA;&#xA;//or&#xA;&#xA;\App\Models\ModelName::search(&#39;phone&#39;)&#xA;    // specify columns to select&#xA;    -&gt;select([&#39;title&#39;, &#39;price&#39;])&#xA;    // filter &#xA;    -&gt;where(&#39;color&#39;, &#39;red&#39;)&#xA;    // sort&#xA;    -&gt;orderBy(&#39;price&#39;, &#39;asc&#39;)&#xA;    // collapse by field&#xA;    -&gt;collapse(&#39;brand&#39;)&#xA;    // set offset&#xA;    -&gt;from(0)&#xA;    // set limit&#xA;    -&gt;take(10)&#xA;    // get results&#xA;    -&gt;get();&#xA;&#xA;//or&#xA;&#xA;$posts = Post::search(&#39;lorem&#39;)&#xA;    -&gt;must(new Matching(&#39;title&#39;, &#39;ipsum&#39;))&#xA;    -&gt;should(new Terms(&#39;tags&#39;, [&#39;featured&#39;], 2))&#xA;    -&gt;filter(new Term(&#39;published&#39;, true))&#xA;    -&gt;get();&#xA;امیدوارم آموزش مفید بوده باشه اگر سوالی داشتید در کامنتها مطرح کنید اگر بلد بودم حتما پاسخ خواهم داد.</description><category>sina khaghani</category><author>sina khaghani</author><pubDate>Fri, 11 Jun 2021 20:26:41 +0430</pubDate></item><item><title>Cursor Pagination در لاراول</title><link>https://virgool.ir/laravel-community/cursor-pagination-در-لاراول-zsqfty6kjed4</link><description>اگر با صفحه‌بندی‌های لاراول (pagination) کار کرده باشین می‌دانید که نحوه ی کار آنها به چه صورت استLaravel Paginationایجاد چنین صفحه بندی در لاراول اصلا کار سختی نیست، شما می‌توانید با نوشتن کد زیر یک صفحه بندی آماده در لاراول ایجاد کنید.use App\Models\User;&#xA;&#xA;$users = User::paginate(15);$users = User::where(&#39;votes&#39;, &#39;&gt;&#39;, 100)-&gt;simplePaginate(15); https://laravel.com/docs/8.x/pagination Laravel Cursor Paginationحالا در نسخه‌ی لاراول 8.41 متود جدیدی در لاراول اضافه خواهد شد که صفحه‌بندی را بسیار بهینه‌تر و کارآمد‌تر از نمونه‌های قبلی آن خواهد کرد.$users = User::orderBy(&#39;id&#39;)-&gt;cursorPaginate(10);اما این متود چه تفاوتی با متودهای قبلی دارد؟اگر خاطرتان باشد در متودهای قبلی صفحه بندی لاراول آدرس url لینکهای صفحه بندی به صورت زیر بودhttp://127.0.0.1:8000/users?page=2اما در نسخه‌ی جدید این متود آدرسهای url به صورت یک رشته‌ی یونیک در خواهد آمد لذا کاربران دیگر نمی‌توانند با وارد کردن آدرس  https://example.com/user?page=3 مثلا به صفحه‌ی سوم سایت شما دسترسی داشته باشند و برای دیدن صفحات دیگر حتما باید وارد صفحه‌ی اول سایت شما شوند.{&#xA;  &#34;data&#34;: [&#xA;    {&#xA;      &#34;id&#34;: 1,&#xA;      &#34;name&#34;: &#34;Nona Wilkinson&#34;,&#xA;      &#34;email&#34;: &#34;stephen68@example.com&#34;,&#xA;      &#34;email_verified_at&#34;: &#34;2021-05-12T23:21:19.000000Z&#34;,&#xA;      &#34;created_at&#34;: &#34;2021-05-12T23:21:19.000000Z&#34;,&#xA;      &#34;updated_at&#34;: &#34;2021-05-12T23:21:19.000000Z&#34;&#xA;    },&#xA;    {&#xA;      &#34;id&#34;: 2,&#xA;      &#34;name&#34;: &#34;Titus Feeney Sr.&#34;,&#xA;      &#34;email&#34;: &#34;oklein@example.com&#34;,&#xA;      &#34;email_verified_at&#34;: &#34;2021-05-12T23:21:19.000000Z&#34;,&#xA;      &#34;created_at&#34;: &#34;2021-05-12T23:21:19.000000Z&#34;,&#xA;      &#34;updated_at&#34;: &#34;2021-05-12T23:21:19.000000Z&#34;&#xA;    },&#xA;    {...}&#xA;  ],&#xA;  &#34;path&#34;: &#34;http://127.0.0.1:8000/users&#34;,&#xA;  &#34;per_page&#34;: 10,&#xA;  &#34;next_page_url&#34;: &#34;http://127.0.0.1:8000/users?cursor=eyJpZCI6MTAsIl9wb2ludHNUb05leHRJdGVtcyI6dHJ1ZX0&#34;,&#xA;  &#34;prev_page_url&#34;: null&#xA;}همچنین به گفته‌ی سازندگان این متود، این مدل صفحه بندی برای کار با بیگ‌دیتا، جداول بزرگ و API بسیار بهینه‌تر و کارآمد‌تر عمل می‌کند.</description><category>sina khaghani</category><author>sina khaghani</author><pubDate>Sun, 06 Jun 2021 18:11:20 +0430</pubDate></item></channel></rss>