Pages in app/Filament/Resources/*/Pages/ with view='filament.pages.xxx' keep their blade files in app/Filament/Resources/views/, not in the default resources/views/filament/pages/. Add the path to the view finder so Laravel can locate them without requiring each Resource's view to be copied to resources/views/.
79 lines
3.3 KiB
PHP
79 lines
3.3 KiB
PHP
<?php
|
||
|
||
namespace App\Providers;
|
||
|
||
use Illuminate\Support\ServiceProvider;
|
||
use Illuminate\Cache\RateLimiting\Limit;
|
||
use Illuminate\Http\Request;
|
||
use Illuminate\Support\Facades\RateLimiter;
|
||
use App\Models\Shipment;
|
||
use App\Observers\ShipmentObserver;
|
||
|
||
class AppServiceProvider extends ServiceProvider
|
||
{
|
||
/**
|
||
* Register any application services.
|
||
*/
|
||
public function register(): void
|
||
{
|
||
//
|
||
}
|
||
|
||
/**
|
||
* Bootstrap any application services.
|
||
*/
|
||
public function boot(): void
|
||
{
|
||
// هک برای رفع مشکل دیسک اکسل در لاراول ۱۱/۱۲
|
||
config(['excel.temporary_files.disk' => 'local']);
|
||
|
||
// ─── ثبت مسیر view برای صفحات Filament Resource ───
|
||
// صفحاتی که در app/Filament/Resources/*/Pages هستند و view='filament.pages.xxx'
|
||
// دارند، blade خودشان را در app/Filament/Resources/views/ نگه میدارند.
|
||
// این خط به Laravel میگوید علاوه بر resources/views/filament/pages/،
|
||
// این مسیر را هم برای namespace 'filament.pages' جستجو کند.
|
||
view()->addNamespace('filament.pages', app_path('Filament/Resources/views'));
|
||
|
||
// ثبت Observer برای اطلاعیههای تغییر سفارش
|
||
Shipment::observe(ShipmentObserver::class);
|
||
|
||
// Explicitly require the IFNEX number helper file so
|
||
// ifnex_format_number() / ifnex_persian_digits() / ifnex_trend_percent()
|
||
// are available even before `composer dump-autoload` is re-run.
|
||
$helperPath = base_path('app/Helpers/number.php');
|
||
if (is_file($helperPath)) {
|
||
require_once $helperPath;
|
||
}
|
||
|
||
// ─── Rate Limiting برای APIهای حساس ───
|
||
RateLimiter::for('auth', function (Request $request) {
|
||
// لاگین: ۵ درخواست در دقیقه per IP (جلوگیری از brute-force)
|
||
return Limit::perMinute(5)->by($request->ip());
|
||
});
|
||
|
||
RateLimiter::for('sms', function (Request $request) {
|
||
// ارسال کد پیامکی: ۱ درخواست در دقیقه per شماره موبایل
|
||
return Limit::perMinute(1)->by($request->input('phone') ?: $request->ip());
|
||
});
|
||
|
||
RateLimiter::for('public', function (Request $request) {
|
||
// API عمومی (رهگیری، استعلام قیمت): ۳۰ درخواست در دقیقه per IP
|
||
return Limit::perMinute(30)->by($request->ip());
|
||
});
|
||
|
||
RateLimiter::for('customer', function (Request $request) {
|
||
// API مشتری (لاگینشده): ۶۰ درخواست در دقیقه per user
|
||
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
|
||
});
|
||
|
||
RateLimiter::for('wallet', function (Request $request) {
|
||
// عملیات مالی حساس (پرداخت، شارژ، freeze): ۳۰ درخواست در دقیقه per user
|
||
return Limit::perMinute(30)->by($request->user()?->id ?: $request->ip());
|
||
});
|
||
|
||
RateLimiter::for('staff', function (Request $request) {
|
||
// API کارمند: ۶۰ درخواست در دقیقه per user
|
||
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
|
||
});
|
||
}
|
||
} |