کانال آموزشی لاراول
3.06K subscribers
120 photos
4 videos
38 links
📌 کانال اتاق برنامه نویسی
@PapiDon_coding
Download Telegram
"It always seems impossible until it's done."

🌟همیشه چیزها غیرممکن به نظر می‌رسند تا زمانی که انجام شوند.

این جمله به ما یادآور می‌شود که حتی اگر چیزی دشوار یا غیرممکن به نظر بیاید، با تلاش و پشتکار، می‌توان آن را به انجام رساند. بیایید با این انرژی و باور به توانمندی‌های خود، روزمان را شروع کنیم.


📌@PapiDon_state
👍81👏1
🚀 maatwebsite/excel in Larave

این پکیج، یک ابزار قدرتمند برای کار با فایل‌های Excel در فریم‌ورک لاراول است. این ابزار اجازه می‌دهد که به آسانی اطلاعات را از یک فایل Excel وارد و یا به آن خروجی دهید.

ویژگی‌ها:

1. وارد کردن اطلاعات با سرعت بالا
2. خروجی با فرمت‌های مختلف مانند XLS, XLSX, CSV
3. امکان مپ کردن ستون‌های فایل به مدل‌های دیتابیس
4. پشتیبانی از معیارها و فیلترهای مختلف

🛠نحوه نصب:

برای نصب این پکیج کافی است دستور زیر را در ترمینال خود اجرا کنید:

composer require maatwebsite/excel

📖 مستندات:

https://packagist.org/packages/maatwebsite/excel


📌@PapiDon_state
👍101
🚀 معرفی Pest در لاراول 🚀

آیا تا کنون با Pest آشنا شده‌اید؟

🔍 یک ابزار تست نویسی جدید و پویا در لاراول است. با این ابزار، می‌توانید تست‌های خود را با یک سینتکس زیباتر و ساده‌تر نوشته و اجرا کنید.

🌟 ویژگی‌های کلیدی:

1️⃣ سینتکس ساده و خواندنی: با استفاده از Pest، کدهای تست شما کوتاه‌تر، خواناتر و بهینه‌تر خواهد بود.

2️⃣ پشتیبانی از توابع Higher-order و متدهای Chainable : با این ویژگی، تست‌نویسی به یک تجربه انعطاف‌پذیر و قدرتمند تبدیل می‌شود.

⚙️ برای استفاده از Pest کافی است از طریق composer آن را نصب کنید:

composer require pestphp/pest --dev

🎉 اگر به دنبال بهبود فرآیند تست نویسی خود در لاراول هستید، Pest یک گزینه عالی است!

🔗 مستندات :
https://pestphp.com/


📌@PapiDon_state
👍62👏2
استفاده از متد __invoke در #لاراول

هر زمان که بخواهید یک کنترلر با تنها یک وظیفه داشته باشید، می‌توانید از متد جادویی __invoke استفاده کنید!

🔍 چرا؟

1️⃣ سادگی: نیازی به تعیین نام متد در مسیر ندارید.
2️⃣ خواندنی: کدتان تمیزتر و مستقیم‌تر می‌شود.

🌟 مثال:

کنترلر:
class ShowProfile extends Controller {
public function __invoke($id) {
// code ...
}
}


مسیر:
اگر از این متد در کنترلر استفاده کنید، نیازی به تعیین نام متد در مسیر (route) ندارید

Route::get('/user/{id}', ShowProfile::class);


همین! هر زمان که این مسیر فراخوانی می‌شود، متد __invoke اجرا می‌شود. 😍


@PapiDon_state
👍211
🔍 الگوی (Repository Pattern) در برنامه‌نویسی چیست؟

📚 فرض کنید می‌خواهید یک کتاب از کتابخانه بیرون بیاورید:

1️⃣ اگر مستقیما وارد انبار کتاب‌ها شوید و شروع به جستجو کنید، زمان زیادی می‌برد، گم می‌شوید و حتی ممکن است به دسترسی اطلاعات نادرست یا مناسبی نرسیده باشید.

2️⃣ اما، وقتی به میز اطلاعات مراجعه می‌کنید و از کتابدار کمک می‌خواهید، او به سرعت می‌تواند کتاب مورد نظر شما را پیدا و به شما بدهد.

در این مثال:

🔹کتابدار: همان "Repository" است. او می‌داند که هر کتاب کجا قرار دارد و چگونه باید به آن دسترسی پیدا کرد.

🔹انبار کتاب‌ها: به منابع داده اطلاعاتی (مثل پایگاه‌های داده یا APIها) اشاره دارد.

