From 4dc7e2da903452d6f466115756ec20e3171ab34d Mon Sep 17 00:00:00 2001 From: Rodrigo Castro Date: Wed, 21 Oct 2026 17:57:01 -0300 Subject: [PATCH 01/10] =?UTF-8?q?feat(seo):=20adiciona=20meta=20descriptio?= =?UTF-8?q?n=20din=C3=A2mica,=20og=20e=20twitter=20cards=20no=20layout=20b?= =?UTF-8?q?ase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/components/layouts/app.blade.php | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/site_novo/resources/views/components/layouts/app.blade.php b/site_novo/resources/views/components/layouts/app.blade.php index 8df4b88..beaa853 100644 --- a/site_novo/resources/views/components/layouts/app.blade.php +++ b/site_novo/resources/views/components/layouts/app.blade.php @@ -1,11 +1,44 @@ +@props([ + 'title' => null, + 'description' => 'A PHP PB é a comunidade de desenvolvedores PHP da Paraíba. Conectamos pessoas, compartilhamos conhecimento e fortalecemos o ecossistema PHP no nosso estado.', + 'image' => null, + 'type' => 'website', + 'noindex' => false, +]) + +@php + $pageTitle = $title ?? config('app.name'); + $ogImage = $image ?? asset('images/hero/farol-cena.png'); + $canonical = rtrim(config('app.url'), '/').request()->getRequestUri(); +@endphp + - + + + @if ($noindex) + + @endif + + {{ $pageTitle }} - {{ $title ?? config('app.name') }} + + + + + + + + + + + + + + @@ -18,6 +51,8 @@ @vite(['resources/css/app.css', 'resources/js/app.js']) @livewireStyles + + {{ $head ?? '' }} {{ $slot }} From a28e9290cbcd525265822f1f4c1feb3a38d3327f Mon Sep 17 00:00:00 2001 From: Rodrigo Castro Date: Wed, 21 Oct 2026 17:57:02 -0300 Subject: [PATCH 02/10] =?UTF-8?q?feat(seo):=20descri=C3=A7=C3=A3o=20e=20js?= =?UTF-8?q?onld=20de=20organization=20na=20home?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/views/pages/home.blade.php | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/site_novo/resources/views/pages/home.blade.php b/site_novo/resources/views/pages/home.blade.php index 96128b9..708adc7 100644 --- a/site_novo/resources/views/pages/home.blade.php +++ b/site_novo/resources/views/pages/home.blade.php @@ -1,4 +1,27 @@ - + + + + +
From 73a8c53c23f24a09f987eef45fb4698a3b0bd275 Mon Sep 17 00:00:00 2001 From: Rodrigo Castro Date: Wed, 21 Oct 2026 17:57:03 -0300 Subject: [PATCH 03/10] =?UTF-8?q?feat(seo):=20descri=C3=A7=C3=A3o,=20og:im?= =?UTF-8?q?age=20e=20jsonld=20blogposting=20no=20blog?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- site_novo/app/Models/Post.php | 10 +++++ .../resources/views/blog/index.blade.php | 5 ++- site_novo/resources/views/blog/show.blade.php | 37 ++++++++++++++++++- 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/site_novo/app/Models/Post.php b/site_novo/app/Models/Post.php index 8f4f5a6..d21f133 100644 --- a/site_novo/app/Models/Post.php +++ b/site_novo/app/Models/Post.php @@ -81,4 +81,14 @@ public function getMainImage(): ?string return $this->main_image_url; } + + public function getExcerpt(int $length = 160): string + { + $text = collect($this->content_blocks ?? []) + ->first(fn (array $block) => ($block['type'] ?? null) === 'paragraph' && filled($block['data']['text'] ?? null)); + + $plainText = trim(html_entity_decode(strip_tags($text['data']['text'] ?? ''), ENT_QUOTES)); + + return str($plainText)->limit($length)->toString(); + } } diff --git a/site_novo/resources/views/blog/index.blade.php b/site_novo/resources/views/blog/index.blade.php index 8880a50..778ff9d 100644 --- a/site_novo/resources/views/blog/index.blade.php +++ b/site_novo/resources/views/blog/index.blade.php @@ -1,4 +1,7 @@ - +
diff --git a/site_novo/resources/views/blog/show.blade.php b/site_novo/resources/views/blog/show.blade.php index 442d90f..40e6edf 100644 --- a/site_novo/resources/views/blog/show.blade.php +++ b/site_novo/resources/views/blog/show.blade.php @@ -1,4 +1,39 @@ - + + + + +
From ec5a4ace922f8f08e342ffcfa2af910cb00700ca Mon Sep 17 00:00:00 2001 From: Rodrigo Castro Date: Wed, 21 Oct 2026 17:57:04 -0300 Subject: [PATCH 04/10] =?UTF-8?q?feat(seo):=20descri=C3=A7=C3=A3o=20e=20js?= =?UTF-8?q?onld=20event=20na=20p=C3=A1gina=20de=20eventos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/views/events/index.blade.php | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/site_novo/resources/views/events/index.blade.php b/site_novo/resources/views/events/index.blade.php index 6659836..9861aeb 100644 --- a/site_novo/resources/views/events/index.blade.php +++ b/site_novo/resources/views/events/index.blade.php @@ -1,4 +1,43 @@ - + + @if ($events->count() > 0) + + + + @endif +
From b5f5fdbed10fa2bae671db2745caee876f399e77 Mon Sep 17 00:00:00 2001 From: Rodrigo Castro Date: Wed, 21 Oct 2026 17:57:06 -0300 Subject: [PATCH 05/10] =?UTF-8?q?feat(seo):=20descri=C3=A7=C3=A3o=20din?= =?UTF-8?q?=C3=A2mica=20em=20vagas=20e=20palestrantes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- site_novo/resources/views/jobs/index.blade.php | 5 ++++- site_novo/resources/views/speakers/index.blade.php | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/site_novo/resources/views/jobs/index.blade.php b/site_novo/resources/views/jobs/index.blade.php index 9401038..124595f 100644 --- a/site_novo/resources/views/jobs/index.blade.php +++ b/site_novo/resources/views/jobs/index.blade.php @@ -1,4 +1,7 @@ - +
diff --git a/site_novo/resources/views/speakers/index.blade.php b/site_novo/resources/views/speakers/index.blade.php index c997dc3..23c72ce 100644 --- a/site_novo/resources/views/speakers/index.blade.php +++ b/site_novo/resources/views/speakers/index.blade.php @@ -1,4 +1,7 @@ - +
From 0101611924029c3c1fbdd87bd009a6661c2d0cf2 Mon Sep 17 00:00:00 2001 From: Rodrigo Castro Date: Wed, 21 Oct 2026 17:57:07 -0300 Subject: [PATCH 06/10] =?UTF-8?q?feat(seo):=20marca=20p=C3=A1ginas=20de=20?= =?UTF-8?q?erro=20como=20noindex?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- site_novo/resources/views/errors/403.blade.php | 2 +- site_novo/resources/views/errors/404.blade.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/site_novo/resources/views/errors/403.blade.php b/site_novo/resources/views/errors/403.blade.php index 6c7a681..ba3d4cc 100644 --- a/site_novo/resources/views/errors/403.blade.php +++ b/site_novo/resources/views/errors/403.blade.php @@ -1,4 +1,4 @@ - +
diff --git a/site_novo/resources/views/errors/404.blade.php b/site_novo/resources/views/errors/404.blade.php index cb5bac5..308dc77 100644 --- a/site_novo/resources/views/errors/404.blade.php +++ b/site_novo/resources/views/errors/404.blade.php @@ -1,4 +1,4 @@ - +
From acf4eee7de80d16c1903cc9d0e46a75f4823ff52 Mon Sep 17 00:00:00 2001 From: Rodrigo Castro Date: Wed, 21 Oct 2026 17:57:09 -0300 Subject: [PATCH 07/10] =?UTF-8?q?feat(seo):=20gera=20sitemap.xml=20din?= =?UTF-8?q?=C3=A2mico=20e=20referencia=20no=20robots.txt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Http/Controllers/SitemapController.php | 29 +++++++++++++++++++ site_novo/public/robots.txt | 5 +++- site_novo/resources/views/sitemap.blade.php | 18 ++++++++++++ site_novo/routes/web.php | 3 ++ 4 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 site_novo/app/Http/Controllers/SitemapController.php create mode 100644 site_novo/resources/views/sitemap.blade.php diff --git a/site_novo/app/Http/Controllers/SitemapController.php b/site_novo/app/Http/Controllers/SitemapController.php new file mode 100644 index 0000000..acc1fe7 --- /dev/null +++ b/site_novo/app/Http/Controllers/SitemapController.php @@ -0,0 +1,29 @@ +orderBy('published_at', 'desc')->get(['slug', 'updated_at']); + + $staticRoutes = [ + ['route' => route('home'), 'priority' => '1.0', 'changefreq' => 'weekly'], + ['route' => route('blog.index'), 'priority' => '0.8', 'changefreq' => 'daily'], + ['route' => route('events.index'), 'priority' => '0.8', 'changefreq' => 'daily'], + ['route' => route('jobs.index'), 'priority' => '0.6', 'changefreq' => 'weekly'], + ['route' => route('speakers.index'), 'priority' => '0.5', 'changefreq' => 'monthly'], + ]; + + $xml = view('sitemap', [ + 'staticRoutes' => $staticRoutes, + 'posts' => $posts, + ])->render(); + + return response($xml, 200)->header('Content-Type', 'application/xml'); + } +} diff --git a/site_novo/public/robots.txt b/site_novo/public/robots.txt index eb05362..82953e3 100644 --- a/site_novo/public/robots.txt +++ b/site_novo/public/robots.txt @@ -1,2 +1,5 @@ User-agent: * -Disallow: +Disallow: /admin +Disallow: /membro + +Sitemap: https://php-pb.net/sitemap.xml diff --git a/site_novo/resources/views/sitemap.blade.php b/site_novo/resources/views/sitemap.blade.php new file mode 100644 index 0000000..97b44c2 --- /dev/null +++ b/site_novo/resources/views/sitemap.blade.php @@ -0,0 +1,18 @@ +'; ?> + +@foreach ($staticRoutes as $item) + + {{ $item['route'] }} + {{ $item['changefreq'] }} + {{ $item['priority'] }} + +@endforeach +@foreach ($posts as $post) + + {{ route('blog.show', $post->slug) }} + {{ $post->updated_at->toAtomString() }} + monthly + 0.7 + +@endforeach + diff --git a/site_novo/routes/web.php b/site_novo/routes/web.php index 60047b4..ce95c6f 100644 --- a/site_novo/routes/web.php +++ b/site_novo/routes/web.php @@ -3,6 +3,7 @@ use App\Http\Controllers\EventController; use App\Http\Controllers\JobListingController; use App\Http\Controllers\PostController; +use App\Http\Controllers\SitemapController; use App\Http\Controllers\SpeakerController; use Illuminate\Support\Facades\Route; @@ -10,6 +11,8 @@ return view('pages.home'); })->name('home'); +Route::get('/sitemap.xml', [SitemapController::class, 'index'])->name('sitemap'); + Route::get('/blog', [PostController::class, 'index'])->name('blog.index'); Route::get('/blog/{slug}', [PostController::class, 'show'])->name('blog.show'); From e095f3c64811148b653fbec0df4aa2e9f3d006b1 Mon Sep 17 00:00:00 2001 From: Rodrigo Castro Date: Wed, 21 Oct 2026 17:57:10 -0300 Subject: [PATCH 08/10] test: cobre meta tags, jsonld e sitemap --- site_novo/tests/Feature/SeoTest.php | 57 +++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 site_novo/tests/Feature/SeoTest.php diff --git a/site_novo/tests/Feature/SeoTest.php b/site_novo/tests/Feature/SeoTest.php new file mode 100644 index 0000000..b028cdc --- /dev/null +++ b/site_novo/tests/Feature/SeoTest.php @@ -0,0 +1,57 @@ +get(route('home'))->assertOk(); + + $response->assertSee('name="description" content="A PHP PB é a comunidade', false); + $response->assertSee('assertSee('property="og:title"', false); + $response->assertSee('name="twitter:card" content="summary_large_image"', false); + $response->assertSee('"@type":"Organization"', false); +}); + +test('a blog post has its own meta description, og:image and blogposting jsonld', function () { + $post = Post::factory()->create([ + 'title' => 'Como testar SEO no Laravel', + ]); + + $response = $this->get(route('blog.show', $post->slug))->assertOk(); + + $response->assertSee('Como testar SEO no Laravel - PHP-PB', false); + $response->assertSee('property="og:type" content="article"', false); + $response->assertSee('"@type":"BlogPosting"', false); + $response->assertSee('"headline":"Como testar SEO no Laravel"', false); +}); + +test('the events page includes event jsonld only when there are upcoming events', function () { + $this->get(route('events.index')) + ->assertOk() + ->assertDontSee('application/ld+json', false); + + Event::factory()->create(['title' => 'Meetup PHP PB de Teste']); + + $response = $this->get(route('events.index'))->assertOk(); + + $response->assertSee('"@type":"Event"', false); + $response->assertSee('"name":"Meetup PHP PB de Teste"', false); +}); + +test('error pages are marked as noindex', function () { + $this->get('/rota-que-nao-existe') + ->assertNotFound() + ->assertSee('name="robots" content="noindex, nofollow"', false); +}); + +test('the sitemap lists static pages and published posts', function () { + $post = Post::factory()->create(); + + $response = $this->get('/sitemap.xml')->assertOk(); + + $response->assertHeader('Content-Type', 'application/xml'); + $response->assertSee('', false); + $response->assertSee(''.route('home').'', false); + $response->assertSee(''.route('blog.show', $post->slug).'', false); +}); From 40d1df78e3bd83f546a2925496718b907a87d7a4 Mon Sep 17 00:00:00 2001 From: Rodrigo Castro Date: Wed, 21 Oct 2026 18:03:50 -0300 Subject: [PATCH 09/10] fix(design): troca telegram por whatsapp no footer e no jsonld --- .../views/components/landing/\342\232\241footer.blade.php" | 4 ++-- site_novo/resources/views/pages/home.blade.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git "a/site_novo/resources/views/components/landing/\342\232\241footer.blade.php" "b/site_novo/resources/views/components/landing/\342\232\241footer.blade.php" index 0761495..5c55995 100644 --- "a/site_novo/resources/views/components/landing/\342\232\241footer.blade.php" +++ "b/site_novo/resources/views/components/landing/\342\232\241footer.blade.php" @@ -46,9 +46,9 @@ class="text-azul-marinho hover:text-azul-principal transition-colors"> - - + diff --git a/site_novo/resources/views/pages/home.blade.php b/site_novo/resources/views/pages/home.blade.php index 708adc7..b82950b 100644 --- a/site_novo/resources/views/pages/home.blade.php +++ b/site_novo/resources/views/pages/home.blade.php @@ -14,7 +14,7 @@ 'description' => 'Comunidade de desenvolvedores PHP da Paraíba, promovendo meetups, conteúdo e networking desde 2012.', 'sameAs' => [ 'https://github.com/php-pb', - 'https://t.me/phppb', + 'https://chat.whatsapp.com/JaWCta8t2DF9Af0zgIb8LB?mode=gi_t', 'https://twitter.com/phppb', 'https://www.facebook.com/groups/php.pb', ], From abaaf752895e3e7e77907a888615f89d2fb5e6a4 Mon Sep 17 00:00:00 2001 From: Rodrigo Castro Date: Wed, 21 Oct 2026 18:03:52 -0300 Subject: [PATCH 10/10] docs: atualiza readme com whatsapp, comunidades parceiras e ci/cd --- README.md | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 5b2d40f..92347d8 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,11 @@

