diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b568d7a..cd7ee49 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - laravel: [8, 9] + laravel: [8, 9, 10] steps: - uses: actions/checkout@v2 diff --git a/composer.json b/composer.json index 02229b5..5c00cd4 100644 --- a/composer.json +++ b/composer.json @@ -24,14 +24,14 @@ }, "require": { "php": "^8.0", - "illuminate/support": "^8.24|^9.0", - "imliam/laravel-blade-helper": "^1.4" + "illuminate/support": "^8.24|^9.0|^10.0", + "illuminate/view": "^8.24|^9.0|^10.0" }, "require-dev": { - "orchestra/testbench": "^6.23|^7.0", - "nunomaduro/larastan": "^1.0", - "pestphp/pest": "^1.2", - "pestphp/pest-plugin-laravel": "^1.0", + "orchestra/testbench": "^6.23|^7.0|^8.0", + "nunomaduro/larastan": "^1.0|^2.4", + "pestphp/pest": "^1.2|^2.0", + "pestphp/pest-plugin-laravel": "^1.0|^2.0", "intervention/image": "^2.7" }, "extra": { diff --git a/phpstan.neon b/phpstan.neon index 2351e0b..ab9156f 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -13,7 +13,6 @@ parameters: checkMissingIterableValueType: false ignoreErrors: - # Waiting for https://github.com/phpstan/phpstan/issues/5706 - - '#^Cannot call method (flipp|previewify|get|set)\(\) on ArchTech\\SEO\\SEOManager\|array\|string\|null\.$#' - '#^Method ArchTech\\SEO\\SEOManager::flipp\(\) should return static\(ArchTech\\SEO\\SEOManager\)\|string but returns array\|string\|null\.$#' - '#^Method ArchTech\\SEO\\SEOManager::previewify\(\) should return static\(ArchTech\\SEO\\SEOManager\)\|string but returns array\|string\|null\.$#' + - '#^Method ArchTech\\SEO\\SEOManager::render\(\) has parameter \$args with no type specified\.$#' diff --git a/src/SEOManager.php b/src/SEOManager.php index 77a8114..3a7e1d0 100644 --- a/src/SEOManager.php +++ b/src/SEOManager.php @@ -5,6 +5,7 @@ namespace ArchTech\SEO; use Closure; +use Illuminate\Support\Arr; use Illuminate\Support\Str; /** @@ -323,6 +324,38 @@ public function __call(string $name, array $arguments): string|array|null|static return $this->get($key); } + /** Render blade directive. */ + public function render(...$args): array|string|null + { + // Flipp and Previewify support more arguments + if (in_array($args[0], ['flipp', 'previewify'], true)) { + $method = array_shift($args); + + return $this->{$method}(...$args); + } + + // Two arguments indicate that we're setting a value, e.g. `@seo('title', 'foo') + if (count($args) === 2) { + return $this->set($args[0], $args[1]); + } + + // An array means we don't return anything, e.g. `@seo(['title' => 'foo']) + if (is_array($args[0])) { + foreach ($args[0] as $type => $value) { + if (in_array($type, ['flipp', 'previewify'], true)) { + $this->{$type}(...Arr::wrap($value)); + } else { + $this->set($type, $value); + } + } + + return null; + } + + // A single value means we fetch a value, e.g. `@seo('title') + return $this->get($args[0]); + } + /** Handle magic get. */ public function __get(string $key): string|null { diff --git a/src/SEOServiceProvider.php b/src/SEOServiceProvider.php index 8a2ed89..dad6943 100644 --- a/src/SEOServiceProvider.php +++ b/src/SEOServiceProvider.php @@ -5,17 +5,14 @@ namespace ArchTech\SEO; use ArchTech\SEO\Commands\GenerateFaviconsCommand; -use Illuminate\Support\Arr; +use Illuminate\Support\Facades\Blade; use Illuminate\Support\ServiceProvider; -use ImLiam\BladeHelper\BladeHelperServiceProvider; -use ImLiam\BladeHelper\Facades\BladeHelper; class SEOServiceProvider extends ServiceProvider { public function register(): void { $this->app->singleton('seo', SEOManager::class); - $this->app->register(BladeHelperServiceProvider::class); } public function boot(): void @@ -32,34 +29,8 @@ public function boot(): void __DIR__ . '/../assets/views' => resource_path('views/vendor/seo'), ], 'seo-views'); - BladeHelper::directive('seo', function (...$args) { - // Flipp and Previewify support more arguments - if (in_array($args[0], ['flipp', 'previewify'], true)) { - $method = array_shift($args); - - return seo()->{$method}(...$args); - } - - // Two arguments indicate that we're setting a value, e.g. `@seo('title', 'foo') - if (count($args) === 2) { - return seo()->set($args[0], $args[1]); - } - - // An array means we don't return anything, e.g. `@seo(['title' => 'foo']) - if (is_array($args[0])) { - foreach ($args[0] as $type => $value) { - if (in_array($type, ['flipp', 'previewify'], true)) { - seo()->{$type}(...Arr::wrap($value)); - } else { - seo()->set($type, $value); - } - } - - return null; - } - - // A single value means we fetch a value, e.g. `@seo('title') - return seo()->get($args[0]); + Blade::directive('seo', function ($expression) { + return "render($expression); ?>"; }); } } diff --git a/tests/Pest/ExtensionTest.php b/tests/Pest/ExtensionTest.php index 0bb0911..b664ba7 100644 --- a/tests/Pest/ExtensionTest.php +++ b/tests/Pest/ExtensionTest.php @@ -1,9 +1,5 @@ all()) ->not()->toBeEmpty() diff --git a/tests/TestCase.php b/tests/TestCase.php index 9b1e3f0..73d1601 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -4,7 +4,6 @@ use Orchestra\Testbench\TestCase as TestbenchTestCase; use ArchTech\SEO\SEOServiceProvider; -use ImLiam\BladeHelper\BladeHelperServiceProvider; class TestCase extends TestbenchTestCase { @@ -12,7 +11,6 @@ protected function getPackageProviders($app) { return [ SEOServiceProvider::class, - BladeHelperServiceProvider::class, ]; } }