تغییرات جدید لاراول 11.23 - کانکارنسی (Concurrency) در لاراول؟

لاراول امروز ورژن جدید خودش یعنی 11.23 ریلیز کرد. در این ورژن ما شاهد تغییرات خیلیییی خفنی هستیم مثل کانکارنسی، contextual container attritubes و... .

 

Concurrency Facade

در لاراکون 2024 آمریکا، یکی از بهترین فیچر های اضافه شده به لاراول ویژگی همزمانی (concurrency) هست. این ویژگی به ما این امکان میده که یک چندین کار در لحظه انجام بدیم. این امکان من حدود 3 ماه پیش در شبکه های اجتماعی خودم گفته بودم که میاد دوست داشتید اونجا منو دنبال کنید. برای استفاده از این امکان خیلییی راحت میتونید از یک فسادی به نام Concurrency استفاده کنید:

use IlluminateSupportFacadesConcurrency;
use IlluminateSupportFacadesDB;

[$userCount, $orderCount] = Concurrency::run([
        fn () => DB::table('users')->count(),
    fn () => DB::table('orders')->count(),
]);
 

 

Contextual Attributes

در آپدیت جدید لاراول که قبلا هم بهش اشاره کرده بودم در کد نیوز، یک قابلیت خیلی خفن به لاراول اضافه شده که شما میتونید به راحتی با استفاده از اتربیوت ها بیاید از یک سرویس لاراول با یک درایور مشخص استفاده کنید:

use IlluminateContainerAttributesAuth;
use IlluminateContainerAttributesCache;
use IlluminateContainerAttributesConfig;
use IlluminateContainerAttributesDB;
use IlluminateContainerAttributesLog;
use IlluminateContainerAttributesTag;
use IlluminateContractsAuthGuard;
use IlluminateContractsCacheRepository;
use IlluminateContractsDatabaseConnection;
use PsrLogLoggerInterface;

class PhotoController extends Controller
{
    public function __construct(
        #[Auth('web')] protected Guard $auth,
        #[Cache('redis')] protected Repository $cache,
        #[Config('app.timezone')] protected string $timezone,
        #[DB('mysql')] protected Connection $connection,
        #[Log('daily')] protected LoggerInterface $log,
        #[Tag('reports')] protected iterable $reports,
    )
    {
// ...
    }
}
 
 
 

 برای دیدن این Pull Request کلیک کنید.

 

متد جدید "chaperone" در الوکوئنت

در لاراول یک متد جدید وجود داره به نام chaperone. خیلی اوقات شما نیاز داشتید داخل یک حلقه بیاید از parent استفاده کنید و این کار باعث مشکل N+1 میشه. برای مثال به شکل زیر عمل میکنید:

 
$posts = Post::with('comments')->get();

foreach ($posts as $post) {
    foreach ($post->comments as $comment) {
        echo $comment->post->title;
    }
} 
 

خب اینجا ما مشکل N+1 داریم. حالا لاراول یک راهی جلوی پای ما قرار داده که به راحتی میتونیم با استفاده از روش زیر بیایم این مشکل حل کنیم:

 
class Post extends Model
{
    /**
     * Get the comments for the blog post.
     */
    public function comments(): HasMany
    {
        return $this->hasMany(Comment::class)->chaperone();
    }
}

 برای دیدن این Pull Request کلیک کنید.

 

هلپر جدید به نام "defer()"

در لاراول یک امکان بسیار خفن اومده که شما بدون نیاز به Queue ها بیاید یک سری تسک که ساده هستند در پشت صحنه اجرا شوند و درخواست به سرعت ادامه داشته باشه، برای اینکار کافیه از هلپر defer استفاده کنید:

defer(fn () => Metrics::reportOrder($order));

 برای دیدن این Pull Request کلیک کنید.

 

اضافه شدن minRatio و maxRatio به "Dimension" در اعتبارسنجی

 در لاراول یک اعتبارسنجی به Dimension اضافه شده که مین و مکس رو میتونید ست کنید:

// dimensions:min_ratio=0.5,max_ratio=0.33333333333333
Rule::dimensions()
    ->minRatio(1 / 2)
    ->maxRatio(1 / 3);

// dimensions:min_ratio=0.5,max_ratio=0.33333333333333
Rule::dimensions()->ratioBetween(min: 1 / 2, max: 1 / 3);

 برای دیدن این Pull Request کلیک کنید.

 

