| کانال توسعه‌دهندگان لاراول |
1.61K subscribers
54 photos
114 links
⭕️ کانال توسعه‌دهندگان لاراول دولوپیکس

💠 دولوپیکس | جامعه توسعه‌دهندگان ایرانی

💎 @Developix
🚀 Developix.ir

📌 پشتیبانی و تبلیغات:
@DevelopixSupport
Download Telegram
فصل یک - Routing

بخش دوم - معرفی متد های روتینگ - قسمت سوم


در این قسمت به سایر متد های روتینگ می پردازیم:

1- متد redirect برای ریدایرکت کردن یک URL به URL دیگر استفاده می‌شود.
Route::redirect('/from-url', '/to-url');
// OR
Route::redirect('/from-home', '/to', 301);


2- متد permanentRedirect برای ریدایرکت دائمی (کد وضعیت HTTP 301) به کار می‌رود.
Route::permanentRedirect('/from-url', '/to-url');


3- متد view برای بازگرداندن یک ویو به کار می‌رود و یک صفحه HTML را رندر می کند.
نام فایل view بدون پسوند داده می شود.
Route::view('/welcome', 'welcome');
// welcome -> resources/views/welcome.blade.php

همچنین می توانید پارامتر هایی را همراه آن ارسال کنید:
Route::view('/about', 'about', ['key' => 'value']);

در فصل های بعدی به طور مفصل درمورد view ها توضیح داده می شود.

4- متد name برای نام‌گذاری یک مسیر استفاده می‌شود که به شما امکان می‌دهد تا به سادگی به آن مسیر ارجاع دهید.
Route::get('/user/profile', $action)->name('profile');

route('profile'); // domain.example/user/profile


5- متد group برای گروه‌بندی روت‌ها و استفاده از تنظیمات مشترک بین آن‌ها به کار می‌رود.
Route::group(['prefix' => 'admin'], function () {
Route::get('/dashboard', $action);
});


6- متد domain برای تعریف روت‌های وابسته به یک دامنه خاص استفاده می‌شود.
Route::domain('api.example.com')->group(function () {
Route::get('/users', function () {
// api.example.com/users
});
// ...
});


7- متد prefix برای اضافه کردن پیشوند به یک گروه از روت‌ها به کار می‌رود.
Route::prefix('admin')->group(function () {
Route::get('/users', function () {
// domain.example/admin/users
});
// ...
});


8- متد fallback برای تعریف مسیری استفاده می‌شود که در صورتی که هیچ یک از روت‌ها مطابقت نداشته باشند، فراخوانی می‌شود.
Route::fallback(function () {
return 404;
});


9- متد current برای بازگرداندن اطلاعات مربوط به مسیر فعلی به کار می‌رود.
$currentRoute = Route::current();


10- متد currentRouteName برای بازگرداندن نام مسیر فعلی به کار می‌رود.
$routeAction = Route::currentRouteAction();


11- متد currentRouteAction برای بازگرداندن اکشن کنترلر مربوط به مسیر فعلی به کار می‌رود.
$currentRouteAction = Route::currentRouteAction();


بقیه متد های روتینگ در فصل های آینده پس از آموزش پیش نیاز ها توضیح داده می شود.

🔖 #Laravel, #PHP, #لاراول, #فصل_۱

👤 AmirHossein

💎 Channel: @DevelopixLaravel
8👍4🔥4
فصل یک - Routing

بخش سوم - میدلورها - قسمت اول


میدلور‌ها در لاراول مکانیزمی مناسب برای بررسی و فیلتر کردن درخواست‌های HTTP ورودی به برنامه شما فراهم می‌کنند.

به عنوان مثال، لاراول یک میدلور دارد که بررسی می‌کند آیا کاربر وارد سیستم شده است یا خیر. اگر کاربر وارد نشده باشد، او را به صفحه ورود هدایت می‌کند. اما اگر وارد شده باشد، درخواست را به مسیر بعدی هدایت می‌کند.

لاراول شامل میدلورهای متنوعی از جمله تأیید هویت و حفاظت CSRF است.

همچنین کاربر می تواند میدلور های خود را بنویسد، تمامی میدلورهای تعریف شده توسط کاربر معمولاً در مسیر app/Http/Middleware قرار می‌گیرند.

ساخت میدلور اختصاصی:

برای ساخت میدلور اختصاصی، از دستور زیر در ترمینال استفاده کنید:
php artisan make:middleware {MiddlewareName}


این دستور یک میدلور با نام داده شده در مسیر app/Http/Middleware ایجاد می‌کند.

تمامی عملیات بررسی در متد handle انجام می‌شود. می‌توانید شروطی را بر روی درخواست‌ها اعمال کنید. در صورتی که شروط برقرار باشند، متد handle میدلور بعدی را فراخوانی می‌کند و درخواست را ادامه می‌دهد. در غیر این صورت، درخواست متوقف و نتیجه تغییر خواهد کرد. مثال:
namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class CheckAge
{
public function handle(Request $request, Closure $next)
{
if ($request->age <= 18) {
return redirect('home');
}

return $next($request);
}
}

اگر سن کاربر کمتر یا مساوی ۱۸ باشد، به صفحه خانه هدایت می‌شود. در غیر این صورت، درخواست ادامه پیدا می‌کند.

ثبت میدلور:

برای استفاده از یک میدلور اختصاصی، ابتدا باید آن را در برنامه خود ثبت کنید. برای این کار وارد فایل bootstrap/app.php شوید و دنبال بخش زیر بگردید:
->withMiddleware(function (Middleware $middleware) {
//
})


برای ثبت میدلور جدید، می‌توانید متد append را از $middleware صدا بزنید و نام میدلور را به صورت کامل به آن پاس بدهید:
->withMiddleware(function (Middleware $middleware) {
$middleware->append(CheckAge::class);
})


همچنین می‌توانید یک نام مستعار برای میدلور خود ثبت کنید تا ساده‌تر به آن دسترسی داشته باشید:
->withMiddleware(function (Middleware $middleware) {
$middleware->alias([
'age' => CheckAge::class
]);
})


با سایر متد قابل دسترس از $middleware در قسمت بعدی آشنا می شویم.

استفاده از میدلور در مسیرها:

برای اعمال یک میدلور بر روی route ها با متد جدیدی از فساد Route آشنا می شویم:
Route::get('profile', function () {
// Only executed if age > 18
})->middleware(CheckAge::class);

// Or use alias:
Route::get('profile', function () {
// Only executed if age > 18
})->middleware('age');


متد middleware یک یا چند میدلور را بر روی یک مسیر اعمال می‌کند و در صورتی که شروط میدلور برقرار باشد، مسیر اجرا خواهد شد. در مثال ما، تنها در صورتی که سن بیشتر از ۱۸ باشد، مسیر اجرا خواهد شد.

غیرفعال کردن میدلور برای مسیرها:

متد دیگری از فساد Route با نام withoutMiddleware نیز در دسترس است که میدلور های داده شده را بر روی مسیر مورد نظر اجرا نخواهد کرد:
Route::withoutMiddleware([CheckAge::class])->group(function () {
Route::get('/profile', function () {
// ...
});
});


ارسال پارامتر به میدلور
:

می‌توانید پارامترهایی را به میدلور خود اختصاص دهید:
Route::get('profile', function () {
// Only executed if age > 20
})->middleware('age:20');


پارامترهای ورودی را می‌توانید در متد handle دریافت کنید:
namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class CheckAge
{
public function handle(Request $request, Closure $next, $minAge)
{
if ($request->age <= $minAge) {
return redirect('home');
}

return $next($request);
}
}


در مثال بالا، یک میدلور داینامیک ایجاد کرده‌ایم که می‌توانیم هر سنی را به واسطه آن بررسی کنیم.