زمانی که در برنامه‌نویسی از الگوی "Repository Pattern" استفاده می‌کنیم، به جای اینکه مستقیماً به منبع داده مراجعه کنیم، با استفاده از یک "Repository" به داده‌ها دسترسی پیدا می‌کنیم. این رویکرد باعث می‌شود کد برنامه‌ی ما تمیزتر، قابل فهم‌تر و قابل تست‌تر باشد.


📌@PapiDon_state
🔥10❤‍🔥21👍1🙏1
فرض کنید می‌خواهید از یک پایگاه داده لیستی از کتاب‌ها را دریافت کنید. بدون استفاده از الگوی Repository، ممکن است مستقیماً در کنترلر خود از مدل استفاده کنید:

بدون استفاده از Repository:
namespace App\Http\Controllers;

use App\Models\Book;
use Illuminate\Http\Request;

class BookController extends Controller
{
public function index()
{
$books = Book::all();
return view('books.index', compact('books'));
}
}

اما با استفاده از الگوی Repository، شما یک مخزن برای کتاب‌ها می‌سازید:

BookRepository.php

namespace App\Repositories;

use App\Models\Book;

class BookRepository
{
protected $book;

public function __construct(Book $book)
{
$this->book = $book;
}

public function all()
{
return $this->book->all();
}
}

حالا، در کنترلر خود، از این مخزن استفاده می‌کنید:

namespace App\Http\Controllers;

use App\Repositories\BookRepository;
use Illuminate\Http\Request;

class BookController extends Controller
{
protected $bookRepository;

public function __construct(BookRepository $bookRepository)
{
$this->bookRepository = $bookRepository;
}

public function index()
{
$books = $this->bookRepository->all();
return view('books.index', compact('books'));
}
}

با استفاده از این رویکرد:

1️⃣ کد شما تمیزتر و منظم‌تر می‌شود.
2️⃣ اگر روزی تصمیم به تغییر منبع داده (مثل استفاده از یک API به جای پایگاه داده) بگیرید، فقط باید مخزن مربوطه را تغییر دهید و نیازی به تغییر کنترلرها ندارید.
3️⃣ تست‌ها نیز آسان‌تر انجام می‌شوند. شما می‌توانید برای مخزن یک mock ایجاد کرده و از آن در تست‌ها استفاده کنید.

⚙️این فقط یک مثال ساده بود. در پروژه‌های واقعی، الگوی Repository می‌تواند بسیار پیچیده‌تر و قدرتمندتر باشد.

⚠️در لاراول به صورت پیش فرض دستوری برای ایجاد یک "Repository" وجود ندارد. اما شما می‌توانید به صورت دستی خودتان فایل‌ها را ایجاد کنید.
برای ایجاد یک "Repository" به صورت دستی:

1️⃣ ابتدا یک پوشه با نام "Repositories" در داخل پوشه "app" ایجاد کنید.
2️⃣درون این پوشه، یک فایل با نام Repositorie خود، مانند "BookRepository.php"، ایجاد کنید.

📌@PapiDon_state
👍121👏1🙏1
اگر تو نخواهی یاد بگیری، هیچ کس نمی‌تواند به تو کمک کند. اگر تو به یادگیری مصمم باشی، هیچ کس نمی‌تواند مانع تو باشد.

💪 @PapiDon_state
👍106👏1👌1
🛠 Factory Pattern 🛠

همیشه در هنگام نوشتن کد با مواردی مواجه می‌شویم که نیاز به ایجاد نمونه‌های متعدد از یک کلاس داریم. الگوی Factory به ما کمک می‌کند تا این فرایند را ساده‌تر و منظم‌تر کنیم.

🧐 چرا از الگوی Factory ؟

1️⃣جداسازی فرآیند ایجاد نمونه از کد اصلی.

2️⃣انعطاف‌پذیری بیشتر: تغییر نحوه ایجاد نمونه بدون تغییر در کد اصلی.

3️⃣ مدیریت آسان‌تر و ساختار بهتر برای کد.

4️⃣کد خالص‌تر و منظم‌تر.

در Laravel، الگوی Factory همراه با Dependency Injection استفاده می‌شود، که ساخت نمونه‌های پیچیده‌تر را آسان‌تر می‌کند.

⚙️ با استفاده از Factory Pattern، می‌توانید نوشتار کد خود را منعطف‌تر و قابل مدیریت‌تر کنید.

📌@PapiDon_state
👍121
Factory Pattern