پشتیبانی از Enum ها در تمامی متد های Gate

در این ورژن شما میتونید از Enum ها در تمامی متد های Gate استفاده کنید:

Gate::define(Abilities::VIEW_DASHBOARD, function (User $user) {
    return $user->isAdmin;
});

Gate::authorize(Abilities::VIEW_DASHBOARD);

  برای دیدن این Pull Request کلیک کنید.

 

قابلیت Skip کردن میدلور ها در جاب ها

در لاراول شما میتونید بر اساس یک شرط (condition) بیاید یک میلدور در جاب رو یه جورایی حذف (skip) کنید:

class MyJob implements ShouldQueue
{
    use Queueable;

    public function handle(): void
    {
        // TODO
    }

    public function middleware(): array
    {
        return [
            Skip::when($someCondition), // Skip when true

            Skip::unless($someCondition), // Skip when false

            Skip::when(function(): bool {
                if ($someCondition) {
                    return true;
                }
                return false;
            }),
        ];
    }
}

 برای دیدن این Pull Request کلیک کنید.

 

اضافه شدن متد "()findOrFail" به کالکشن ها

در این ورژن یک متد جدید به کالکشن ها اضافه شده که بتونید ریکورد ها از مدل پیدا کنید خیلی راحت تره:

$users = User::get(); // [User(id: 1), User(id: 2)]

$users->findOrFail(1); // User

$user->findOrFail([]); // []

$user->findOrFail([1, 2]); // [User, User]

$user->findOrFail(3); // ModelNotFoundException: 'No query results for model [User] 3'

$user->findOrFail([1, 2, 3]); // ModelNotFoundException: 'No query results for model [User] 3'

 برای دیدن این Pull Request کلیک کنید.

 

اضافه شدن هلپر "when"

یک هلپر جدید به نام when به لاراول اضافه شده که شما میتونید یک شرط بهش بدید و اگه شرط درست باشه اون مقدار که میخواید برمیگردونه و اگه درست نباشه null برمیگردونه (به نظر خودم این هلپر اضافیه اما خب):

when(true, 'Hello'); // Hello
when(false, 'Hello'); // null

  برای دیدن این Pull Request کلیک کنید.

 

تغییرات جزئی:

  • فیکس کردن docblock های اعتبارسنجی - #52644
  • اضافه شدن ورژن postgres 10 به گیت هاب اکشن ها - #52631
  • فیکس کردن نمایش متد everyThirtyMinutes به صورت درست - #52662
  • اضافه کردن پکیج "serializable-closure" به بخش suggestion در کامپوزر - #52673
  • Fix alter table expressions on SQLite - #52678
  • اضافه شدن متد "mapLogLevel" به Exception ها - #52666
  • تغییرات روی متد "trim" در کلاس Str ذ - #52684
  • اضافه کردن متد "()withoutDelay" به جاب ها - #52696
  • ریفکتور کردن متد "()getInstance" در کانتینر ها - #52693
  • حذف کردن متد های "setAccessible" از reflection ها در هسته - #52691
  • تقویت کردن PHPStan در داک بلاک - #52712
  • فیکس کردن docblock در کالکشن های مدل ها - #52724
  • اضافه کردن پارامتر به confirmed در اعتبارسنجی - #52722
  • اضافه کردن متد "()fromUrl" به ایمیل ها - #52688
  • فیکس کردن داک بلاک - #52719
  • اضافه کردن پارامتر $absolute به متد "()assertRedirectToSignedRoute" در تست ها - #52726
  • تقویت تست ها - #52718
  • فیکس کردن docblock کلاس Builder الوکوئنت - #52729

 

برای دیدن فایل changelog.md این ورژن کلیک کنید.

برای دیدن release این ورژن کلیک کنید.

2 🔥
0 🎉
2 😮
2 👍
1 💜
1 👏
میلاد خسروی
نویسنده کد نیوز

برنامه نویس فان | Fun Developer یک آدم ساده که عاشق برنامه نویسی و کد زدنه :) تلاش میکنه تا به بقیه کمک کنه. توسعه دهنده هسته لاراول و فضای اوپن سورس. فاندر پرانتز و کد نیوز.

0+ نظر

برای ثبت نظر ابتدا ورود کنید.

0 نظر

    اولین نفر باش که نظر ثبت میکنی :) یعنی یه کامنت به ما نمیرسه 😁