همچنین می توانید پارامتر های بیشتری را ارسال و دریافت کنید:
Route::get('profile', function () {

})->middleware('age:20,gt');


و همینطور در متد handle:
class CheckAge
{
public function handle(Request $request, Closure $next, $minAge, $type)
{
//
}
}


🔖 #Laravel, #PHP, #لاراول, #فصل_۱

👤 AmirHossein

💎 Channel: @DevelopixLaravel
👍7🔥32
⚜️ دوره لاراول - قسمت اول
📚 معرفی دوره و سرفصل ها

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

🎞 لینک ویدیو :
https://youtu.be/NyIKBahBkmA

🔖 #Laravel, #PHP, #لاراول

👤 Matin Soleymani

💎 Channel: @DevelopixLaravel
🔥83
فصل یک - Routing

بخش سوم - میدلورها - قسمت دوم


در قسمت قبل آموختیم پس از ساخت یک میدلور، باید آن را در برنامه ثبت کنیم.

برای این کار میدلور ها را در متد withMiddleware در فایل bootstrap/app.php ثبت می کردیم:
->withMiddleware(function (Middleware $middleware) {
// $middleware->
})

متد های مختلفی از متغیر $middleware برای ثبت میدلور ها در دسترس است که به بررسی آنها خواهیم پرداخت:

1- متد use
این متد استک سراسری میدلور ها را به صورت دستی تنظیم میکند.
->withMiddleware(function (Middleware $middleware) {
$middleware->use([
TrustHosts::class,
// ...
]);
})


2- متد append
این متد یک میدلور را به آخر لیست میدلور ها اضافه میکند.
->withMiddleware(function (Middleware $middleware) {
$middleware->append(TrustHosts::class);
})


3- متد prepend
این متد یک میدلور را به اول لیست میدلور ها اضافه میکند.
->withMiddleware(function (Middleware $middleware) {
$middleware->prepend(TrustHosts::class);
})


4- متد remove
این متد یک میدلور را از لیست میدلور ها حذف میکند.
->withMiddleware(function (Middleware $middleware) {
$middleware->remove(TrustHosts::class);
})


5- متد replace
این متد یک میدلور را جایگزین میدلور موجود در استک میدلور ها می کند.
->withMiddleware(function (Middleware $middleware) {
$middleware->replace(First::class, Second:class);
})


6- متد group
این متد یک گروه از چندین میدلور را ایجاد میکند.
->withMiddleware(function (Middleware $middleware) {
$middleware->group('my-group', [
TrustHosts::class,
StartSession::class,
// ...
]);
})

// Use
Route::get('/', function () {
// ...
})->middleware('my-group');


7- متد alias
این متد یک میدلور را با نام مستعار ثبت میکند.
->withMiddleware(function (Middleware $middleware) {
$middleware->alias([
'permission' => Permission::class,
]);
})


8- متد api
این متد یک میدلور را به گروه پیشفرض api اضافه/حذف/جایگزین میکند.
->withMiddleware(function (Middleware $middleware) {
// append middleware
$middleware->api(append: [
StartSession::class,
]);;

// prepend middleware
$middleware->api(prepend: [
StartSession::class,
]);;

// remove middleware
$middleware->api(remove: [
StartSession::class,
]);;

// replace middleware
$middleware->api(replace: [
First::class => Second::class,
]);;
})


9- متد web
این متد یک میدلور را به گروه پیشفرض web اضافه/حذف/جایگزین میکند.
->withMiddleware(function (Middleware $middleware) {
// append middleware
$middleware->web(append: [
StartSession::class,
]);;

// prepend middleware
$middleware->web(prepend: [
StartSession::class,
]);;

// remove middleware
$middleware->web(remove: [
StartSession::class,
]);;

// replace middleware
$middleware->web(replace: [
First::class => Second::class,
]);;
})


10- متد appendToGroup
این متد یک یا چند میدلور را به آخر یک گروه اضافه میکند.
->withMiddleware(function (Middleware $middleware) {
$middleware->appendToGroup('group-name', [
StartSession::class,
]);
})


11- متد prependToGroup
این متد یک یا چند میدلور را به اول یک گروه اضافه میکند.
->withMiddleware(function (Middleware $middleware) {
$middleware->prependToGroup('group-name', [
StartSession::class,
]);
})



12- متد removeFromGroup
این متد یک یا چند میدلور را از یک گروه حذف میکند.
->withMiddleware(function (Middleware $middleware) {
$middleware->removeFromGroup('group-name', [
StartSession::class,
]);
})


13- متد replaceInGroup
این متد یک میدلور را با میدلور دیگر در یک گروه جایگزین میکند.
->withMiddleware(function (Middleware $middleware) {
$middleware->replaceInGroup('group-name', First::class, Second::class);
})


14- متد priority
این متد اجرای میدلور ها را الویت بندی میکند.
->withMiddleware(function (Middleware $middleware) {
$middleware->priority([
First::class,
Second::class,
Third::class,
]);
})


🔖 #Laravel, #PHP, #لاراول, #فصل_۱

👤 AmirHossein

💎 Channel: @DevelopixLaravel
👍83🔥3
فصل یک - Routing

بخش چهارم - معرفی کامند های روتینگ


‏Artisan ابزار خط فرمانی است که به شما کمک می‌کند تا کارهای مختلفی را در پروژه لاراول خود انجام دهید. این کامندها به توسعه‌دهندگان اجازه می‌دهند تا به سرعت وظایف مختلفی را مانند مدیریت مسیرها، پیکربندی‌ها، و کش‌ها انجام دهند.

در این قسمت با کامند های مربوط به بخش روتینگ آشنا می شویم:

1-
php artisan install:api


در نسخه جدید لاراول مسیر های مربوط به API به طور پیش فرض وجود ندارد، اگر پروژه شما نیاز به API دارد با این دستور مسیر های API را ایجاد و پیکربندی کنید.
با اجرای این دستور فایل api.php در پوشه route برای شما ایجاد می شود.
همچنین Laravel Sanctum که یک پکیج برای احراز هویت و محافظ API ها می باشد به طور خودکار برای شما نصب می شود.

2-
php artisan route:list


این دستور لیستی از تمام مسیرهای ثبت شده در پروژه را نمایش می‌دهد. اطلاعاتی مانند HTTP Method, URL، نام مسیر و کنترلری که درخواست‌ها را مدیریت می‌کند، را نمایش می‌دهد.

3-
php artisan route:list -v


تمامی اطلاعات پیش‌فرض به علاوه جزئیات بیشتری از Action، مانند نام کنترلر و متد، و میدلورهای مورد استفاده در مسیر را نمایش می‌دهد.
اطلاعات دقیق‌تر درباره namespace و گروه‌بندی‌های اعمال شده به مسیرها نیز ممکن است نمایش داده شود.

4-
php artisan route:list -vv


تمامی اطلاعات -v به علاوه اطلاعات بیشتری درباره پارامترهای مسیر، نام‌های کامل کلاس‌ها و متدها، و جزئیات دقیق‌تر دیگری که ممکن است در مسیر استفاده شده باشند را نمایش می‌دهد.
این سطح از جزئیات می‌تواند شامل اطلاعات دقیق‌تر درباره dependency injection و هر نوع تنظیمات خاص دیگر مربوط به مسیر باشد.

5-
php artisan route:list --path=api


این کامند لیست مسیرهایی را نمایش می‌دهد که شامل رشته api در URL خود هستند. این می‌تواند برای فیلتر کردن و نمایش مسیرهای مرتبط مفید باشد.

6-
php artisan route:list --except-vendor


این کامند لیست مسیرها را به استثنای مسیرهایی که از پکیج‌های vendor آمده‌اند، نمایش می‌دهد.

