Add Schedule bundle
This commit is contained in:
parent
9ed1314762
commit
52f909da6d
|
@ -1,5 +1,6 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
use App\Schedule\SculpinScheduleBundle;
|
||||||
use App\Speakers\SculpinSpeakersBundle;
|
use App\Speakers\SculpinSpeakersBundle;
|
||||||
use Sculpin\Bundle\SculpinBundle\HttpKernel\AbstractKernel;
|
use Sculpin\Bundle\SculpinBundle\HttpKernel\AbstractKernel;
|
||||||
|
|
||||||
|
@ -8,6 +9,7 @@ class SculpinKernel extends AbstractKernel
|
||||||
protected function getAdditionalSculpinBundles(): array
|
protected function getAdditionalSculpinBundles(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
|
SculpinScheduleBundle::class,
|
||||||
SculpinSpeakersBundle::class,
|
SculpinSpeakersBundle::class,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,8 @@
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
"App\\Speakers\\": "src/Speakers/src"
|
"App\\Speakers\\": "src/Speakers/src",
|
||||||
|
"App\\Schedule\\": "src/Schedule/src"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload-dev": {
|
"autoload-dev": {
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Schedule\DependencyInjection;
|
||||||
|
|
||||||
|
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||||
|
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
|
||||||
|
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
|
||||||
|
use Symfony\Component\Config\FileLocator;
|
||||||
|
|
||||||
|
class SculpinScheduleExtension extends Extension
|
||||||
|
{
|
||||||
|
public function load(array $configs, ContainerBuilder $container)
|
||||||
|
{
|
||||||
|
$loader = new YamlFileLoader($container, new FileLocator(__DIR__ . '/../../'));
|
||||||
|
$loader->load('services.yml');
|
||||||
|
}
|
||||||
|
}
|
30
src/Schedule/src/Model/Session.php
Normal file
30
src/Schedule/src/Model/Session.php
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Schedule\Model;
|
||||||
|
|
||||||
|
use Tightenco\Collect\Support\Collection;
|
||||||
|
|
||||||
|
class Session
|
||||||
|
{
|
||||||
|
private $data;
|
||||||
|
|
||||||
|
public function __construct($data)
|
||||||
|
{
|
||||||
|
$this->data = $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getSlot(): int
|
||||||
|
{
|
||||||
|
return (int) $this->data['slot'];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTitle(): string
|
||||||
|
{
|
||||||
|
return $this->data['title'];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getSpeakers(): Collection
|
||||||
|
{
|
||||||
|
return collect($this->data['speakers']);
|
||||||
|
}
|
||||||
|
}
|
9
src/Schedule/src/SculpinScheduleBundle.php
Normal file
9
src/Schedule/src/SculpinScheduleBundle.php
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Schedule;
|
||||||
|
|
||||||
|
use Symfony\Component\HttpKernel\Bundle\Bundle;
|
||||||
|
|
||||||
|
class SculpinScheduleBundle extends Bundle
|
||||||
|
{
|
||||||
|
}
|
29
src/Schedule/src/TwigExtension/ScheduleExtension.php
Normal file
29
src/Schedule/src/TwigExtension/ScheduleExtension.php
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Schedule\TwigExtension;
|
||||||
|
|
||||||
|
use App\Schedule\Model\Session;
|
||||||
|
use Twig\Extension\AbstractExtension;
|
||||||
|
use Twig\TwigFunction;
|
||||||
|
|
||||||
|
class ScheduleExtension extends AbstractExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public function getFunctions()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
new TwigFunction('sessionInSlot', [$this, 'getSessionInSlot']),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getSessionInSlot(int $slotId, array $sessions): ?Session
|
||||||
|
{
|
||||||
|
return collect($sessions)->map(function ($session): ?Session {
|
||||||
|
return new Session($session);
|
||||||
|
})->first(function (?Session $session) use ($slotId): bool {
|
||||||
|
return $session->getSlot() == $slotId;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
38
src/Schedule/tests/ScheduleTest.php
Normal file
38
src/Schedule/tests/ScheduleTest.php
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Tests\Schedule;
|
||||||
|
|
||||||
|
use App\Schedule\Model\Session;
|
||||||
|
use App\Schedule\TwigExtension\ScheduleExtension;
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
class ScheduleTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var \App\Schedule\TwigExtension\ScheduleExtension
|
||||||
|
*/
|
||||||
|
private $extension;
|
||||||
|
|
||||||
|
protected function setUp(): void
|
||||||
|
{
|
||||||
|
parent::setUp();
|
||||||
|
|
||||||
|
$this->extension = new ScheduleExtension();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @test */
|
||||||
|
public function get_a_session_for_a_slot()
|
||||||
|
{
|
||||||
|
$sessions = [
|
||||||
|
['title' => 'The Real State of Drupal', 'slot' => 4],
|
||||||
|
['title' => 'Using Ansible for automation', 'slot' => 1],
|
||||||
|
['title' => 'Introduction to Views', 'slot' => 3],
|
||||||
|
['title' => 'Doing Good with Drupal', 'slot' => 2],
|
||||||
|
];
|
||||||
|
|
||||||
|
$session = $this->extension->getSessionInSlot(3, $sessions);
|
||||||
|
|
||||||
|
$this->assertInstanceOf(Session::class, $session);
|
||||||
|
$this->assertSame('Introduction to Views', $session->getTitle());
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue