{"id":38653557,"url":"https://github.com/tolik518/blog.returnnull.de","last_synced_at":"2026-01-17T09:24:42.981Z","repository":{"id":105033445,"uuid":"495076591","full_name":"tolik518/blog.returnnull.de","owner":"tolik518","description":"Source code of blog.returnnull.de","archived":false,"fork":false,"pushed_at":"2025-11-09T23:42:25.000Z","size":856,"stargazers_count":2,"open_issues_count":10,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-12-07T22:21:25.789Z","etag":null,"topics":["blog","hacktoberfest","hacktoberfest-accepted","hacktoberfest2023"],"latest_commit_sha":null,"homepage":"https://blog.returnnull.de/","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tolik518.png","metadata":{"files":{"readme":"README.MD","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2022-05-22T14:01:29.000Z","updated_at":"2023-10-29T11:43:26.000Z","dependencies_parsed_at":"2023-12-01T09:39:02.405Z","dependency_job_id":null,"html_url":"https://github.com/tolik518/blog.returnnull.de","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/tolik518/blog.returnnull.de","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tolik518%2Fblog.returnnull.de","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tolik518%2Fblog.returnnull.de/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tolik518%2Fblog.returnnull.de/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tolik518%2Fblog.returnnull.de/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tolik518","download_url":"https://codeload.github.com/tolik518/blog.returnnull.de/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tolik518%2Fblog.returnnull.de/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28505486,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-17T06:57:29.758Z","status":"ssl_error","status_checked_at":"2026-01-17T06:56:03.931Z","response_time":85,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blog","hacktoberfest","hacktoberfest-accepted","hacktoberfest2023"],"created_at":"2026-01-17T09:24:42.199Z","updated_at":"2026-01-17T09:24:42.938Z","avatar_url":"https://github.com/tolik518.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# blog.returnnull.de\n\nThis is the source code behind [blog.returnnull.de](https://blog.returnnull.de).\n\n#### Tech Stack\n[![php](code/public/img/stack/php.png)](https://www.php.net/manual/de/intro-whatis.php)\n[![PHPUnit](code/public/img/stack/phpunit.png)](https://phpunit.de/)\n[![Composer](code/public/img/stack/composer.png)](https://getcomposer.org/)\n[![MySQL](code/public/img/stack/mysql.png)](https://dev.mysql.com/doc/refman/8.0/en/what-is-mysql.html)\n[![HTML](code/public/img/stack/html.png)](https://developer.mozilla.org/de/docs/Learn/Getting_started_with_the_web/HTML_basics)\n[![SASS](code/public/img/stack/sass.png)](https://sass-lang.com/)\n[![Docker](code/public/img/stack/docker.png)](https://docs.docker.com/get-started/overview/)\n[![Docker-Compose](code/public/img/stack/docker-compose.png)](https://docs.docker.com/compose/)\n[![Nginx](code/public/img/stack/nginx.png)](https://www.nginx.com/)\n[![PHPStorm](code/public/img/stack/phpstorm.png)](https://www.jetbrains.com/de-de/phpstorm/)\n[![Git](code/public/img/stack/git.png)](https://git-scm.com/)\n\n\n#### How to Start Development\n* clone repository\n* build images with `make build` or with `docker compose build` \n* use `make run` or `docker-compose up -d` to start the containers\n    * to install the dependencies and to update the autoloader (do this everyime you add a new class) `make install` or `docker-compose -f docker/compose/docker-compose-cli.yml run --rm --no-deps php_cli php -d memory_limit=-1 /usr/local/bin/composer install`\n* use `make stop` or `docker-compose down --remove-orphans` to stop the containers\n\n### Access Admin Panel\n* go to http://localhost/admin\n* login with username `tolik518` and password `tolik518`\n\n#### How to execute PHPUnit-Tests\n* `make unit_test`\n* if you want to see the coverage in PHPStorm then follow these steps:\n    * Go to the menu bar in PHPStorm at the top\n    * Go to `Run` -\u003e `Show Coverage Data` or press `Strg + Alt + 6` -\u003e `+`\n    * then choose `(projectfolder)/code/tests/reports/phpunit.coverage.xml` and press `OK` and `show selected`\n\n### Defining new page in the app\n\n#### Add a new page class\n\nInside src/Page define a new class that implements Page interface, here minimal example:\n\n```php\n\u003c?php\n\n// src/Page/HelloPage.php\n\nnamespace Returnnull;\n\nclass HelloPage implements Page\n{\n    public function run(Request $request): Response\n    {\n        return new Response('Hello World!');\n    }\n\n    // define the regexes that should be supported by this page\n    public function getSupportedUrlRegexes(): array\n    {\n        return [\n            '/^\\/hello$/',\n        ];\n    }\n\n    // optional, define if this page should be protected by the login system, by default it is not protected\n    public function isProtected(): bool\n    {\n        return false;\n    }\n}\n```\n\n**Remeber to always run `make install` or `docker-compose -f docker/compose/docker-compose-cli.yml run --rm --no-deps php_cli php -d memory_limit=-1 /usr/local/bin/composer install` to update the autoloader.**\n\n#### Page with dependencies\n\nIf your page have dependencies, than you have to define creator function in the `PageFactory` class. Here is an example:\n\nFirst we create page with dependencies:\n\n```php\n\u003c?php\n\n// src/Page/HelloPageWithDeps.php\n\nnamespace Returnnull;\n\nclass HelloPageWithDeps implements Page\n{\n    public function __construct(\n        private SessionManager $sessionManager,\n    ) {\n    }\n\n    ...\n}\n```\n\nthen in PageFactory add support for the page:\n\n```php\n\u003c?php\n\n// src/Factories/PageFactory.php\n\nnamespace Returnnull;\n\nclass PageFactory\n{\n    ...\n\n    public function create(string $pageClassName): Page\n    {\n        $pageName = $this-\u003egetPageNameFromClass($pageClassName);\n\n        switch ($pageName) {\n            case 'HelloPageWithDeps':\n                return $this-\u003ecreateHelloPageWithDeps();\n            default:\n                return $this-\u003etryToGetFallbackPage($pageName);\n        }\n    }\n\n    ...\n\n    private function createHelloPageWithDeps(): HelloPageWithDeps\n    {\n        return new HelloPageWithDeps(\n            $this-\u003esessionManager,\n        );\n    }\n}\n```\n\n\u003c!--\n    TODO: Tag-System im Admin Bereich\n    TODO: Klickbare Tags -\u003e Tag-Page/Projector\n    TODO: Artikelvorschläge auf Grund von Tags\n\n    TODO: Head Modulieren\n\n    TODO: Analytics PLUS\n    TODO: Anti-Spam gegen Spammer\n\n    TODO: https://developers.google.com/search/docs/advanced/structured-data/article\n\n    TODO: \u003clink rel=\"alternate\" type=\"application/rss+xml\" title=\"RSS\" href=\"http://blog.returnnull.de/feed.rss\" /\u003e\n    TODO: Sitemap\n    TODO: security.txt\n    TODO: _badwords.txt\n    TODO: https://en.wikipedia.org/wiki/Well-known_URI lesen und umsetzten\n    TODO: meta data \u0026 SEO\n    TODO: Add (google) search appearance\n    TODO: apple-touch-icon.png https://www.elmastudio.de/ein-apple-touch-icon-fur-die-eigene-webseite-erstellen/\n                             - https://webhint.io/docs/user-guide/hints/hint-apple-touch-icons/\n    TODO: Social media formatting/Link preview (FB, Twitter, Telegram)\n          - https://developers.facebook.com/docs/sharing/webmasters#markup\n          - https://developer.twitter.com/docs/twitter-for-websites/cards/overview/markup\n--\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftolik518%2Fblog.returnnull.de","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftolik518%2Fblog.returnnull.de","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftolik518%2Fblog.returnnull.de/lists"}