7-
php artisan route:list --only-vendor


این کامند تنها مسیرهایی را نمایش می‌دهد که از پکیج‌های vendor آمده‌اند.

8-
php artisan config:publish cors


این کامند برای انتشار تنظیمات پیکربندی CORS (Cross-Origin Resource Sharing) استفاده می‌شود. این پیکربندی‌ها می‌تواند شامل تنظیمات امنیتی برای مدیریت درخواست‌های API از دامنه‌های مختلف باشد.

9-
php artisan route:cache


این کامند برای کش کردن (ذخیره موقت) تمامی مسیرهای ثبت شده در پروژه استفاده می‌شود. این کار به بهبود عملکرد برنامه کمک می‌کند زیرا نیاز به تحلیل دوباره مسیرها در هر درخواست کاهش می‌یابد.

10-
php artisan route:clear


این کامند برای پاک کردن کش مسیرها استفاده می‌شود. بعد از اجرای این کامند، لاراول مسیرها را دوباره از نو تحلیل و ثبت می‌کند.

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

🔖 #Laravel, #PHP, #لاراول, #فصل_۱

👤 AmirHossein

💎 Channel: @DevelopixLaravel
5🔥2👍1
فصل دو - Controllers

بخش اول - ایجاد و استفاده از کنترلرها


کنترلرها (Controllers) یکی از اجزای اصلی معماری MVC (Model-View-Controller) هستند. کنترلرها وظیفه دارند درخواست‌های ورودی را مدیریت کرده و پاسخ‌های مناسب را به سمت کاربر ارسال کنند.

تعریف کنترلرها:

کنترلرها در لاراول فایل‌هایی هستند که در پوشه app/Http/Controllers قرار می‌گیرند و شامل کلاس‌هایی هستند که مسئولیت کنترل جریان درخواست‌ها و پاسخ‌ها را بر عهده دارند. به طور کلی، کنترلرها به منظور جداسازی منطق تجاری (Business Logic) از منطق نمایش (Presentation Logic) استفاده می‌شوند.

ایجاد کنترلر:
برای ایجاد یک کنترلر در لاراول، می‌توانید از کامند Artisan استفاده کنید. به عنوان مثال:
php artisan make:controller UserController


این دستور یک کنترلر جدید به نام UserController در پوشه app/Http/Controllers ایجاد می‌کند.

انواع کنترلرها:

لاراول چندین نوع کنترلر را پشتیبانی می‌کند:

1- کنترلرهای پایه (Plain Controllers): کنترلرهای ساده‌ای که شامل متدهای مختلف برای مدیریت درخواست‌ها هستند.

2- کنترلرهای منبع (Resource Controllers): کنترلرهایی که برای عملیات CRUD (ایجاد، خواندن، به‌روزرسانی، حذف) بهینه شده‌اند. می‌توانید با استفاده از دستور زیر یک کنترلر منبع ایجاد کنید:
php artisan make:controller UserController --resource


این کنترلر شامل 7 متد پیشفرض است:
namespace App\Http\Controllers;

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

class UserController extends Controller
{
public function index()
{
// show users list
}

public function create()
{
// show create form
}

public function store(Request $request)
{
// store user data
}

public function show($id)
{
// show user data
}

public function edit($id)
{
// show edit form
}

public function update(Request $request, $id)
{
// update user data
}

public function destroy($id)
{
// delete user
}
}


3- کنترلرهای قابل توزیع (Singleton Controllers): کنترلرهایی که تنها یک نمونه از آن‌ها در طول عمر درخواست ایجاد می‌شود.
php artisan make:controller SingletonController --invokable


نمونه کنترلر برای انجام یک عملیات:
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class SingletonController extends Controller
{
public function __invoke()
{
//
}
}


مسیر دهی کنترلرها در روتینگ

برای اتصال یک route به کنترلر روش های متنوعی وجود دارد که در ادامه بررسی خواهیم کرد:
1-
Route::get("/users", "app\Http\Controllers\UserController@index");


در مثال بالا پارامتر دوم به متد index از کنترلر UserController اشاره دارد.
ابتدا نام کامل کنترلر سپس @ و بعد نام متد.

2-
use app\Http\Controllers\UserController;
Route::get("/users", [UserController::class, 'index']);


روش بالا یک روش دیگر برای فراخوانی یک متد از کنترلر است، به این صورت که در یک آرایه، اندیس صفر برابر کلاس کنترلر و اندیس یک برابر نام متد.

برای فراخوانی کنترلر های resource میتوانید از متد دیگری از فساد Route استفاده کنید.
Route::resource('users', UserController::class);


این متد به صورت خودکار 7 متد کنترلر را مسیردهی می کند.

همچنین متد دیگری از فساد Route برای کنترلر ها در دسترس است:
Route::controller(UserController::class)->group(function(){
Route::get("/users", 'index');
});


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

🔖 #Laravel, #PHP, #لاراول, #فصل_۲

👤 AmirHossein

💎 Channel: @DevelopixLaravel
2👍2🔥2
⚜️ دوره لاراول - قسمت دوم
📚 معرفی لاراول ، نصب و راه اندازی

خلاصه :
توی این ویدیو درمورد خود لاراول و نصب و راه اندازی توضیح داده شده. لاراول رو از طریق دو روش composer و laravel installer نصب کردیم.
در ویدیو بعدی به استراکچر کلی و سیستم روتینگ میپردازیم.

🎞 لینک ویدیو :
https://youtu.be/mM57r5fQu-E

🔖 #Laravel, #PHP, #لاراول

👤 Matin Soleymani

💎 Channel: @DevelopixLaravel
👍92🔥2
فصل دو - Controllers

بخش دوم - کنترلر های API و Dependency Injection


کنترلر های API:


کنترلرهای API به‌طور خاص برای مدیریت درخواست‌های API استفاده می‌شوند. در اینجا توضیحاتی درباره کنترلرهای API در لاراول ارائه می‌شود:

برای ایجاد یک کنترلر API، می‌توانید از دستور زیر استفاده کنید:
php artisan make:controller Api/UserController --api



این دستور یک کنترلر جدید در مسیر app/Http/Controllers/Api ایجاد می‌کند که شامل متدهای پایه‌ای مانند index, store, show, update و destroy می‌شود.

برای دسترسی به متدهای کنترلر API، باید مسیرهای مناسب را تعریف کنید. در فایل routes/api.php، می‌توانید مسیرها را به صورت زیر تعریف کنید:

برای تعریف این مسیر ها از متد جدیدی از فساد Route استفاده می کنیم:
use App\Http\Controllers\Api\MyController;

Route::apiResource('users', MyController::class);



در صورتی که فایل api.php برای شما در پوشه routes وجود ندارد با دستور زیر آن را ایجاد کنید:
php artisan install:api



تفاوت یک کنترلر API با کنترلر Resource در این است که متد های create و edit در کنترلر API وجود ندارد، زیرا در API ها نیازی به رندر کردن View نیست.

دپندنسی اینجکشن در کنترلر ها:

دپندنسی اینجکشن (Dependency Injection) یکی از اصول مهم طراحی شیءگرا است که به شما کمک می‌کند وابستگی‌های کلاس‌ها را مدیریت کنید و کد قابل تست و قابل نگهداری بنویسید. در لاراول، دپندنسی اینجکشن به سادگی با استفاده از سیستم سرویس کانتینر (Service Container) این فریمورک امکان‌پذیر است.

نکته: درمورد سرویس کانتینر و پروایدر ها در فصل های آینده به طور مفصل توضیح داده می شود.

