Skip to content

Instantly share code, notes, and snippets.

@yuki777
Last active September 10, 2021 05:10
Show Gist options
  • Select an option

  • Save yuki777/87026e08a85b7fdbb9d9745215a1f53c to your computer and use it in GitHub Desktop.

Select an option

Save yuki777/87026e08a85b7fdbb9d9745215a1f53c to your computer and use it in GitHub Desktop.

Revisions

  1. yuki777 revised this gist Sep 10, 2021. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion bear-sunday-tutorial1-php8.bash
    Original file line number Diff line number Diff line change
    @@ -7,7 +7,7 @@ set -eux
    # composer create-project bear/skeleton MyVendor.Weekday
    # What is the vendor name ? MyVendor
    # What is the project name ? Weekday
    # wget https://gist.github.com/yuki777/87026e08a85b7fdbb9d9745215a1f53c/raw/1fe9db02fe35cf8681aa03c65b9dda4123339903/bear-sunday-tutorial1-php8.bash
    # wget https://gist.github.com/yuki777/87026e08a85b7fdbb9d9745215a1f53c/raw/abcfb3a2b0d557417e98bee1d95735b27996d660/bear-sunday-tutorial1-php8.bash
    # /bin/bash ./bear-sunday-tutorial1-php8.bash


  2. yuki777 revised this gist Sep 7, 2021. 1 changed file with 5 additions and 0 deletions.
    5 changes: 5 additions & 0 deletions bear-sunday-tutorial1-php8.bash
    Original file line number Diff line number Diff line change
    @@ -326,3 +326,8 @@ EOF

    # test => error
    php bin/app.php get /weekday/2011/05/23


    # test => OK
    # rm -fr var/tmp
    # php bin/app.php get /weekday/2011/05/23
  3. yuki777 revised this gist Sep 7, 2021. 1 changed file with 5 additions and 3 deletions.
    8 changes: 5 additions & 3 deletions bear-sunday-tutorial1-php8.bash
    Original file line number Diff line number Diff line change
    @@ -2,11 +2,13 @@

    set -eux

    ## Requirements
    #cd /tmp
    #composer create-project bear/skeleton MyVendor.Weekday
    ## Usage:
    # cd /tmp
    # composer create-project bear/skeleton MyVendor.Weekday
    # What is the vendor name ? MyVendor
    # What is the project name ? Weekday
    # wget https://gist.github.com/yuki777/87026e08a85b7fdbb9d9745215a1f53c/raw/1fe9db02fe35cf8681aa03c65b9dda4123339903/bear-sunday-tutorial1-php8.bash
    # /bin/bash ./bear-sunday-tutorial1-php8.bash


    # リソース
  4. yuki777 created this gist Sep 3, 2021.
    326 changes: 326 additions & 0 deletions bear-sunday-tutorial1-php8.bash
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,326 @@
    #!/bin/bash

    set -eux

    ## Requirements
    #cd /tmp
    #composer create-project bear/skeleton MyVendor.Weekday
    # What is the vendor name ? MyVendor
    # What is the project name ? Weekday


    # リソース
    cd /tmp
    cd MyVendor.Weekday
    mkdir -p src/Resource/App/
    $(cat << 'EOF' > src/Resource/App/Weekday.php
    <?php
    declare(strict_types=1);
    namespace MyVendor\Weekday\Resource\App;
    use BEAR\Resource\ResourceObject;
    use DateTimeImmutable;
    class Weekday extends ResourceObject
    {
    public function onGet(int $year, int $month, int $day): static
    {
    $dateTime =DateTimeImmutable::createFromFormat('Y-m-d', "$year-$month-$day");
    $weekday = $dateTime->format('D');
    $this->body = ['weekday' => $weekday];
    return $this;
    }
    }
    EOF
    )


    # テストコード
    mkdir -p tests/Resource/App
    $(cat << 'EOF' > tests/Resource/App/WeekdayTest.php
    <?php
    declare(strict_types=1);
    namespace MyVendor\Weekday\Resource\App;
    use BEAR\Resource\ResourceInterface;
    use MyVendor\Weekday\Injector;
    use PHPUnit\Framework\TestCase;
    class WeekdayTest extends TestCase
    {
    private ResourceInterface $resource;
    protected function setUp(): void
    {
    $injector = Injector::getInstance('app');
    $this->resource = $injector->getInstance(ResourceInterface::class);
    }
    public function testOnGet(): void
    {
    $ro = $this->resource->get('app://self/weekday', ['year' => '2001', 'month' => '1', 'day' => '1']);
    $this->assertSame(200, $ro->code);
    $this->assertSame('Mon', $ro->body['weekday']);
    }
    }
    EOF
    )


    # 例外作成
    mkdir -p src/Exception
    $(cat << 'EOF' > src/Exception/InvalidDateTime.php
    <?php
    declare(strict_types=1);
    namespace MyVendor\Weekday\Exception;
    use RuntimeException;
    class InvalidDateTime extends RuntimeException
    {
    }
    EOF
    )


    # App/Weekday
    $(cat << 'EOF' > src/Resource/App/Weekday.php
    <?php
    declare(strict_types=1);
    namespace MyVendor\Weekday\Resource\App;
    use BEAR\Resource\ResourceObject;
    use DateTimeImmutable;
    use MyVendor\Weekday\Exception\InvalidDateTime;
    class Weekday extends ResourceObject
    {
    public function onGet(int $year, int $month, int $day): static
    {
    $dateTime = DateTimeImmutable::createFromFormat('Y-m-d', "$year-$month-$day");
    if (! $dateTime instanceof DateTimeImmutable) {
    throw new InvalidDateTime("$year-$month-$day");
    }
    $weekday = $dateTime->format('D');
    $this->body = ['weekday' => $weekday];
    return $this;
    }
    }
    EOF
    )


    # テストコード
    mkdir -p tests/Resource/App
    $(cat << 'EOF' > tests/Resource/App/WeekdayTest.php
    <?php
    declare(strict_types=1);
    namespace MyVendor\Weekday\Resource\App;
    use BEAR\Resource\ResourceInterface;
    use MyVendor\Weekday\Injector;
    use PHPUnit\Framework\TestCase;
    class WeekdayTest extends TestCase
    {
    private ResourceInterface $resource;
    protected function setUp(): void
    {
    $injector = Injector::getInstance('app');
    $this->resource = $injector->getInstance(ResourceInterface::class);
    }
    public function testOnGet(): void
    {
    $ro = $this->resource->get('app://self/weekday', ['year' => '2001', 'month' => '1', 'day' => '1']);
    $this->assertSame(200, $ro->code);
    $this->assertSame('Mon', $ro->body['weekday']);
    }
    public function tesInvalidDateTime(): void
    {
    $this->expectException(InvalidDateTime::class);
    $this->resource->get('app://self/weekday', ['year' => '-1', 'month' => '1', 'day' => '1']);
    }
    }
    EOF
    )


    # Install aura router
    composer require bear/aura-router-module:'^2.0'


    # App module
    $(cat << 'EOF' > src/Module/AppModule.php
    <?php
    declare(strict_types=1);
    namespace MyVendor\Weekday\Module;
    use BEAR\Dotenv\Dotenv;
    use BEAR\Package\AbstractAppModule;
    use BEAR\Package\PackageModule;
    use BEAR\Package\Provide\Router\AuraRouterModule;
    use function dirname;
    class AppModule extends AbstractAppModule
    {
    protected function configure(): void
    {
    (new Dotenv())->load(dirname(__DIR__, 2));
    $appDir = $this->appMeta->appDir;
    $this->install(new AuraRouterModule($appDir . '/var/conf/aura.route.php'));
    $this->install(new PackageModule());
    }
    }
    EOF
    )


    # router file
    mkdir -p var/conf
    $(cat << 'EOF' > var/conf/aura.route.php
    <?php
    /**
    * @see http://bearsunday.github.io/manuals/1.0/ja/router.html
    * @var \Aura\Router\Map $map
    */
    $map->route('/weekday', '/weekday/{year}/{month}/{day}');
    EOF
    )


    # ここまではOK
    php bin/app.php get /weekday/1981/09/08


    # MyLoggerInterface
    $(cat << 'EOF' > src/MyLoggerInterface.php
    <?php
    declare(strict_types=1);
    namespace MyVendor\Weekday;
    interface MyLoggerInterface
    {
    public function log(string $message): void;
    }
    EOF
    )


    # リソース
    mkdir -p src/Resource/App/
    $(cat << 'EOF' > src/Resource/App/Weekday.php
    <?php
    namespace MyVendor\Weekday\Resource\App;
    use BEAR\Resource\ResourceObject;
    use MyVendor\Weekday\MyLoggerInterface;
    class Weekday extends ResourceObject
    {
    public function __construct(public MyLoggerInterface $logger)
    {
    }
    public function onGet(int $year, int $month, int $day) : ResourceObject
    {
    $weekday = \DateTime::createFromFormat('Y-m-d', "$year-$month-$day")->format('D');
    $this->body = [
    'weekday' => $weekday
    ];
    $this->logger->log("$year-$month-$day {$weekday}");
    return $this;
    }
    }
    EOF
    )


    # MyLogger実装
    $(cat << 'EOF' > src/MyLogger.php
    <?php
    declare(strict_types=1);
    namespace MyVendor\Weekday;
    use BEAR\AppMeta\AbstractAppMeta;
    use function error_log;
    use const PHP_EOL;
    class MyLogger implements MyLoggerInterface
    {
    private string $logFile;
    public function __construct(AbstractAppMeta $meta)
    {
    $this->logFile = $meta->logDir . '/weekday.log';
    }
    public function log(string $message): void
    {
    error_log($message . PHP_EOL, 3, $this->logFile);
    }
    }
    EOF
    )


    # App module
    $(cat << 'EOF' > src/Module/AppModule.php
    <?php
    declare(strict_types=1);
    namespace MyVendor\Weekday\Module;
    use BEAR\Dotenv\Dotenv;
    use BEAR\Package\AbstractAppModule;
    use BEAR\Package\PackageModule;
    use BEAR\Package\Provide\Router\AuraRouterModule;
    use MyVendor\Weekday\MyLogger;
    use MyVendor\Weekday\MyLoggerInterface;
    use function dirname;
    class AppModule extends AbstractAppModule
    {
    protected function configure(): void
    {
    (new Dotenv())->load(dirname(__DIR__, 2));
    $appDir = $this->appMeta->appDir;
    $this->install(new AuraRouterModule($appDir . '/var/conf/aura.route.php'));
    $this->bind(MyLoggerInterface::class)->to(MyLogger::class);
    $this->install(new PackageModule());
    }
    }
    EOF
    )


    # test => error
    php bin/app.php get /weekday/2011/05/23