fix(core,board,page,ecommerce,basic,pay): FULLTEXT 게이트·검색 실패 표면화와 페이지네이션/접두사 결함 정비

- 공개 : MATCH 는 커버 인덱스가 있을 때만 조립 — 부재 시 LIKE 폴백 + 1회 경고,
 카테고리 검색 예외를 categories_failed/search_failed 로 표면화하고 basic 템플릿이 오류 안내 렌더
- 공개 동근원: paginate page 명시 전달 (언어팩 check-updates, 상품 문의 목록)
- 공개 동근원: raw SQL 접두사/별칭 하드코딩 정리 (board 시더, 7.0.6 업그레이드 스텝,
 결제 3플러그인 컨트롤러 51지점 모델 파생 전환)
- audit 룰 3종 신설 + repository-raw-hardcoded-table 컨트롤러 확대, 확장 TestCase
 오토로더 중복 선언 가드 16지점, ja 언어팩 동기
This commit is contained in:
HeuJung committed 2026-08-17 03:02:26 +09:00
1 parent 3ccfb24417
commit 7f457a05b3
77 files changed
+2578 -526

No files matched your search

@@ -3,6 +3,7 @@
namespace Modules\Gnuboard7\HelloModule\Tests;
use App\Enums\ExtensionStatus;
use App\Extension\HookManager;
use App\Models\Module;
use App\Models\Permission;
use App\Models\Role;
@@ -10,6 +11,7 @@ use App\Models\User;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Schema;
use Modules\Gnuboard7\HelloModule\Providers\HelloModuleServiceProvider;
use Tests\TestCase;
/**
@@ -52,7 +54,7 @@ abstract class ModuleTestCase extends TestCase
$this->registerModuleAutoload();
$this->app->register(\Modules\Gnuboard7\HelloModule\Providers\HelloModuleServiceProvider::class);
$this->app->register(HelloModuleServiceProvider::class);
$this->runModuleMigrationIfNeeded();
@@ -80,7 +82,7 @@ abstract class ModuleTestCase extends TestCase
*/
private function snapshotHookManager(): void
{
$ref = new \ReflectionClass(\App\Extension\HookManager::class);
$ref = new \ReflectionClass(HookManager::class);
$this->hookSnapshot = [
'hooks' => $ref->getProperty('hooks')->getValue(),
'filters' => $ref->getProperty('filters')->getValue(),
@@ -97,7 +99,7 @@ abstract class ModuleTestCase extends TestCase
return;
}
$ref = new \ReflectionClass(\App\Extension\HookManager::class);
$ref = new \ReflectionClass(HookManager::class);
$ref->getProperty('hooks')->setValue(null, $this->hookSnapshot['hooks']);
$ref->getProperty('filters')->setValue(null, $this->hookSnapshot['filters']);
$ref->getProperty('dispatching')->setValue(null, $this->hookSnapshot['dispatching']);
@@ -153,8 +155,12 @@ abstract class ModuleTestCase extends TestCase
$file = $moduleBasePath.'/src/'.str_replace('\\', '/', $relativeClass).'.php';
}
if (file_exists($file)) {
require $file;
if (file_exists($file)
&& ! class_exists($class, false) && ! interface_exists($class, false)
&& ! trait_exists($class, false) && ! enum_exists($class, false)) {
// 활성 디렉토리 사본이 이미 로드된 심볼을 다시 선언하면 fatal 이 된다 —
// 선언 여부를 자체 확인하고 require_once 로 이중 방어한다
require_once $file;
}
});
}
@@ -221,12 +227,12 @@ abstract class ModuleTestCase extends TestCase
'version' => '0.1.0-beta.1',
]);
$hookManager = app(\App\Extension\HookManager::class);
$hookManager = app(HookManager::class);
foreach ($module->getHookListeners() as $listenerClass) {
foreach ($listenerClass::getSubscribedHooks() as $hookName => $config) {
$method = is_array($config) ? ($config['method'] ?? 'handle') : 'handle';
$priority = is_array($config) ? ($config['priority'] ?? 10) : 10;
$hookManager->addAction($hookName, [new $listenerClass(), $method], $priority);
$hookManager->addAction($hookName, [new $listenerClass, $method], $priority);
}
}
}