Site - Telegram - License + WhatsApp + License Laravel Livewire + Filament Tailwind

@@ -23,7 +24,7 @@ A **PHP-PB** é uma comunidade de desenvolvedores PHP do estado da Paraíba, Bra ### O que fazemos -- **Grupo no Telegram** - Discussões diárias sobre PHP, Laravel, dúvidas técnicas +- **Grupo no WhatsApp** - Discussões diárias sobre PHP, Laravel, dúvidas técnicas - **Meetups & Hangouts** - Encontros presenciais e online com palestras - **Blog** - Artigos técnicos escritos pela comunidade - **Vagas** - Oportunidades de emprego compartilhadas @@ -38,7 +39,9 @@ A **PHP-PB** é uma comunidade de desenvolvedores PHP do estado da Paraíba, Bra | **Tailwind CSS** | 4 | Framework CSS utility-first | | **Alpine.js** | 3 | Interatividade (incluso no Livewire) | | **MySQL** | 8 | Banco de dados | -| **FilamentPHP** | 5 | Painel administrativo | +| **FilamentPHP** | 5 | Painel administrativo e área de membro | +| **Phosphor Icons** | - | Ícones do design system | +| **Pest** | - | Testes automatizados | ## Estrutura do Projeto @@ -151,23 +154,36 @@ npm run build npm run dev ``` +## CI/CD + +- **CI** (`.github/workflows/ci.yml`): roda em todo push/PR na `master` - Pint (formatação), Larastan (análise estática) e a suíte de testes Pest. +- **Deploy** (`.github/workflows/deploy.yml`): só dispara ao criar uma tag no formato `v*.*.*`. Builda os assets, empacota a aplicação e publica via SSH/SCP na Hostinger. + +```bash +# Disparar um deploy em produção +git tag v1.0.0 +git push origin v1.0.0 +``` + ## Comunidades Parceiras Fazemos parte de uma rede de comunidades PHP do Nordeste: -| Comunidade | Estado | Link | -|------------|--------|------| -| **PHP-PB** | Paraíba | [php-pb.net](https://php-pb.net) | -| **PHP com Rapadura** | Ceará | [phpcomrapadura.org](https://phpcomrapadura.org) | -| **PHP-PE** | Pernambuco | - | -| **PHP-RN** | Rio Grande do Norte | - | +| Comunidade | Estado | +|------------|--------| +| **PHP-PB** | Paraíba | +| **PHP-PI** | Piauí | +| **PHP-MA** | Maranhão | +| **PHP com Rapadura** | Ceará | +| **PHP-PE** | Pernambuco | +| **PHP-RN** | Rio Grande do Norte | Juntos organizamos o **[PHPeste](https://phpeste.dev)** - a maior conferência PHP do Nordeste brasileiro! ## Links - [Site Oficial](https://php-pb.net) -- [Telegram](https://t.me/phppb) +- [WhatsApp](https://chat.whatsapp.com/JaWCta8t2DF9Af0zgIb8LB?mode=gi_t) - [GitHub](https://github.com/php-pb) - [Twitter/X](https://twitter.com/phppb) - [Facebook](https://www.facebook.com/groups/php.pb)