From 6b48c31afdd95553bb7df7f4cea16a0fd2880e0e Mon Sep 17 00:00:00 2001 From: f4ilji Date: Mon, 13 Jan 2025 13:56:50 +0500 Subject: [PATCH] Changes --- app/Http/Controllers/ClientPostController.php | 55 ++++++++++++++----- app/Http/Controllers/PageController.php | 17 ++++-- .../Controllers/api/NavigateController.php | 1 - app/Http/Kernel.php | 7 ++- app/Http/Middleware/HandleInertiaRequests.php | 14 ++++- app/Observers/PostObserver.php | 36 +++++++++--- app/Providers/AppServiceProvider.php | 4 ++ config/cache.php | 4 +- config/database.php | 4 +- docker-compose.yml | 17 +++--- routes/web.php | 18 ++---- 11 files changed, 115 insertions(+), 62 deletions(-) diff --git a/app/Http/Controllers/ClientPostController.php b/app/Http/Controllers/ClientPostController.php index 6095cd8..b743ad4 100644 --- a/app/Http/Controllers/ClientPostController.php +++ b/app/Http/Controllers/ClientPostController.php @@ -20,6 +20,7 @@ use App\Models\Tag; use Carbon\Carbon; use Doctrine\DBAL\Schema\Column; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\DB; use Inertia\Inertia; @@ -128,28 +129,52 @@ class ClientPostController extends Controller public function show(Request $request, $slug) { - $post = new PostResource(Post::where('slug', $slug)->where('publish_at', '<', Carbon::now())->firstOrFail()); - $routeUrl = route('client.post.index'); - $path = ltrim(parse_url($routeUrl, PHP_URL_PATH), '/'); + // Уникальный ключ для кеширования + $cacheKey = 'post_' . md5($slug); - $page = Page::where('path', '=', $path)->with('section.pages.section', 'section.mainSection')->first(); + // Пытаемся получить данные из кеша + $data = Cache::remember($cacheKey, now()->addHours(1), function () use ($slug) { + // Получаем пост + $post = Post::where('slug', $slug) + ->where('publish_at', '<', Carbon::now()) + ->firstOrFail(); - if (isset($page->section)) { - $breadcrumbs = [ - 'mainSection' => new ClientBreadcrumbSection($page->section->mainSection), - 'subSection' => new ClientBreadcrumbSubSection($page->section), - 'page' => new ClientBreadcrumbPage($page), - ]; - } else { + // Преобразуем пост в ресурс + $postResource = new PostResource($post); + + // Получаем путь для страницы + $routeUrl = route('client.post.index'); + $path = ltrim(parse_url($routeUrl, PHP_URL_PATH), '/'); + + // Получаем данные страницы + $page = Page::where('path', '=', $path) + ->with('section.pages.section', 'section.mainSection') + ->first(); + + // Формируем хлебные крошки $breadcrumbs = null; - } + if (isset($page->section)) { + $breadcrumbs = [ + 'mainSection' => new ClientBreadcrumbSection($page->section->mainSection), + 'subSection' => new ClientBreadcrumbSubSection($page->section), + 'page' => new ClientBreadcrumbPage($page), + ]; + } - $seo = $post->seo ?? null; + // SEO-данные + $seo = $post->seo ?? null; + // Возвращаем данные для кеширования + return [ + 'post' => $postResource, + 'breadcrumbs' => $breadcrumbs, + 'seo' => $seo, + ]; + }); - return Inertia::render('Client/Posts/Show', compact('post', 'breadcrumbs', 'seo')); + // Возвращаем ответ с использованием кешированных данных + return Inertia::render('Client/Posts/Show', $data); } - } diff --git a/app/Http/Controllers/PageController.php b/app/Http/Controllers/PageController.php index 5b31aaa..d48ea22 100644 --- a/app/Http/Controllers/PageController.php +++ b/app/Http/Controllers/PageController.php @@ -15,6 +15,7 @@ use App\Models\MainSection; use App\Models\Page; use App\Models\Post; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Redirect; use Inertia\Inertia; @@ -23,7 +24,16 @@ class PageController extends Controller { public function render($path) { - $page = Page::where('path', '=', $path)->with('section.pages.section', 'section.mainSection')->first(); + // Генерируем уникальный ключ для кеширования + $cacheKey = 'page_' . md5($path); + + // Пытаемся получить данные из кеша + $page = Cache::remember($cacheKey, now()->addHours(1), function () use ($path) { + return Page::where('path', '=', $path) + ->with('section.pages.section', 'section.mainSection') + ->first(); + }); + if ($page === null) { abort(404); } @@ -42,21 +52,16 @@ class PageController extends Controller $seo = $page->seo ?? null; - - $page = new PageResource($page); $error = $page->code; - - if ($page->code != 200) { abort($error); } return Inertia::render($page->template, compact('page', 'subSectionPages', 'breadcrumbs', 'seo')); } - public function getRegisteredPages() { $pages = PageResource::collection(Page::query() diff --git a/app/Http/Controllers/api/NavigateController.php b/app/Http/Controllers/api/NavigateController.php index f994888..57db702 100644 --- a/app/Http/Controllers/api/NavigateController.php +++ b/app/Http/Controllers/api/NavigateController.php @@ -13,6 +13,5 @@ class NavigateController extends Controller public function index() { return ClientNavigationResource::collection(MainSection::with('subSections.pages')->orderBy('sort', 'asc')->get()); - } } diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index c6da768..34669e3 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -6,9 +6,10 @@ use App\Http\Middleware\AccessCheck; use App\Http\Middleware\RateLimitCheckMiddleware; use App\Http\Middleware\RateLimitCounterMiddleware; use Illuminate\Foundation\Http\Kernel as HttpKernel; -use Spatie\Permission\Middlewares\PermissionMiddleware; -use Spatie\Permission\Middlewares\RoleMiddleware; -use Spatie\Permission\Middlewares\RoleOrPermissionMiddleware; +use Spatie\Permission\Middleware\PermissionMiddleware; +use Spatie\Permission\Middleware\RoleMiddleware; +use Spatie\Permission\Middleware\RoleOrPermissionMiddleware; + class Kernel extends HttpKernel { diff --git a/app/Http/Middleware/HandleInertiaRequests.php b/app/Http/Middleware/HandleInertiaRequests.php index 378db09..cea890e 100644 --- a/app/Http/Middleware/HandleInertiaRequests.php +++ b/app/Http/Middleware/HandleInertiaRequests.php @@ -5,6 +5,7 @@ namespace App\Http\Middleware; use App\Http\Resources\ClientNavigationResource; use App\Models\MainSection; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Cache; use Inertia\Middleware; use Tightenco\Ziggy\Ziggy; @@ -32,6 +33,14 @@ class HandleInertiaRequests extends Middleware */ public function share(Request $request): array { + $navigation = Cache::remember('navigation', now()->addHours(1), function () { + return ClientNavigationResource::collection( + MainSection::with('subSections.pages.section') + ->orderBy('sort', 'asc') + ->get() + ); + }); + return [ ...parent::share($request), 'auth' => [ @@ -41,15 +50,14 @@ class HandleInertiaRequests extends Middleware ...(new Ziggy)->toArray(), 'location' => $request->url(), ], - 'navigation' => ClientNavigationResource::collection(MainSection::with('subSections.pages.section')->orderBy('sort', 'asc')->get()), + 'navigation' => $navigation, 'urlPrev' => function() { if (url()->previous() !== '' && url()->previous() !== url()->current()) { return url()->previous(); } else { - return 'empty'; // Используется в JavaScript для отключения поведения кнопки "Назад" + return 'empty'; } }, - ]; } } diff --git a/app/Observers/PostObserver.php b/app/Observers/PostObserver.php index ec97873..8dd0be3 100644 --- a/app/Observers/PostObserver.php +++ b/app/Observers/PostObserver.php @@ -4,6 +4,7 @@ namespace App\Observers; use App\Models\Post; use Filament\Notifications\Notification; +use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Redirect; class PostObserver @@ -13,27 +14,24 @@ class PostObserver */ public function saved(Post $post): void { - $recipient = auth()->user(); - Notification::make() - ->title('Saved successfully') - ->sendToDatabase($recipient); } /** * Handle the Post "updated" event. */ - public function updated(Post $post): void + public function updated(Post $post) { - // + $this->clearPostCache($post); + $this->cachePost($post); // Кешируем обновленный пост } /** - * Handle the Post "deleted" event. + * Очистка кеша при удалении поста. */ - public function deleted(Post $post): void + public function deleted(Post $post) { - // + $this->clearPostCache($post); } /** @@ -51,4 +49,24 @@ class PostObserver { // } + + protected function cachePost(Post $post) + { + $cacheKey = 'post_' . md5($post->slug); + $cacheData = [ + 'post' => $post, + 'seo' => $post->seo, + ]; + + Cache::put($cacheKey, $cacheData, now()->addHours(1)); // Кешируем на 1 час + } + + /** + * Очистка кеша поста. + */ + protected function clearPostCache(Post $post) + { + $cacheKey = 'post_' . md5($post->slug); + Cache::forget($cacheKey); + } } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 5a115d0..085ae2e 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,7 +2,9 @@ namespace App\Providers; +use App\Models\Page; use App\Models\Post; +use App\Observers\PageObserver; use App\Observers\PostObserver; use Carbon\Carbon; use Filament\Facades\Filament; @@ -29,6 +31,8 @@ class AppServiceProvider extends ServiceProvider public function boot(): void { setlocale(LC_TIME, 'ru_RU.UTF-8'); + Page::observe(PageObserver::class); + Post::observe(PostObserver::class); Carbon::setLocale(config('app.locale')); Model::preventLazyLoading(!app()->isProduction()); // URL::forceScheme('https'); diff --git a/config/cache.php b/config/cache.php index d4171e2..161940f 100644 --- a/config/cache.php +++ b/config/cache.php @@ -15,7 +15,7 @@ return [ | */ - 'default' => env('CACHE_DRIVER', 'file'), + 'default' => env('CACHE_DRIVER', 'redis'), /* |-------------------------------------------------------------------------- @@ -106,6 +106,6 @@ return [ | */ - 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache_'), + 'prefix' => env('CACHE_PREFIX'), ]; diff --git a/config/database.php b/config/database.php index 9144b5f..30d6606 100644 --- a/config/database.php +++ b/config/database.php @@ -121,11 +121,11 @@ return [ 'redis' => [ - 'client' => env('REDIS_CLIENT', 'phpredis'), + 'client' => env('REDIS_CLIENT', 'predis'), 'options' => [ 'cluster' => env('REDIS_CLUSTER', 'redis'), - 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), + 'prefix' => env('REDIS_PREFIX') . ':', ], 'default' => [ diff --git a/docker-compose.yml b/docker-compose.yml index 0cb3b5e..9642db6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ version: '3' services: webserver: - image: nginx:latest + image: nginx:1.27.2 volumes: - ./:/var/www - ./_docker/nginx/conf.d/:/etc/nginx/conf.d/ @@ -24,7 +24,7 @@ services: command: > sh -c "cron && php artisan inertia:start-ssr & php-fpm" - php-queue: + php-queue-worker: restart: always build: context: . @@ -48,13 +48,16 @@ services: ports: - "3306:3306" - redis: - image: redis:latest - container_name: ntspi-redis + redis-cache: + image: redis:7.4.2 + restart: always + container_name: ntspi-cache-service ports: - "6379:6379" + command: redis-server --save 20 1 --loglevel warning volumes: - - redis_data:/data + - cache:/data volumes: - redis_data: \ No newline at end of file + cache: + driver: local \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index dc53558..52e4ddc 100644 --- a/routes/web.php +++ b/routes/web.php @@ -13,31 +13,22 @@ use App\Http\Controllers\ClientProgramController; use App\Http\Controllers\ClientScheduleController; use App\Http\Controllers\ClientVacantPositionController; use App\Http\Controllers\ClientVirtualExhibitionController; -use App\Http\Controllers\ClientWidgetFormController; use App\Http\Controllers\EducationalProgramController; use App\Http\Controllers\GenerateSitemapController; -use App\Http\Controllers\LinkToolController; use App\Http\Controllers\MainController; use App\Http\Controllers\PageController; use App\Http\Controllers\PersonController; -use App\Http\Controllers\ScheduleController; -use App\Http\Controllers\StudentController; + use App\Http\Controllers\UpdateEduDataApiController; -use App\Http\Controllers\UpdateViconDataApi; -use App\Http\Controllers\VkAuthController; -use App\Http\Controllers\VkPostController; -use App\Models\Post; + +use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Route; -use Inertia\Inertia; -use Spatie\Sitemap\Sitemap; -use Spatie\Sitemap\SitemapGenerator; -use Spatie\Sitemap\Tags\Url; + Route::middleware('signed')->get('invitation/{invitation}/accept', \App\Livewire\AcceptInvitation::class) ->name('invitation.accept'); -Route::get('/generate-sitemap', [GenerateSitemapController::class, 'index'])->name('generate-sitemap'); Route::middleware('access-check')->group(function () { @@ -98,7 +89,6 @@ Route::middleware('access-check')->group(function () { Route::get('/get-data', [UpdateEduDataApiController::class, 'index']); Route::get('{path}', [PageController::class, 'render'])->where('path', '[0-9,a-z,/,-]+')->name('page.view'); - });