Skip to content

Commit

Permalink
- code improvements
Browse files Browse the repository at this point in the history
- added config
  • Loading branch information
toni-suarez committed Jun 20, 2024
1 parent e195132 commit ea79e4a
Show file tree
Hide file tree
Showing 4 changed files with 112 additions and 11 deletions.
2 changes: 1 addition & 1 deletion src/Middleware/UtmParameters.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class UtmParameters
public function handle(Request $request, Closure $next)
{
if ($this->shouldAcceptUtmParameter($request)) {
app(UtmParameter::class)->boot(session('utm'));
app(UtmParameter::class)->boot($request);
}

return $next($request);
Expand Down
3 changes: 3 additions & 0 deletions src/Providers/UtmParameterServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ class UtmParameterServiceProvider extends ServiceProvider
public function register()
{
$this->app->singleton(UtmParameter::class, fn () => new UtmParameter());
$this->mergeConfigFrom(__DIR__.'/../config/utm-parameter.php', 'utm-parameter');
}

/**
Expand All @@ -25,6 +26,8 @@ public function register()
*/
public function boot()
{
$this->publishes([__DIR__.'/../config/utm-parameter.php' => config_path('utm-parameter.php')]);

Blade::if('hasUtm', function (string $key, string|null $value = null) {
return has_utm($key, $value);
});
Expand Down
39 changes: 30 additions & 9 deletions src/UtmParameter.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

namespace Suarez\UtmParameter;

use Illuminate\Http\Request;

class UtmParameter
{
/**
Expand All @@ -19,20 +21,39 @@ public function __construct(array $parameters = [])
/**
* Bootstrap UtmParameter.
*
* @param array|string|null $parameters
* @param Request $request
*
* @return UtmParameter
*/
public function boot($parameters = null)
public function boot(Request $request)
{
if (!$parameters) {
$parameters = self::getParameter();
session(['utm' => $parameters]);
$this->parameters = $this->useRequestOrSession($request);
return $this;
}

/**
* Check which Parameters should be used.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function useRequestOrSession(Request $request)
{
$currentRequestParameter = self::getParameter($request);
$sessionParameter = session('utm');

if(!empty($currentRequestParameter) && empty($sessionParameter)) {
session(['utm' => $currentRequestParameter]);
return $currentRequestParameter;
}

$this->parameters = $parameters;
if(!empty($currentRequestParameter) && !empty($sessionParameter) && config('utm-parameter.override_utm_parameters')) {
$mergedParameters = array_merge($sessionParameter, $currentRequestParameter);
session(['utm' => $mergedParameters]);
return $mergedParameters;
}

return app(UtmParameter::class, $parameters);
return $sessionParameter;
}

/**
Expand Down Expand Up @@ -124,9 +145,9 @@ public static function clear()
*
* @return array
*/
protected static function getParameter()
protected static function getParameter(Request $request)
{
return collect(request()->all())
return collect($request->all())
->filter(fn ($value, $key) => substr($key, 0, 4) === 'utm_')
->map(fn ($value) => htmlspecialchars($value, ENT_QUOTES, 'UTF-8'))
->toArray();
Expand Down
79 changes: 78 additions & 1 deletion tests/UtmParameterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,17 @@

namespace Suarez\UtmParameter\Tests;

use Illuminate\Http\Request;
use Orchestra\Testbench\TestCase;
use Suarez\UtmParameter\UtmParameter;
use Illuminate\Support\Facades\Config;

class UtmParameterTest extends TestCase
{
public function setUp(): void
{
parent::setUp();
Config::set('utm-parameter.override_utm_parameters', false);

$parameters = [
'utm_source' => 'google',
Expand All @@ -19,8 +22,11 @@ public function setUp(): void
'utm_term' => '{targetid}',
];

$request = Request::create('/test', 'GET', $parameters);

app()->singleton(UtmParameter::class, fn () => new UtmParameter());
app(UtmParameter::class)->boot($parameters);
app(UtmParameter::class)->boot($request);
session(['utm' => $parameters]);
}

public function test_it_should_be_bound_in_the_app()
Expand Down Expand Up @@ -184,4 +190,75 @@ public function test_it_should_clear_and_remove_the_utm_parameter_again()
$emptySource = UtmParameter::get('source');
$this->assertNull($emptySource);
}

public function test_it_should_overwrite_new_utm_parameter()
{
Config::set('utm-parameter.override_utm_parameters', true);

$source = UtmParameter::get('source');
$this->assertEquals('google', $source);

$parameters = [
'utm_source' => 'newsletter',
'utm_medium' => 'email'
];

$request = Request::create('/test', 'GET', $parameters);
app(UtmParameter::class)->boot($request);

$source = UtmParameter::get('source');
$this->assertEquals('newsletter', $source);

$medium = UtmParameter::get('utm_medium');
$this->assertEquals('email', $medium);

$campaign = UtmParameter::get('campaign');
$this->assertEquals('{campaignid}', $campaign);
}

public function test_it_should_keep_existing_parameters()
{
Config::set('utm-parameter.override_utm_parameters', false);

$source = UtmParameter::get('source');
$this->assertEquals('google', $source);

$parameters = [
'id' => '0123456789',
'sorting' => 'relevance'
];

$request = Request::create('/test', 'GET', $parameters);
app(UtmParameter::class)->boot($request);

$source = UtmParameter::get('source');
$this->assertEquals('google', $source);

$medium = UtmParameter::get('utm_medium');
$this->assertEquals('cpc', $medium);

$campaign = UtmParameter::get('campaign');
$this->assertEquals('{campaignid}', $campaign);
}

public function test_it_should_keep_existing_parameters_while_browsing()
{
$source = UtmParameter::get('source');
$this->assertEquals('google', $source);

$parameters = ['id' => '0123456789', 'sorting' => 'relevance'];
$request = Request::create('/new-page', 'GET', $parameters);
app(UtmParameter::class)->boot($request);

$source = UtmParameter::get('source');
$this->assertEquals('google', $source);

$parameters = [];
$request = Request::create('/second-page', 'GET', $parameters);
app(UtmParameter::class)->boot($request);

$source = UtmParameter::get('source');
$this->assertEquals('google', $source);

}
}

0 comments on commit ea79e4a

Please sign in to comment.