دپندنسی اینجکشن به این معنا است که یک کلاس به جای اینکه خودش مسئول ایجاد وابستگی‌هایش باشد، این وابستگی‌ها از بیرون به آن تزریق می‌شوند. به عبارت دیگر، وابستگی‌های یک کلاس به عنوان پارامترهای سازنده (constructor) یا متدهای دیگر به آن تحویل داده می‌شوند.

فرض کنید می‌خواهیم یک کنترلر ایجاد کنیم که برای انجام عملیات‌های مربوط به یک مخزن داده (Repository) نیاز به یک سرویس دارد.

ابتدا یک اینترفیس برای مخزن داده تعریف می‌کنیم:
// app/Repositories/UserRepositoryInterface.php
namespace App\Repositories;

interface UserRepositoryInterface {
public function all();
}



سپس یک پیاده‌سازی برای این اینترفیس ایجاد می‌کنیم:
// app/Repositories/UserRepository.php
namespace App\Repositories;

use App\Models\User;

class UserRepository implements UserRepositoryInterface {
public function all() {
return User::all();
}
}



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

می توانید با دستور زیر یک پروایدر ایجاد کنید:
php artisan make:provider RepositoryServiceProvider 



// app/Providers/RepositoryServiceProvider.php
namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Repositories\UserRepositoryInterface;
use App\Repositories\UserRepository;

class RepositoryServiceProvider extends ServiceProvider {
public function register() {
$this->app->bind(UserRepositoryInterface::class, UserRepository::class);
}
}



سپس این سرویس پروایدر را به لیست پروایدرهای اپلیکیشن اضافه می‌کنیم:

// bootstrap/providers.php
return [
App\Providers\AppServiceProvider::class,
App\Providers\RepositoryServiceProvider::class,
];



حالا می‌توانیم این مخزن را به کنترلر تزریق کنیم:
// app/Http/Controllers/UserController.php
namespace App\Http\Controllers;

use App\Repositories\UserRepositoryInterface;

class UserController extends Controller {
protected $userRepository;

public function __construct(UserRepositoryInterface $userRepository) {
$this->userRepository = $userRepository;
}

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



در این مثال، کلاس UserController وابستگی خود را به UserRepositoryInterface از طریق کانستراکتور دریافت می‌کند. لاراول به صورت خودکار پیاده‌سازی صحیح را از طریق سرویس کانتینر تزریق می‌کند.

🔖 #Laravel, #PHP, #لاراول, #فصل_۲

👤 AmirHossein

💎 Channel: @DevelopixLaravel
4👍3🔥1
فصل سه - Views

بخش اول - موتور قالب‌سازی Blade


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

فایل‌های Blade با پسوند .blade.php شناخته می‌شوند و معمولاً در دایرکتوری resources/views قرار می‌گیرند. به عنوان مثال:

resources/views/welcome.blade.php



بخش دوم - ساختار و سینتکس Blade


‏Blade از سینتکس ساده‌ای برای جایگذاری داده‌ها و استفاده از دستورالعمل‌های کنترلی استفاده می‌کند.

برای نمایش داده‌ها در قالب Blade از دستور {{ }} استفاده می‌شود. به عنوان مثال:
<h1>Hello, {{ $name }}</h1>


در این مثال، مقدار متغیر $name در مکان مورد نظر جایگذاری می‌شود.

‏Blade‌‏ از دستورات کنترلی مانند شرط‌ها و حلقه‌ها پشتیبانی می‌کند.

برای استفاده از شرط‌ها از دستور @if و @endif استفاده می‌شود:
@if ($age >= 18)
<p>Adult</p>
@else
<p>Child</p>
@endif


همچنین می توان به همین صورت از حلقه ها نیست استفاده کرد:
@foreach ($users as $user)
<p>{{ $user->name }}</p>
@endforeach

@for($i = 0; $i <= 10; $i++)
<p>{{ $i }}</p>
@endfor

@while (true)
<p>I'm looping forever.</p>
@endwhile


‏Blade امکان وراثت قالب‌ها را نیز فراهم می‌کند. این ویژگی به شما امکان می‌دهد تا یک ساختار پایه برای قالب‌های خود تعریف کنید و قالب‌های دیگر را از آن به ارث ببرید.

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

شما می‌توانید داده‌هایی را که در تمام قالب‌ها به صورت مشترک استفاده می‌شوند، از طریق Service Provider ها به اشتراک بگذارید.
// app/Providers/AppServiceProvider.php
public function boot()
{
View::share('key', 'value');
}

// view.blade.php
<p>{{ $key }}</p>


از شرط‌های پیچیده و حلقه‌ها نیز پشتیبانی می‌کند. به عنوان مثال، شما می‌توانید از حلقه‌های تو در تو استفاده کنید:
@foreach ($users as $user)
<h2>{{ $user->name }}</h2>
@foreach ($user->posts as $post)
<p>{{ $post->title }}</p>
@endforeach
@endforeach


نکته : در این قسمت صرفا با ساختار و کاربرد های Blade آشنا شدیم، و در قسمت های بعدی با تمام دستورات Blade، ارث بری قالب ها، ایجاد کامپوننت ها و همچنین ایجاد دستورات Blade سفارشی آشنا می شویم.

موتور قالب‌سازی Blade یک ابزار قدرتمند و انعطاف‌پذیر برای مدیریت قالب‌های وب‌سایت‌ها در فریم‌ورک لاراول است. با استفاده از سینتکس ساده و قابلیت‌های گسترده‌ای که ارائه می‌دهد، می‌توانید قالب‌های پویا و قابل توسعه‌ای ایجاد کنید.

🔖 #Laravel, #PHP, #لاراول, #فصل_۳

👤 AmirHossein

💎 Channel: @DevelopixLaravel
👍2🔥21
فصل سه - Views

بخش دوم - آشنایی با دستورات Blade - قسمت اول


همانطور که در قسمت های قبل گفته شد View ها یا فایل های نمایشی مثل فایل های HTML در پوشه resources/views قرار می گیرند و فرمت آنها .blade.php می باشد.
با اجرای دستور زیر می توانید یک فایل view ایجاد کنید:
php artisan make:view greeting


دستور بالا یک فایل با فرمت .blade.php را در مسیر resources/views با نام greeting ایجاد می کند. همچنین می توانید این عمل را به صورت دستی انجام دهید.

در لاراول به واسطه موتور قالب سازی Blade به جای نوشتن مستقیم کد های PHP از دستورات Blade استفاده می کنیم تا ساختار تمیزتر، ساده تر و خواناتری داشته باشیم.

در ادامه با دستورات Blade آشنا می شویم:

1- دستور {{ x }} و {!! x !!}

از {{ }} برای چاپ محتوای متغیرها و داده‌ها در فایل‌های قالب استفاده می‌شود. این نوع استفاده معمولا برای جلوگیری از حملات XSS (Cross-Site Scripting) است و محتوای داخل {{ }} به صورت امن نمایش داده می‌شود.
<h1>Hello, {{ $name }}!</h1>


موتور Blade به صورت پیش‌فرض داده‌های داخل {{ }} را escape می‌کند. این به این معنی است که هر محتوایی که شامل کاراکترهای ویژه HTML باشد به صورت امن نمایش داده می‌شود.
اگر می‌خواهید داده‌ای را بدون escape کردن نمایش دهید، می‌توانید از سه علامت {{{ }}} یا {!! !!} استفاده کنید. اما باید خیلی مراقب باشید که این نوع استفاده ممکن است منجر به حملات XSS شود اگر داده‌ها به درستی اعتبارسنجی نشده باشند.
<h1>Hello, {!! $name !!}!</h1>


همچنین می توانید خروجی توابع را نیز نمایش دهید:
<p>The current UNIX timestamp is {{ time() }}.</p>


2- دستورات if، elseif، else، unless

دستورات بالا همانند دستورات شرطی PHP عمل می کنند.
@if ($user->isAdmin())
<p>Welcome, admin!</p>
@elseif ($user->isModerator())
<p>Welcome, moderator!</p>
@else
<p>Welcome, user!</p>
@endif


دستور @unless برای اجرای یک بلوک کد در صورتی که یک شرط برقرار نباشد، استفاده می‌شود. این دستور معکوس دستور @if است.
@unless ($user->isGuest())
<p>Welcome back, {{ $user->name }}!</p>
@endunless


3- دستورات isset و empty
این دستورات برای بررسی خالی بود یا تعریف شدن یک مقدار استفاده می شوند همانند توابع همان آنها در PHP.
@isset($records)
// $records is defined and is not null...
@endisset

@empty($records)
// $records is "empty"...
@endempty


4- دستورات auth و guest
برای نمایش یا عدم نمایش محتوا بر اساس وضعیت احراز هویت (authentication) کاربر استفاده می‌شوند. این دستورات به شما امکان می‌دهند تا به سادگی محتوای خاصی را برای کاربران احراز هویت شده یا کاربران مهمان (غیر احراز هویت شده) نمایش دهید.
@auth
// The user is authenticated...
@endauth

@guest
// The user is not authenticated...
@endguest


همچنین این دو دستور پارامتری که نام گارد احراز هویت می باشد را نیز دریافت میکنند تا به وسیله آن گارد وضعیت احراز هویت را بررسی کنند.
در فصل های مربوطه با گارد ها آشنا می شویم.
@auth('admin')
...
@endauth

@guest('admin')
...
@endguest


5- دستورات switch case
این دستورات نیز همانند switch case در PHP هستند:
@switch($i)
@case(1)
First case...
@break

@case(2)
Second case...
@break

@default
Default case...
@endswitch


6- حلقه ها
حلقه ها در Blade نیز مانند حلقه ها در PHP نوشته می شوند:
@for ($i = 0; $i < 10; $i++)
The current value is {{ $i }}
@endfor

@foreach ($users as $user)
<p>This is user {{ $user->id }}</p>
@endforeach

@while (true)
<p>I'm looping forever.</p>
@endwhile


دستور جدیدی با نام forelse وجود دارد تا در صورت خالی بودن متغیر شرط دیگری اجرا شود.
@forelse ($users as $user)
<li>{{ $user->name }}</li>
@empty
<p>No users</p>
@endforelse


7- دستورات continue و break
این دستورات برای کنترل حلقه ها استفاده می شوند، همچنین می توانند یک شرط برای ورودی دریافت کنند و در صورت برقرار بودن شرط اجرا شوند:
@foreach ($users as $user)
@continue($user->type == 1)

<li>{{ $user->name }}</li>

@break($user->number == 5)
@endforeach


🔖 #Laravel, #PHP, #لاراول, #فصل_۳

👤 AmirHossein

💎 Channel: @DevelopixLaravel
7👍1
⚜️ دوره لاراول - قسمت سوم
📚 استراکچر کلی و نگاهی به سیستم روتینگ

خلاصه :
توی این ویدیو درمورد استراکچر لاراول و کمی درمورد سیستم روتینگ توضیح داده شده.
در ویدیو بعدی به ادامه سیستم روتینگ میپردازیم.

🎞 لینک ویدیو :

https://youtu.be/mW_Oofrbdrc

🔖 #Laravel, #PHP, #لاراول

👤 Matin Soleymani

💎 Channel: @DevelopixLaravel
6👍2🔥2
⚜️ دوره لاراول - قسمت چهارم
📚 ادامه سیستم روتینگ

خلاصه :
توی این ویدیو درمورد سیستم روتینگ توضیح داده شده.
در ویدیو بعدی به ادامه سیستم روتینگ میپردازیم.

🎞 لینک ویدیو :
https://youtu.be/Sx4p2ktjCvk

🔖 #Laravel, #PHP, #لاراول

👤 Matin Soleymani

💎 Channel: @DevelopixLaravel
👍52🔥1
فصل سه - Views

بخش دوم - آشنایی با دستورات Blade - قسمت دوم


1- دستور include:
این دستور برای درج یک ویو (view) دیگر در ویوی فعلی استفاده می‌شود، و محتویات یک فایل را درون فایل دیگر قرار می دهد.
<body>
@include('partials.header')
</body>


اگر فایل partials/header.blade.php وجود داشته باشد، محتویات آن در محل استفاده از @include درج خواهد شد.

2- دستور includeIf:
این دستور همانند @include عمل می‌کند، با این تفاوت که اگر ویو مورد نظر وجود نداشته باشد، خطایی رخ نمی‌دهد و دستور به سادگی نادیده گرفته می‌شود.
<body>
@includeIf('partials.header')
</body>


3- دستور includeWhen:
این دستور برای درج یک ویو در شرایط خاص استفاده می‌شود. این دستور دو پارامتر می‌گیرد: یک شرط و نام ویو.
// $showHeader = true;
<body>
@includeWhen($showHeader, 'partials.header')
</body>


4- دستور includeUnless:
این دستور برعکس @includeWhen عمل می‌کند، یعنی ویو را زمانی درج می‌کند که شرط برقرار نباشد.
// $hideHeader = false;
<body>
@includeUnless($hideHeader, 'partials.header')
</body>


5- دستور includeFirst:
این دستور برای درج اولین ویو موجود در لیست ویوهای داده شده استفاده می‌شود. این دستور یک آرایه از نام ویوها را به عنوان پارامتر دریافت می‌کند.
<body>
@includeFirst(['custom.header', 'partials.header'])
</body>


در این مثال، اگر ویوی custom.header وجود داشته باشد، درج می‌شود و اگر وجود نداشته باشد، ویوی partials.header درج می‌شود.

6- دستور section:
این دستور برای تعریف یک بخش (section) از قالب استفاده می‌شود که می‌تواند در قالب اصلی (layout) یا قالب‌های فرزند مورد استفاده قرار گیرد.
@section('content')
<p>This is the content section.</p>
@endsection


این دستور به تنهایی کاربرد ندارد و نیازمند دستور yield نیز می باشد(مورد بعدی).


7- دستور yield
این دستور برای نمایش محتوای یک بخش در قالب اصلی (layout) استفاده می‌شود.
<body>
@yield('content')
</body>


این دستور سکشن content که بالاتر تعریف کرده ایم را نمایش می دهد.

8- دستور sectionMissing:
این دستور بررسی می‌کند که آیا یک section در ویو فعلی تعریف نشده است. اگر آن بخش تعریف نشده باشد، کد داخل sectionMissing اجرا می‌شود. و درصورتی که تعریف شده باشد محتوای sectionMissing نادیده گرفته می شود و محتوای section نمایش داده می شود.
@sectionMissing('sidebar')
<div class="sidebar">
<p>This is the default sidebar content.</p>
</div>
@endsectionMissing


9- دستور hasSection:
این دستور بررسی می‌کند که آیا یک section مشخص در ویو فعلی تعریف شده است یا نه. این دستور به شما امکان می‌دهد که بر اساس وجود یا عدم وجود یک بخش، رفتار خاصی را در قالب خود اعمال کنید.
@hasSection('navigation')
<div class="pull-right">
@yield('navigation')
</div>
@endif


10- دستور extends:
این دستور برای تعریف اینکه یک ویو از کدام قالب (layout) ارث‌بری می‌کند استفاده می‌شود.
// resources/views/welcome.blade.php
@extends('layouts.app') //layouts/app.blade.php

@section('header')
<h1>Header Section in Child View</h1>
@endsection


این دستور برای ارث‌بری از قالب اصلی استفاده شده است. سپس با استفاده از دستورات section، محتوای هر بخش در قالب اصلی که از آن ارث بری شده جایگذاری شده است.
در واقع یک فایل مادر وجود دارد که در فایل های فرزند extends می شود و گسترش می یابد.
نمایی از فایل layouts/app.blade.php یا همان فایل مادر:
// resources/views/layouts/app.blade.php
<body>
<header>
@yield('header')
</header>
</body>


همانطور که مشخص است، yield سکشن header در فایل مادر انجام شده در صورتی که سکشن header در فایل فرزند تعریف شده و با استفاده از extends فایل مادر در فایل فرزند، هردو فایل به هم مرتبط شده اند.

11- دستور show:
این دستور برای پایان دادن به یک بخش و همزمان نمایش محتوای آن استفاده می‌شود. این دستور معمولاً زمانی استفاده می‌شود که بخشی از قالب بخواهد محتوای بخش خود را قبل از پایان قالب فعلی نمایش دهد.
@section('sidebar')
<p>This is the sidebar.</p>
@show


🔖 #Laravel, #PHP, #لاراول, #فصل_۳

👤 AmirHossein

💎 Channel: @DevelopixLaravel
6👍2🔥2
فصل سه - Views

بخش دوم - آشنایی با دستورات Blade - قسمت سوم


1- دستور csrf:
این دستور برای تولید یک توکن CSRF استفاده می‌شود که به محافظت از فرم‌های شما در برابر حملات CSRF کمک می‌کند.
<form method="" action="">
@csrf
...
</form>


2- دستور method:
این دستور برای تعریف متد HTTP فرم‌ها در صورت استفاده از روش‌های غیر از GET و POST مانند PUT یا DELETE استفاده می‌شود.
<form method="POST" action="">
@csrf
@method('PUT')
...
</form>



3- دستور error:
این دستور برای نمایش پیام‌های خطا استفاده می‌شود. معمولاً در فرم‌ها برای نمایش خطاهای اعتبارسنجی به کار می‌رود.
<form method="POST" action="">
@csrf
@error('name')
<div class="alert alert-danger">{{ $message }}</div>
@enderror
</form>


4- دستور use:
این دستور برای use کردن کلاس ها، کانستنت ها و... استفاده می شود.
@use('App\Models\Flight')


5- دستور php:
این دستور برای اجرای کد PHP درون قالب Blade استفاده می‌شود.
@php
$name = 'John Doe';
@endphp
<p>Hello, {{ $name }}</p>


6- دستور env:
این دستور برای بررسی محیط فعلی برنامه استفاده می‌شود.
@env('local')
<p>You're in the local environment.</p>
@endenv


7- دستور production:
این دستور به شما امکان می‌دهد تا کدهایی را فقط در محیط تولید اجرا کنید.
@production
<p>This code runs only in the production environment.</p>
@endproduction


8- دستور verbatim:
این دستور برای جلوگیری از پردازش دستورات Blade در داخل بلوک‌های HTML استفاده می‌شود.
@verbatim
<div class="example">
This is a Blade directive: {{ $name }}
</div>
@endverbatim


کد های درون این دستور توسط Blade تفسیر نخواهند شد و به همان شکل نمایش داده می شوند.
همچنین با قرار دادن یک @ اضافه قبل از دستورات Blade از تفسیر آن ها جلوگیری می شود:
@@if()

// HTML Output:
@if()


9- دستور fragment:
این دستور به شما امکان می‌دهد که یک بخش از کد را در یک نام خاص بسته‌بندی کنید و در جای دیگر فقط آن قطعه را رندر کنید.
// Blade File:
@fragment('user-list')
<ul>
<li>Item 1</li>
</ul>
@endfragment

// Controller File:
return view('dashboard')->fragment('user-list');


10- دستورات disk، elsedisk، unlessdisk:
این دستور برای اجرای یک بلوک کد تنها در صورتی که دیسک مشخص شده موجود باشد استفاده می‌شود.
@disk('s3')
<p>The S3 disk is available.</p>
@elsedisk
<p>The S3 disk is not available.</p>
@enddisk

@unlessdisk('local')
<p>The local disk is not available.</p>
@endunlessdisk


🔖 #Laravel, #PHP, #لاراول, #فصل_۳

👤 AmirHossein

💎 Channel: @DevelopixLaravel
4🔥2
فصل سه - Views

بخش دوم - آشنایی با دستورات Blade - قسمت چهارم


1- دستور once:
این دستور برای تنها یک بار اجرای محتوای داخل آن استفاده می‌شود. حتی اگر در یک حلقه باشد، محتوای آن تنها یک بار اجرا می‌شود.
@once
<p>This will be displayed only once.</p>
@endonce


2- دستور stack:
برای نمایش محتوای انباشته شده در یک بخش خاص با استفاده از دستور @push.
<head>
@stack('scripts')
</head>


3- دستور push:
برای افزودن محتوایی به یک بخش خاص استفاده می‌شود. این محتوا در بخش تعریف شده با دستور @stack نمایش داده می‌شود.
// Childe File:
@push('scripts')
<script src="/example.js"></script>
@endpush

// Parent File:
<head>
@stack('scripts')
</head>


4- دستور pushOnce:
مشابه @push است اما تضمین می‌کند که محتوای اضافه شده تنها یک بار نمایش داده شود، حتی اگر چندین بار @pushOnce استفاده شده باشد.
@pushOnce('scripts')
<script src="/example.js"></script>
@endpushOnce


5- دستور pushIf:
ترکیبی از @push و شرایط است که اگر شرط برقرار باشد، محتوای آن به بخش مربوطه اضافه می‌شود.
@pushIf($condition, 'scripts')
<script src="/example.js"></script>
@endpushIf


6- دستور prepend:
برای اضافه کردن محتوای جدید به ابتدای یک بخش خاص.
// Childe File:
@prepend('scripts')
<script src="/first.js"></script>
@endprepend

// Parent File:
<head>
@stack('scripts')
</head>


7- دستور inject:
برای تزریق یک سرویس یا متغیر به یک نمای Blade.
@inject('metrics', 'App\Services\MetricsService')
<div>
Monthly Revenue: {{ $metrics->monthlyRevenue() }}
</div>


8- دستور each:
برای رندر کردن یک نما برای هر آیتم در یک مجموعه.
@each('view.name', $items, 'item', 'view.empty')

‏view.name : نمایی که باید برای هر آیتم رندر شود.
‏$items : مجموعه‌ای از آیتم‌ها.
‏item : نام متغیری که هر آیتم به آن ارجاع داده می‌شود.
view.empty : نمایی که باید نمایش داده شود اگر مجموعه خالی باشد.

9- دستور required:
برای تنظیم ویژگی required یک عنصر HTML به صورت شرطی.
<input type="text" name="name" @required(true)>


10- دستور readonly:
برای تنظیم ویژگی readonly یک عنصر HTML به صورت شرطی.
<input type="text" name="name" @readonly(true)>



11- دستور disabled:
برای تنظیم ویژگی disabled یک عنصر HTML به صورت شرطی.
<button type="submit" @disabled(true)>Submit</button>



12- دستور selected:
برای تنظیم ویژگی selected یک گزینه در یک منوی انتخابی به صورت شرطی.
<select name="options">
<option value="1" @selected($value == 1)>Option 1</option>
<option value="2" @selected($value == 2)>Option 2</option>
</select>



13- دستور checked:
برای تنظیم ویژگی checked یک چک‌باکس یا رادیو باتن به صورت شرطی.
<input type="checkbox" name="agree" @checked(true)>



14- دستور style:
برای اضافه کردن ویژگی style به یک عنصر HTML به صورت شرطی یا بدون شرط.
// conditional
<div @style(['display: none' => $isHidden])>
Content
</div>

// unconditionally
<div @style(['display: none'])>
Content
</div>



15- دستور class:
برای اضافه کردن کلاس CSS به یک عنصر HTML به صورت شرطی یا بدون شرط.
// conditional
<div @class(['hidden' => $isHidden])>
Content
</div>

// unconditionally
<div @class(['hidden'])>
Content
</div>


🔖 #Laravel, #PHP, #لاراول, #فصل_۳

👤 AmirHossein

💎 Channel: @DevelopixLaravel
2🔥2👍1
⚜️ دوره لاراول - قسمت پنجم
📚 ادامه سیستم روتینگ | api روت ها

خلاصه :
توی این ویدیو درمورد گروه ها در روتینگ حرف زدیم
و نحوه نصب api در ورژن یازده لاراول رو پیش رفتیم و چند نمونه روت api توسعه دادیم.
در ویدیو بعدی به مبحث کنترلرها میپردازیم.

🎞 لینک ویدیو :
https://youtu.be/qhx-E9BsX4k

🔖 #Laravel, #PHP, #لاراول

👤 Matin Soleymani

💎 Channel: @DevelopixLaravel
4👍4🔥2
فصل سه - Views

بخش سوم - کامپوننت ها - قسمت اول


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

کامپوننت‌ها قطعات قابل استفاده مجدد از کد هستند که شامل HTML و منطق لازم برای ایجاد بخشی از رابط کاربری می‌شوند. این کامپوننت‌ها می‌توانند داده‌ها را از والدین خود دریافت کنند و می‌توانند به راحتی در بخش‌های مختلف پروژه استفاده شوند.

کامپوننت‌ها در لاراول معمولاً از دو بخش تشکیل می‌شوند:

1- بخش HTML:
که ساختار رابط کاربری را تعریف می‌کند.

2- بخش منطقی (Logic):
که می‌تواند شامل متدها و داده‌هایی باشد که برای تولید HTML مورد نیاز است. این بخش به طور معمول در کلاس‌های PHP تعریف می‌شود.

کامپوننت‌ها می‌توانند به سادگی در فایل‌های Blade فراخوانی شوند. برای مثال، اگر یک کامپوننت به نام alert دارید، می‌توانید آن را به این صورت فراخوانی کنید:
<x-alert type="danger" :message="This is a danger alert" />


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

لاراول دو نوع کامپوننت ارائه می‌دهد:
کامپوننت‌های کلاس محور (Class-based Components) و کامپوننت‌های بدون کلاس (Anonymous Components).

کامپوننت‌های کلاس محور شامل یک فایل PHP کلاس برای مدیریت منطق هستند، در حالی که کامپوننت‌های بدون کلاس تنها به یک فایل Blade برای نمایش متکی هستند و منطق پیچیده‌ای ندارند.

برای ساخت کامپوننت های کلاس محور میتوان از دستور زیر استفاده کرد:
php artisan make:component Alert


این دستور یک کامپوننت با نام Alert ایجاد می کند که شامل یک کلاس در app/View/Components و یک فایل View در resources/views/components می باشد.

برای ساخت کامپوننت های بدون کلاس یا ناشناس می توانید از دستور زیر استفاده کنید:
php artisan make:component input --view


این دستور تنها یک فایل View در resources/views/components ایجاد می کند.

همچنین می توانید کامپوننت ها را در فولدر های تو در تو ایجاد کنید:
# Class-based Components
php artisan make:component Forms/Input
# app/View/Components/Forms/Input.php
# resources/views/components/forms/input.blade.php

# Anonymous Components
php artisan make:component forms.input --view
# resources/views/components/forms/input.blade.php


همچنین برای فراخوانی کامپوننت از فولدر های خاص:
// from resources/views/components/forms
<x-forms.input />


حال که کامپوننت خود را ایجاد کرده اید، کافی است کد های HTML خود را درون فایل View کامپوننت بنویسید و با فراخوانی کاپوننت آنها را نمایش دهید:
// resources/views/components/alert.blade.php
<div class="alert alert-success">
This is an alert componnet!
</div>


و برای فراخوانی آن:
// Another View file in another world
<x-alert />


🔖 #Laravel, #PHP, #لاراول, #فصل_۳

👤 AmirHossein

💎 Channel: @DevelopixLaravel
4🔥1
⚜️ دوره لاراول - قسمت ششم
📚 کنترلرها - بیس کنترلرها

خلاصه :
توی این ویدیو درمورد بیس کنترلرها یا همون کنترلرهای پایه ( ساده ) حرف زدیم.
در ویدیو بعدی به مبحث ادامه کنترلرها میپردازیم.

🎞 لینک ویدیو :
https://youtu.be/hA1VSCIAJkw

🔖 #Laravel, #PHP, #لاراول

👤 Matin Soleymani

💎 Channel: @DevelopixLaravel
2🔥1
فصل سه - Views

بخش سوم - کامپوننت ها - قسمت دوم


ارسال داده‌ها و متغیرها به کامپوننت‌ها برای پویا سازی آنها بسیار مهم است.

برای این کار کافی است درون فایل View کامپوننت خود متغییر ها را چاپ کنیم:
// resources/views/components/alert.blade.php
<div class="alert alert-{{ $type }}">
{{ $message }}
</div>


برای مقدار دهی متغیر های type و message در هنگام فراخوانی کامپوننت می توانید به صورت اتریبیوت های HTML پاس بدهیم:
<x-alert type="success" message="successful!" />


در اینجا، مقادیر type و message به متغیرهای تعریف‌شده در کامپوننت ارسال می‌شوند و در نهایت، HTML تولید شده و در صفحه نمایش داده می‌شود.

در مثال بالا داده های استاتیک قابل ارسال است، برای ارسال متغیر باید به روش زیر عمل کنید:
<x-alert :type="$alertType" :message="$alertMessage" />

علامت : قبل از نام متغیرها به این معناست که داده‌ها به عنوان متغیرهای PHP ارسال می‌شوند نه به عنوان رشته ثابت.
متغیرهای $alertType و $alertMessage می‌توانند از کنترلر یا جای دیگری در ویو شما باشند.

اگر از کامپوننت های کلاس محور استفاده می کنید می توانید این متغییر ها را درون کلاس نیز داشته باشید، کافی است متغیر ها را به صورت پراپرتی بنویسید و در کانستراکتور مقداردهی کنید:
namespace App\View\Components;

use Illuminate\View\Component;

class Alert extends Component
{
public $type;
public $message;

public function __construct($type, $message)
{
$this->type = $type;
$this->message = $message;
}

public function render()
{
return view('components.alert');
}
}


در مثال بالا متغیر ها از طریق پراپرتی های تعریف شده در دسترس قرار دارند.

در حالت عادی تگ های کاپوننت ها نیاز به باز و بسته شدن ندارند، اما نیز می توانید آنها را باز و بسته کنید و میان آنها تگ ها یا داده های دیگری را بنویسید.

اسلات پیش‌فرض در واقع محتوا یا بخشی از HTML است که به طور مستقیم بین تگ‌های کامپوننت در ویو تعریف می‌شود و سپس در کامپوننت نمایش داده می‌شود.

محتوای بین تگ های کامپوننت از طریق متغیر $slot در فایل ویو در دسترس هستند.
<div class="alert alert-{{ $type }}">
{{ $slot }}
</div>


در اینجا {{ $slot }} به عنوان اسلات پیش‌فرض عمل می‌کند. یعنی محتوایی که به این کامپوننت ارسال می‌شود، در جایگاه {{ $slot }} قرار می‌گیرد.

حالا می‌توانید این کامپوننت را در یک ویو دیگر به این شکل استفاده کنید:
<x-alert type="warning">
This is a warning alert!
</x-alert>


در این مثال، متن "This is a warning alert!" به عنوان اسلات پیش‌فرض در مکان {{ $slot }} قرار می‌گیرد و خروجی HTML به صورت زیر خواهد بود:
<div class="alert alert-warning">
This is a warning alert!
</div>


اسلات‌های نام‌گذاری شده به شما امکان می‌دهند که بخش‌های مختلف یک کامپوننت را از طریق اسلات‌های مختلف پر کنید. این ویژگی زمانی مفید است که کامپوننت شما نیاز به دریافت چندین بخش محتوا داشته باشد.
<div class="card">
<div class="card-header">
{{ $header }}
</div>
<div class="card-body">
{{ $slot }}
</div>
</div>


در اینجا، {{ $header }} یک اسلات نام‌گذاری شده است و {{ $slot }} به عنوان اسلات پیش‌فرض برای محتوای اصلی استفاده می‌شود.

برای استفاده از این کامپوننت، شما می‌توانید به این صورت عمل کنید:
<x-card>
<x-slot:header>
Card Title
</x-slot>
This is the card content.
</x-card>


در این مثال:
مقدار "Card Title" به عنوان محتوای اسلات نام‌گذاری شده header به کامپوننت ارسال می‌شود.

و مقدار "This is the card content." به عنوان محتوای پیش‌فرض درون اسلات پیش‌فرض ({{ $slot }}) قرار می‌گیرد.

نامگذاری متغیر های ورودی:

نام متغیر های درون کامپوننت باید به صورت cameCase نوشته شوند:
<div class="alert alert-{{ $alertType }}">
{{ $slot }}
</div>


و نام اتریبیوت ورودی باید به صورت kebab-case نوشته شود:
<x-alert :alert-type="$alertType">
Alert
</x-alert>


درصورتی که نام متغیر درون کامپوننت با نام متغیری که باید به کامپوننت پاس داده شود برابر باشد می توانید آن را به صورت کوتاه شده بنویسید:
<x-alert :$alertType>
Alert
</x-alert>


گاهی ممکن است ورودی های ما با دستورات Blade به تداخل بخورد، برای escape کردن آن تنها کافی است از دو عبارت :: استفاده کنید تا توسط Blade رندر نشوند:
<x-button ::class="{ danger: isDeleting }">
Submit
</x-button>


🔖 #Laravel, #PHP, #لاراول, #فصل_۳

👤 AmirHossein

💎 Channel: @DevelopixLaravel
👍31🔥1
فصل سه - Views

بخش سوم - کامپوننت ها - قسمت سوم


ویژگی $attributes به طور خودکار تمامی ویژگی‌های اضافی‌ای که به یک کامپوننت Blade پاس داده می‌شوند را مدیریت می‌کند.
این ویژگی شامل متدهای متعددی برای کار با اتریبیوت ها می‌شود.

1- متد merge:
این متد به شما اجازه می‌دهد که ویژگی‌های جدیدی را به مجموعه ویژگی‌های موجود اضافه کنید و در صورت وجود ویژگی‌های تکراری، آن‌ها را ادغام کنید. معمولاً برای کلاس‌های CSS استفاده می‌شود.
<div {{ $attributes->merge(['class' => 'alert alert-' . $type]) }}>
{{ $slot }}
</div>


اگر کلاس‌های CSS به این کامپوننت پاس داده شوند، merge آن‌ها را با کلاس‌های پیش‌فرض ترکیب می‌کند. برای مثال:
<x-alert type="success" class="my-custom-class">
Success!
</x-alert>


کلاس نهایی ترکیب شده به صورت alert alert-success my-custom-class خواهد بود.

2- متد class:
این متد به طور خاص برای کار با کلاس‌های CSS استفاده می‌شود. شما می‌توانید کلاس‌های جدیدی اضافه کنید یا کلاس‌های موجود را با شرط‌هایی مدیریت کنید.
<div {{ $attributes->class(['alert', 'alert-' . $type, 'font-bold' => $isBold]) }}>
{{ $slot }}
</div>


اگر $isBold مقدار true داشته باشد، کلاس font-bold اضافه می‌شود.

3- متد prepend:
این متد برای افزودن ویژگی‌های جدید به ابتدا (اولویت) مجموعه ویژگی‌های موجود استفاده می‌شود. اگر ویژگی مورد نظر قبلاً موجود باشد، مقدار جدید در ابتدا اضافه می‌شود.
<div {{ $attributes->prepend('class', 'font-bold') }}>
{{ $slot }}
</div>


اگر کامپوننت قبلاً دارای کلاس font-bold نباشد، به ابتدای لیست کلاس‌ها اضافه می‌شود.

4- متد filter:
این متد به شما اجازه می‌دهد که ویژگی‌ها را بر اساس یک شرط فیلتر کنید.
<div {{ $attributes->filter(fn ($value, $key) => $key === 'class' || $key === 'id') }}>
{{ $slot }}
</div>


در این مثال، فقط ویژگی‌های class و id نگه داشته می‌شوند و سایر ویژگی‌ها فیلتر می‌شوند.

5- متد whereStartsWith:
این متد ویژگی‌هایی را که کلید آن‌ها با رشته خاصی شروع می‌شود، فیلتر می‌کند.
<div {{ $attributes->whereStartsWith('data-') }}>
{{ $slot }}
</div>


این کد تمام ویژگی‌هایی که با data- شروع می‌شوند را به div اضافه می‌کند.

6- متد whereDoesntStartWith:
این متد ویژگی‌هایی که کلید آن‌ها با رشته خاصی شروع نمی‌شود را فیلتر می‌کند.
<div {{ $attributes->whereDoesntStartWith('wire:') }}>
{{ $slot }}
</div>


این کد تمام ویژگی‌هایی که با wire: شروع نمی‌شوند را نگه می‌دارد.

7- متد has:
این متد بررسی می‌کند که آیا یک ویژگی خاص در مجموعه ویژگی‌ها وجود دارد یا خیر.
@if ($attributes->has('class'))
<div {{ $attributes }}>
{{ $slot }}
</div>
@else
<div class="default-class">
{{ $slot }}
</div>
@endif


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

8- متد hasAny:
این متد بررسی می‌کند که آیا هر یک از ویژگی‌های مورد نظر در مجموعه وجود دارند یا خیر.
@if ($attributes->hasAny(['class', 'id']))
<div {{ $attributes }}>
{{ $slot }}
</div>
@endif


این کد بررسی می‌کند که آیا یکی از ویژگی‌های class یا id وجود دارند و در صورت وجود، div را با آن‌ها رندر می‌کند.

9- متد get:
این متد مقدار یک ویژگی خاص را برمی‌گرداند. اگر ویژگی وجود نداشته باشد، می‌توانید یک مقدار پیش‌فرض برای آن تعیین کنید.
<div id="{{ $attributes->get('id', 'default-id') }}">
{{ $slot }}
</div>


در اینجا، اگر ویژگی id پاس داده نشده باشد، مقدار پیش‌فرض default-id استفاده می‌شود.

این متدها به شما اجازه می‌دهند که به شکلی انعطاف‌پذیر با ویژگی‌های HTML که به کامپوننت‌های Blade لاراول پاس داده می‌شوند، کار کنید. با استفاده از این متدها، می‌توانید ویژگی‌ها را فیلتر کنید، ادغام کنید، بررسی کنید که آیا ویژگی‌ای وجود دارد یا خیر، و در نهایت به شکل دقیق‌تری کامپوننت‌های خود را مدیریت کنید.

🔖 #Laravel, #PHP, #لاراول, #فصل_۳

👤 AmirHossein

💎 Channel: @DevelopixLaravel
4👍1🔥1