ما یک وب‌سایت فروش ماشین داریم. در این وب‌سایت، کاربر می‌تواند از میان انواع مختلف ماشین‌ها مثل Sedan یا SUV انتخاب کند. برای سادگی، ما می‌خواهیم هنگام ساخت یک ماشین جدید، تنها نوع ماشین مورد نظر کاربر را مشخص کنیم و سایر جزئیات مربوط به آن نوع ماشین بطور خودکار تعیین شود.

⚙️ بدون استفاده از الگوی Factory:

1️⃣ایجاد مدل‌ها
// app/Models/Sedan.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Sedan extends Model {
public function description() {
return "I'm a Sedan!";
}
}

// app/Models/SUV.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class SUV extends Model {
public function description() {
return "I'm an SUV!";
}
}


2️⃣استفاده از مدل‌ها در Controller

use App\Models\Sedan;
use App\Models\SUV;

public function createCar($type) {
if ($type === 'sedan') {
$car = new Sedan();
} elseif ($type === 'suv') {
$car = new SUV();
} else {
throw new Exception("Car type not recognized.");
}

return $car->description();
}


با استفاده از الگوی Factory

1️⃣ ایجاد یک Factory
// app/Factories/CarFactory.php
namespace App\Factories;

use App\Models\Sedan;
use App\Models\SUV;

class CarFactory {
public static function create($type) {
switch($type) {
case 'sedan':
return new Sedan();
case 'suv':
return new SUV();
default:
throw new Exception("Car type not recognized.");
}
}
}


2️⃣ استفاده از Factory در Controller
use App\Factories\CarFactory;

public function createCarUsingFactory($type) {
$car = CarFactory::create($type);
return $car->description();
}


🛠 همانطور که می‌بینید، با استفاده از الگوی Factory، کد Controller ساده‌تر و منظم‌تر شده و امکان افزودن نوع‌های جدیدی از ماشین‌ها به راحتی وجود دارد، بدون آنکه نیازی به تغییر Controller باشد.

📌@PapiDon_state
🔥7👍3👏31👌1
⚜️آشنایی با متد updateOrCreate

آیا تاکنون خواسته‌اید در لاراول یک رکورد را به روز کنید و اگر وجود نداشت، آن را ایجاد کنید؟ 🤔 updateOrCreate همان گزینه‌ی مورد نظر شماست!

🧐 چطور کار می‌کند؟

1️⃣ اول، بر اساس معیارهایی که مشخص کرده‌اید، جستجو می‌شود.

2️⃣ اگر رکورد با آن معیارها وجود داشت، داده‌ها به روز می‌شوند.

3️⃣ اگر وجود نداشت، یک رکورد جدید با آن مشخصات ایجاد می‌شود.

📌 مثال ساده:

$user = User::updateOrCreate(
['email' => 'sample@example.com'],
['name' => 'Ali']
);

در این مثال، اگر کاربری با ایمیل sample@example.com وجود داشت، نامش به Ali تغییر می‌کند. اگر نبود، کاربر جدیدی با این ایمیل و نام ایجاد می‌شود.

با `updateOrCreate`، همیشه اطمینان داشته باشید که داده‌هایتان به روز و بدون تکرار است!


📌@PapiDon_state
👍121
کانال آموزشی لاراول
⚜️آشنایی با متد updateOrCreate آیا تاکنون خواسته‌اید در لاراول یک رکورد را به روز کنید و اگر وجود نداشت، آن را ایجاد کنید؟ 🤔 updateOrCreate همان گزینه‌ی مورد نظر شماست! 🧐 چطور کار می‌کند؟ 1️⃣ اول، بر اساس معیارهایی که مشخص کرده‌اید، جستجو می‌شود. 2️⃣ اگر…
⚜️گسترش آشنایی با updateOrCreate در لاراول با معیارهای چندگانه

آیا می‌دانستید که می‌توانید چندین معیار را برای جستجو و به روزرسانی یا ایجاد رکورد جدید استفاده کنید؟ 📚

🔍 مثال:
فرض کنید می‌خواهید چاپ‌های مختلف یک کتاب را مدیریت کنید. با استفاده از متد updateOrCreate ، می‌توانید بر اساس عنوان، ناشر، سال چاپ و نوع جلد چک کنید که آیا چاپ مورد نظر وجود دارد یا خیر.


Book::updateOrCreate(
['title' => '1984',
'publisher' => 'Penguin',
'year' => 2020,
'cover_type' => 'Hardcover'
],
['edition_number' => 5]
);


🌟 با استفاده از updateOrCreate و معیارهای چندگانه، همیشه اطمینان داشته باشید که اطلاعاتتان به روز و یکتا هستند!

📌@PapiDon_state
👍8🙏21
🔥 آشنایی با متد firstOrCreate

