سلام و خسته نباشید خدمت برنامه نویسان عزیز لاراول
من یک روت دارم برای نمایش وضعیت مالی دبیران
هر صفحه نمایش دهنده یک سری اطلاعات مالی دبیره. هر دبیر چند دوره داره و محاسبه مالی هر دوره کمی سنگینه که برای همین توی پوشه app/Classes یه کلاس اختصاصی برای محاسبه قیمت دوره نوشتم.
حالا می خوام توی صفحه هر دبیر، دوره های اون رو بندازیم توی حلقه foreach و هزینه هر دوره رو نمایش بدم. باید هزینه هر دوره رو با کلاسی که نوشتم نمایش بدم. حالا سوالم اینه که چطور باید توی فایل ویو (blade) یک کلاس رو توی دوره استفاده کنم و ازش یک شی بسازم و متد دلخوام رو فراخوانی کنم؟ (بنا به دلایلی متدها استاتیک نیستند)
<thead>
<tr>
<th>ردیف</th>
<th>نام دوره</th>
<th>وضعیت دوره</th>
<th>تعداد دا</th>
<th>پرداختی دا</th>
<th>باقیمانده پرداختی دا</th>
<th>مبلغ دوره</th>
</tr>
</thead>
<tbody class="list">
@foreach($teacher->course as $course)
<tr>
<td scope="row">{{$loop->index +1}}</td>
<td><span class="badge badge-success badge-pill">{{$course->name}}</span></td>
<td>کد های مربوط به ساختن شی از کلاس</td>
<td>{{$course->students()->count()}}</td>
<td>{{number_format($course->deposits()->sum('cost'))}}</td>
<td>
<div class="d-flex align-items-center">
<span class="completion mr-2">100٪</span>
<div>
<div class="progress h-6" style="width: 100px;">
<div class="progress-bar bg-success" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100" style="width: 100%;"></div>
</div>
</div>
</div>
</td>
<td>{{$course->courseStatus}}</td>
</tr>
@endforeach
</tbody>
ضمنا آیا اصلا این کار درسته؟
یا شاید باید توی کنترلر این اطلاعات رو بگیرم و توی یک مثلا آرایه بریزم و بفرستم به ویو؟
یا شاید هم راهی باشه که توی مدل مستقیما قیمت محاسبه بشه؟
کار اصولی و درستش کدومه و چطوری؟
ممنون می شم راهنمایی کنید.
سلام اگر کلاست وابستگی ای نداره یعنی توی متد سازندش (constructor) از کلاس دیگه ای استفاده نشده میتونی با استفاده از @inject کلاست رو استفاده کنی.
@inject رو بالای فایل blade به صورت زیر استفاده کن
@inject('objectName', \App\Path\To\Your\Class)
objectName اسم متغیری میشه که اون آبجکت ازش ساخته میشه و آرگومان دوم هم کلاسیه که باید ساخته بشه.
بعد میتونی آبجکتت رو به صورت زیر استفاده کنی
{{ $objectName->yourMethod($args) }}
این در صورتیه که کلاست dependency نداشته باشه
اما اگر کلاست dependency داره میتونی از سرویس کانتینر لاراول استفاده کنی ،این لینک درباره سرویس کانتینر لاراول و موارد استفادش توضیح داده.
@rezaesoheil ممنون از راهنماییتون.
ممکنه توی سینتکسش هم کمی راهنمایی کنید.
کلاسی که استفاده می کنم فقط آیدی دوره رو می گیره. وابستگی دیگری نداره. نام کلاس CourseCalculator هست که در پوشه App\Classes قرار داره.
متد سازنده ای به این شرح داره:
public function __construct($id)
{
$this->course = course::query()->find($id);
$this->type = $this->course->type;
}
متدی هم که استفاده می شه CourseCost() هست.
نکته اول اینه که شما توی لوپ course رو دارید ولی دوباره دارید توی متد کوئری میزنید به دیتابیس که نیازی به این کار نیست به نظر من.
نکته دوم اینه که بازم به نظر من constructor نیازی نداری $id رو به عنوان آرگومان دریافت کنه ،به جاش میتونید constructor رو خالی بزارید و بعد بیاید $id رو به عنوان آرگومان پاس بدید به متدی که از اون کلاس صدا میکنید.
در نهایت میتونید اصلا $id رو پاس ندید به متد بلکه آبجکتی که از Course ساخته شده رو پاس بدید به متد کلاستون و بعد ازش استفاده کنید.
کلاستون در نهایت باید اینطوری باشه:
class CourseCalculator
{
public function __construct()
{
# empty
}
public function courseCost(App\Models\Course $course)
{
# use $course here
}
}
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