🧐 به دنبال یک روش سریع و ساده برای جستجو یا ایجاد یک رکورد در دیتابیس هستید؟ firstOrCreate پاسخ شماست!

⚙️ چگونه عمل می‌کند؟

1️⃣ - ابتدا برای یافتن رکورد با معیارهای مشخص شده جستجو می‌کند.

2️⃣ - اگر رکوردی با این معیارها یافت شد، آن رکورد برگردانده می‌شود.

3️⃣ - در غیر این صورت، یک رکورد جدید با آن معیارها ایجاد و برگردانده می‌شود.

📌 مثال:

$user = User::firstOrCreate(
['email' => 'sample@example.com'],
['name' => 'Ali']
);

در این مثال، اگر کاربری با ایمیل sample@example.com وجود داشته باشد، آن را برمی‌گرداند. اگر نباشد، یک کاربر جدید با نام Ali و این ایمیل ایجاد می‌کند.

با firstOrCreate ، همیشه اطمینان داشته باشید که با سرعت به جستجو و ایجاد رکوردها پرداخته می‌شود!

📌@PapiDon_state
👍62🔥2
⚠️🛠 تفاوت‌های firstOrCreate و updateOrCreate

هر دو این متدها برای کمک به شما در جستجو، به روزرسانی یا ایجاد رکوردها در دیتابیس هستند، اما با تفاوت‌هایی:

🔹 firstOrCreate:

1️⃣ - ابتدا برای یافتن رکورد با معیارهای مشخص شده جستجو می‌کند.

2️⃣ - اگر رکورد یافت شد، آن را برمی‌گرداند.

3️⃣ - اگر رکوردی نیافت، یک رکورد جدید با معیارهای مشخص شده ایجاد می‌کند.

🔸updateOrCreate:

1️⃣ - ابتدا برای یافتن رکورد با معیارهای مشخص شده جستجو می‌کند.

2️⃣ - اگر رکورد یافت شد، مقادیر مورد نظر را به روزرسانی می‌کند.

3️⃣ - اگر رکوردی نیافت، یک رکورد جدید با معیارهای مشخص شده ایجاد می‌کند.


🧐 بنابراین، تفاوت اصلی بین این دو در این است که updateOrCreate می‌تواند یک رکورد موجود را به روز کند، در حالی که firstOrCreate فقط یافتن یا ایجاد رکورد جدید را انجام می‌دهد.

💡 آیا قبلا از این متدها استفاده کرده‌اید؟

📌@PapiDon_state
👍162
Singleton Pattern

🔹 یکی از الگوهای طراحی است که تنها یک نمونه از یک کلاس خاص را در کل برنامه ایجاد می‌کند.

چه فوایدی دارد؟

- مدیریت منابع مشترک از یک مرکز
- جلوگیری از ایجاد نمونه‌های غیرضروری
- بهینه‌سازی حافظه و منابع
- انتقال یکپارچه داده‌ها

🔸با استفاده از Singleton، شما می‌توانید دسترسی به این منابع مشترک را از یک مرکز مدیریت کنید. این کار باعث می‌شود که ایجاد نمونه‌های غیر ضروری از کلاس‌ها جلوگیری شود و بهینه‌سازی حافظه و منابع را انجام دهید. همچنین، با استفاده از این الگو، انتقال داده‌ها بین قسمت‌های مختلف برنامه به صورت یکپارچه و مؤثر انجام می‌شود.

🔹به طور کلی، در لاراول، استفاده از الگوی Singleton می‌تواند به تنظیم و مدیریت منابع مشترک کمک کند و اطمینان حاصل کند که داده‌ها در سراسر برنامه یکپارچه و یکنواخت است.

📌 @PapiDon_state
👍61
📌 بیایید یک مثال ساده از استفاده از الگوی Singleton در لاراول بزنیم.

فرض کنید ما یک کلاس Logger داریم که می‌خواهیم اطمینان حاصل کنیم تنها یک نمونه از آن در کل برنامه ساخته شود.

ابتدا یک کلاس Logger می‌سازیم:

class Logger {
private $logs = [];

public function addLog($message) {
$this->logs[] = $message;
}

public function getLogs() {
return $this->logs;
}
}

حالا در ServiceProvider مورد نظر (مثلا AppServiceProvider), می‌توانیم از متد singleton استفاده کنیم تا اطمینان حاصل کنیم که تنها یک نمونه از Logger وجود دارد:


use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider {

public function register() {
$this->app->singleton(Logger::class, function ($app) {
return new Logger();
});
}
}


حالا وقتی می‌خواهید از Logger استفاده کنید:

public function someMethod(Logger $logger) {
$logger->addLog("This is a message.");
// ...
}

با هر بار فراخوانی Logger در هر قسمتی از برنامه، شما همان نمونه واحد را دریافت می‌کنید و تمامی پیام‌های ثبت‌شده را می‌توانید مشاهده کنید.

⚙️ این فقط یک مثال ساده بود. در برنامه‌های واقعی، الگوی Singleton می‌تواند در موارد پیچیده‌تری مورد استفاده قرار گیرد، مانند ارتباط با پایگاه داده، مدیریت منابع و غیره.

📌 @PapiDon_state
👍43🔥2🙏1
Success is not the result of one day of visible actions, but the result of consecutive days of small actions.

موفقیت نتیجه‌ی یک روزه انجام‌شدن اعمال قابل مشاهده نیست، بلکه نتیجه‌ی روزهای متوالی انجام‌شدن اعمال کوچک است


📌 @PapiDon_state
👍7🔥2👏21
📲 PWA ( Progressive Web Apps )

اپلیکیشن‌های وبی هستند که تجربه مشابه اپلیکیشن‌های موبایل را فراهم می‌کنند. این تکنولوژی افزایش تعامل کاربر با وبسایت و بهینه‌سازی مصرف داده‌ها را می‌آورد.

⚙️ کاربردهای PWA

1️⃣ بهبود سرعت بارگذاری وبسایت

2️⃣ کارکرد بدون اتصال به اینترنت

3️⃣ ارسال پوش نوتیفیکیشن

4️⃣ امکان اضافه کردن به صفحه اصلی دستگاه‌ها مانند یک اپلیکیشن موبایل

5️⃣ بهینه‌سازی مصرف داده‌ها

6️⃣ افزایش تعامل کاربر با وبسایت

تکنولوژی PWA

🔸Service Workers:
اسکریپت‌هایی که در پس‌زمینه اجرا می‌شوند و امکان کارکرد بدون اتصال به اینترنت، پیش‌بارگیری منابع و پوش نوتیفیکیشن‌ها را فراهم می‌آورند.

🔹Manifest:
فایلی به فرمت JSON است که اطلاعات مرتبط با نمایش و اجرای اپلیکیشن را برای استفاده در دستگاه‌های مختلف در بر دارد.

🔸Caching:
با استفاده از Service Workers، منابع وبسایت در دستگاه کاربر ذخیره می‌شوند، اکه این امر امکان بارگیری سریع‌تر و کارکرد بدون اتصال به اینترنت را فراهم می‌آورد.

📌@PapiDon_state
👍71
🔎 متد onError در Laravel چیست؟

متد ()onError به HTTP client افزوده شده که به شما این امکان را می‌دهد تا در صورت بروز خطایی هنگام ارسال یک درخواست HTTP، عملی خاص انجام دهید، مثل ثبت یک پیام خطا.

return $client->withHeaders($headers)
->post($url, $payload)
->onError(fn ($response) =>
Log::error('Twitter API failed posting Tweet', [
'url' => $url,
'payload' => $payload,
'headers' => $headers,
'response' => $response->body(),
])
)->json();

📌@PapiDon_state
👍91👏1
🧐 What is Pure Functions ?

توابع خالص یا Pure Functions مفهوم مهمی در برنامه‌نویسی هستند که دارای دو ویژگی اصلی می‌باشند:

1️⃣ خروجی ثابت: برای ورودی‌های مشابه، همیشه یک خروجی یکسان تولید می‌کنند.

2️⃣ عدم وجود اثرات جانبی (Side Effects): هیچ تغییری در وضعیت برنامه یا متغیرهای خارج از تابع ایجاد نمی‌کنند.

function add(a, b) {
return a + b;
}


این تابع با گرفتن دو عدد، جمع آن‌ها را بر می‌گرداند و هیچ Side Effect ندارد.

⚙️ مزایا :

🔹پیش‌بینی‌پذیری: به دلیل اینکه خروجی توابع خالص فقط به ورودی‌هایش بستگی دارد, برنامه‌نویس می‌تواند از رفتار آنها مطمئن باشد.

🔸تست‌پذیری: توابع خالص راحت‌تر می‌توانند تست شوند چون فقط باید ورودی داده شده و خروجی تولید شده را بررسی کرد.

🔹قابلیت ترکیب‌پذیری: توابع خالص می‌توانند راحت‌تر با یکدیگر ترکیب شوند تا وظایف پیچیده‌تری انجام دهند.

📌@PapiDon_state
👍21🔥1