{"id":16464343,"url":"https://github.com/zhorton34/authorize-slim-4","last_synced_at":"2025-03-16T18:31:27.794Z","repository":{"id":38156347,"uuid":"241011893","full_name":"zhorton34/authorize-slim-4","owner":"zhorton34","description":"Slim 4 Authorization Tutorial","archived":false,"fork":false,"pushed_at":"2023-04-19T19:33:45.000Z","size":4696,"stargazers_count":91,"open_issues_count":11,"forks_count":47,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-02-27T12:08:32.508Z","etag":null,"topics":["authentication","dotenv","illuminate-validation","laravel-mix","php","phpauth","phpauthentication","slim","slim-framework","slim-micro-framework","slim4","slim4authentication","slimconsole","slimphp","slimsecurity","slimserver","symfony-console","vue","vuejs","whoops-error-handler"],"latest_commit_sha":null,"homepage":"https://www.youtube.com/playlist?list=PLNuh5_K9dfQ38pmas4Y3TEEHLMRkt9qh2","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zhorton34.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-02-17T03:31:31.000Z","updated_at":"2025-02-14T16:38:51.000Z","dependencies_parsed_at":"2023-01-17T17:16:06.836Z","dependency_job_id":null,"html_url":"https://github.com/zhorton34/authorize-slim-4","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhorton34%2Fauthorize-slim-4","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhorton34%2Fauthorize-slim-4/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhorton34%2Fauthorize-slim-4/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhorton34%2Fauthorize-slim-4/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zhorton34","download_url":"https://codeload.github.com/zhorton34/authorize-slim-4/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243826788,"owners_count":20354220,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["authentication","dotenv","illuminate-validation","laravel-mix","php","phpauth","phpauthentication","slim","slim-framework","slim-micro-framework","slim4","slim4authentication","slimconsole","slimphp","slimsecurity","slimserver","symfony-console","vue","vuejs","whoops-error-handler"],"created_at":"2024-10-11T11:27:13.977Z","updated_at":"2025-03-16T18:31:25.884Z","avatar_url":"https://github.com/zhorton34.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Twitter Follow](https://img.shields.io/twitter/follow/cleancodestudio.svg?style=social)](https://twitter.com/cleancodestudio) \n[Clean Code Studio](https://cleancode.studio)\n\n# Authentication With Slim 4 (And much, much more)\nSlim 4 Authentication Tutorial\n\n## Documentation Sections\n - [Installation](https://github.com/zhorton34/authorize-slim-4#installation)\n - [Console Commands](https://github.com/zhorton34/authorize-slim-4#list-slim-console-commands)\n - [Migrate \u0026 Seed Database](https://github.com/zhorton34/authorize-slim-4#migrate-and-seed-database)\n - [Register Middleware](https://github.com/zhorton34/authorize-slim-4#register-middleware)\n - [Register Console Commands](https://github.com/zhorton34/authorize-slim-4#create-and-register-new-php-slim-command)\n - [php slim make:{scaffold} generators](https://github.com/zhorton34/authorize-slim-4#php-slim-makecommand-scaffold-stub-generators)\n   - `php slim make:command (Scaffold New Console Command)`\n   - `php slim make:controller (Scaffold new Controller)`\n   - `php slim make:factory (Scaffold new Factory)`\n   - `php slim make:middleware (Scaffold new Middleware)`\n   - `php slim make:migration (Scaffold new migration)`\n   - `php slim make:model (Scaffold new Eloquent Model)`\n   - `php slim make:provider(Scaffold new Service Provider)`\n   - `php slim make:request (Scaffold new FormRequest Validator)`\n   - `php slim make:seeder (Scaffold new database seeder)`\n   - `php slim make:event (Scaffold event class)`\n   - `php slim make:listener (Scaffold event listener class)`\n   - `php slim make:view (Scaffold View files)`\n   - `php slim make:trait (Scaffold new Trait file)` \n- [Global Helper Functions](https://github.com/zhorton34/authorize-slim-4#global-helper-functions)\n- [Validators](https://github.com/zhorton34/authorize-slim-4#validatorinput-rules---messages--)\n- [Mailables](https://github.com/zhorton34/authorize-slim-4/blob/master/README.md#mailables-send-emails)\n- [Events And Listeners](https://github.com/zhorton34/authorize-slim-4/blob/master/README.md#events-events--associated-listeners-with-dependency-injection)\n- [Packages \u0026 Resources Glossary](https://github.com/zhorton34/authorize-slim-4#packages--resources-glossary)\n\n# Installation\n\n### Dependencies\n - Vagrant\n - VirtualBox or other available vagrant virtual machine provider\n\n\n1. Clone, enter, and determine the path the application\n```\ngit clone https://github.com/zhorton34/authorize-slim-4.git\n\ncd authorize-slim-4\n\npwd\n```\n\n2. Copy output from `pwd` command (Full path to present working directory)\n\n3. Open `authorize-slim-4/homestead.yaml` and update folders map path (Has comment next to it below)\n```\nip: 192.168.10.10\nmemory: 2048\ncpus: 2\nprovider: virtualbox\nauthorize: ~/.ssh/id_rsa.pub\nkeys:\n    - ~/.ssh/id_rsa\nfolders:\n    -\n       # Replace `map: /Users/zhorton/tutorials/authorize-slim-4`\n       # With `map: {the_copied_output_from_pwd_in_step_2}\n        map: /Users/zhorton/tutorials/authorize-slim-4\n        ## map Update with path you cloned the repository on your machine\n        to: /home/vagrant/code\nsites:\n    -\n        map: slim.auth\n        to: /home/vagrant/code/public\ndatabases:\n    - slim\nfeatures:\n    -\n        mariadb: false\n    -\n        ohmyzsh: false\n    -\n        webdriver: false\nname: authorize-slim-4\nhostname: authorize-slim-4\n```\n\n4. Save and close homestead.yaml\n\n5. Run `vagrant up --provision` to boot up your virtual machine\n\n6. Once booted, open up your localmachine's host file (sudo vim /etc/hosts on linux or mac)\n\n7. Add slim.auth\n\n8. Boot up the vagrant virtual\n```\n  vagrant up --provision\n```\n\n9. Open your localmachines `host` file (sudo vim /etc/hosts on linux and mac)\n\n10. Add `slim.auth` and the ip defined in the homestead.yaml\n (Example below, shouldn't need to change from example)\n```\n##\n# Host Database\n#\n# localhost is used to configure the loopback interface\n# when the system is booting.  Do not change this entry.\n##\n127.0.0.1\tlocalhost\n255.255.255.255\tbroadcasthost\n::1             localhost\n\n###########################\n# Homestead Sites (Slim 4)\n###########################\n192.168.10.10   slim.auth\n```\n\n11. Close and save hosts file\n\n12. Test out `http://slim.auth/` in your browser\n(Make sure vagrant has properly finished booting from step 8)\n\n13. `cd` back into `authorize-slim-4` within your terminal\n\n14. Run `vagrant ssh`\n\n15. Once ssh'd into your virtual machine, run\n```\ncd code \u0026\u0026 cp .env.example .env \u0026\u0026 composer install \u0026\u0026 npm install\n```\n\n===\n\n## List Slim Console Commands\n\n1. Run `php slim` from project root\n\n```\nsole Tool\n\nUsage:\n  command [options] [arguments]\n\nOptions:\n  -h, --help            Display this help message\n  -q, --quiet           Do not output any message\n  -V, --version         Display this application version\n      --ansi            Force ANSI output\n      --no-ansi         Disable ANSI output\n  -n, --no-interaction  Do not ask any interactive question\n  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug\n\nAvailable commands:\n  help              Displays help for a command\n  list              Lists commands\n  tinker            \n db\n  db:fresh          Drop all database table and re-migrate, then re-seed all tables\n  db:migrate        Migration migrations to database\n  db:seed           Run Database Seeders\n  db:show           Show all of your models/table records in a table for display\n error-logs\n  error-logs:clear  Remove Errors Logs Rendered Templates\n make\n  make:command      Generate Command Scaffold\n  make:controller   description text for console command\n  make:factory      Scaffold new factory command\n  make:middleware   Generate or make Scaffold for new http middleware class\n  make:migration    Make or scaffolded new migration for our database\n  make:model        Generate The Scaffold For An Eloquent Model\n  make:provider     Scaffold new Service Provider\n  make:request      Generate Form Request Validation Scaffold\n  make:seeder       Generate a database seeder scaffold\n  make:event        Generate event scaffold\n  make:listener     Generate listener scaffold\n  make:trait        Create a new trait\n  make:view         Generate view Scaffold\n migrate\n  migrate:rollback  Rollback Previous Database Migration\n view\n  view:clear        Remove Cache For View Templates\n```\n\n\n\n## Migrate and Seed Database\n1. `vagrant ssh`\n2. `cd code`\n3. `php slim db:migrate`\n4. `php slim db:seed`\n\n\n## Show database table example\n1. `vagrant ssh`\n2. `cd code`\n3. `php slim db:show users`\n\n\n## Register Middleware\n1. Create Middleware Class (Example: `\\App\\Http\\Middleware\\RouteGuardMiddleware::class`)\n2. Open `authorize-slim-4/app/Http/HttpKernel`\n3. Add \\App\\Http\\Middleware\\RouteGuardMiddleware::class to a specific route group or globally\n```\nclass HttpKernel extends Kernel\n{\n    /**\n     * Global Middleware\n     *\n     * @var array\n     */\n    public array $middleware = [\n//        Middleware\\ExampleAfterMiddleware::class,\n//        Middleware\\ExampleBeforeMiddleware::class\n    ];\n\n    /**\n     * Route Group Middleware\n     */\n    public array $middlewareGroups = [\n        'api' =\u003e [],\n        'web' =\u003e [\n            Middleware\\RouteContextMiddleware::class,\n            'csrf'\n        ]\n    ];\n}\n```\n\n## Create and Register new `php slim` command\n1. Add new ExampleCommand.php File and class at app/console/commands/ExampleCommand.php\n2. Define Command name, description, arguments, and handler within class\n```\nclass ExampleCommand extends Command\n{\n    protected $name = 'example:command';\n    protected $help = 'Example Command For Readme';\n    protected $description = 'Example Command For Readme';\n\n    public function arguments()\n    {\n        return [\n            'hello' =\u003e $this-\u003erequired('Description for this required command argument'),\n            'world' =\u003e $this-optional('Description for this optional command argument', 'default')\n        ];\n    }\n\n    public function handler()\n    {\n        /** Collect Console Input **/\n        $all_arguments = $this-\u003einput-\u003egetArguments();\n        $optional_argument = $this-input-\u003egetArgument('world');\n        $required_argument = $this-\u003einput-\u003egetArgument('hello');\n\n        /** Write Console Output **/\n        $this-\u003ewarning(\"warning output format\");\n        $this-\u003einfo(\"Success output format\");\n        $this-\u003ecomment(\"Comment output format\");\n        $this-\u003eerror(\"Uh oh output format\");\n    }\n}\n```\n3. Open app\\console\\ConsoleKernel.php\n4. Add ExampleCommand::class to Registered Commands\n```\n\u003c?php\n\nnamespace App\\Console;\n\nuse Boot\\Foundation\\ConsoleKernel as Kernel;\n\nclass ConsoleKernel extends Kernel\n{\n    public array $commands = [\n        Commands\\ExampleCommand::class, // Registered example command\n        Commands\\ViewClearCommand::class,\n        Commands\\MakeSeederCommand::class,\n        Commands\\DatabaseRunSeeders::class,\n        Commands\\DatabaseFreshCommand::class,\n        Commands\\MakeMigrationCommand::class,\n        Commands\\DatabaseMigrateCommand::class,\n        Commands\\DatabaseTableDisplayCommand::class,\n        Commands\\DatabaseRollbackMigrationCommand::class\n    ];\n}\n\n```\n\n## `php slim make:{command}` Scaffold Stub Generators\n\n1. Available Generator Commands\n```\n  php slim make:command {ExampleConsoleCommand}      Generate Command Scaffold\n  php slim make:controller {Example} description text for console command\n  php slim make:factory {ExampleFactory}      Scaffold new factory command\n  php slim make:middleware {ExampleMiddleware} Generate or make Scaffold for new http middleware class\n  php slim make:migration {CreateExamplesTable   Make or scaffolded new migration for our database\n  php slim make:model {Example}        Generate The Scaffold For An Eloquent Model\n  php slim make:provider {ExampleServiceProvider}     Scaffold new Service Provider\n  php slim make:request {ExampleFormRequest}     Generate Form Request Validation Scaffold\n  php slim make:seeder {ExamplesTableSeeder}       Generate a database seeder scaffold\n```\n\n2. Scaffold Generator Stubs (Dummy Files)\n   - `resources/stubs`\n  \n3. Scaffold Configuration\n   - `config/stubs.php`\n\n## Global Helper Functions\n/*\n * event\n * old\n * back\n * session\n * validator\n * asset\n * redirect\n * collect\n * factory\n * env\n * base_path\n * config_path\n * resources_path\n * public_path\n * routes_path\n * storage_path\n * app_path\n * dd (die and dump)\n * throw_when\n * class_basename\n * config\n * data_get\n * data_set\n */\n \n #### old($input_name)\n - Used within blade to populate old input data when form validation fails\n\n**Example** \n```\n\u003cform\u003e\n  @csrf\n  \u003cinput type='text' name='first_name' value='{{ old('first_name') }}' /\u003e\n\u003c/form\u003e\n```\n\n\n#### back()\n- Redirect user back to previous page\n\n**Example**\n```\nExampleController \n{\n   index()\n   {\n      return back();\n   }\n}\n```\n\n#### event()\n- Set up events and event listeners \n\n```\nevent()-\u003elisten('flash.success', fn ($message) =\u003e session()-\u003eflash()-\u003eadd('success', $message);\n\nevent()-\u003efire('flash.success', ['Way to go, it worked!']);\n```\n\n**Alternatively, you can use the slim scaffold to set up event and listener classes** \n`php slim make:event ExampleEvent`\n- creates App/Events/ExampleEvent\n`php slim make:listener ExampleListener`\n- create App/Listeners/ExampleListener\n\n**Register Class Event \u0026 Listeners in `config/events.php`**\n``` \nreturn [\n   'events' =\u003e [\n      ExampleEvent::class =\u003e [\n          ExampleListener::class,\n          ExampleListenerTwo::class,\n          ExampleListenerThree::class\n      ],\n      ResetUserPasswordEvent::class =\u003e [\n          GenerateResetPasswordKey::class,\n          SendUserResetPasswordEmail::class,\n      ]\n   ]\n];\n```\n\n**Finally trigger the associated event**\n```\n// Fire event using dependency injection\nevent()-\u003efire(ExampleEvent::class);\n\n// Fire event overriding default depency injections\nevent()-\u003efire(ExampleEvent::class, [\n   // parameterOne\n   // parameterTwo\n]);\n```\n\n#### session()\n- Session (Using Syfony Session Component)\n\n**Example**\n```\n// Flash to session to only remember for the proceeding request\nsession()-\u003eflash()-\u003eset('success', ['Successful Form Submission!']);\nsession()-\u003eflash()-\u003eset('errors', ['Name field failed', 'Email field failed']);\n\n// Set directly to session to remember for several requests\nsession()-\u003eset('remember_in_session_for_multiple_requests', ['remember me']);\n```\n\n#### validator($input, $rules = [], $messages = [])\n- Validator (Using Laravel Validators)\n\n**Example**\n```\n$input = [\n   'first_name' =\u003e 'John',\n   'last_name' =\u003e 'Joe',\n   'email' =\u003e 'john.joe@example.com'\n];\n\n$rules = [\n   'first_name' =\u003e 'required|string',\n   'last_name' =\u003e 'required|string|max:50',\n   'email' =\u003e 'required|email|max:50|unique:users,email'\n];\n\n$messages = [\n    'first_name.required' =\u003e 'First name is a required field',\n    'first_name.string' =\u003e 'First name must be a string field',\n    'last_name.required' =\u003e 'Last name must is a required field',\n    'last_name.string' =\u003e 'Last name must be a string field',\n    'email.email' =\u003e 'Email must be in the proper email format',\n    'email.unique' =\u003e 'Email already taken, no duplicate emails allowed',\n    'email.required' =\u003e 'Email is required',\n];\n\n$validation = validator($input, $rules, $messages);\n\nif ($validation-\u003efails()) {\n   session()-\u003eflash()-\u003eset('errors', $validation-\u003eerrors()-\u003egetMessages());\n   \n   return back();\n}\n\nif ($validation-\u003epasses() {\n   session()-\u003eflash()-\u003eset('success', 'Successfully Submitted Form and Passed Validation');\n\n   return redirect('/home');\n}\n```\n\n\n## Mailables (Send Emails)\n\n1. @see `\\Boot\\Foundation\\Mail\\Mailable`\n**Example**\n```\nclass ExampleController\n{\n   public function send(\\Boot\\Foundation\\Mail\\Mailable $mail, $response)\n   {\n       $user = \\App\\User::first();\n       \n       $success = $mail-\u003eview('mail.auth.reset', ['url' =\u003e 'https://google.com'])\n            -\u003eto($user-\u003eemail, $user-\u003efirst_name)\n            -\u003efrom('admin@slim.auth', 'Slim Authentication Admin')\n            -\u003esubject('Reset Password')\n            -\u003esend();\n\n       $response-\u003egetBody()-\u003ewrite(\"Successfully sent Email: {$success}\");\n\n       return $response;\n   }\n}\n```\n\n## Events (Events \u0026 associated listeners with dependency injection)\n**Example One**\n- Set up events and event listeners using the global event helper function \n_NOTE: (This example show's an easy setup, but example two is considered better architecture)_  \n\n```\n// App\\Providers\\EventServiceProvider boot method()\n\nevent()-\u003elisten('flash.success', fn ($message) =\u003e session()-\u003eflash()-\u003eadd('success', $message);\n\nevent()-\u003efire('flash.success', [\n   'Way to go, it worked!'\n]);\n```\n\n**Example Two: Event \u0026 Listener Classes** \n1. `php slim make:event UserLogin`\n2. Open `App/Events/UserLogin.php`\n3. Use the `UserLogin.php` event `__construct` to build or \"construct\" the event payload\n```\n\u003c?php\n\nnamespace App\\Events;\n\nuse App\\Support\\Auth;\nuse Boot\\Foundation\\Http\\Session;\n\nclass ExampleEvent\n{\n    public $user;\n    public $session;\n\n    public function __construct(Session $session)\n    {\n        $this-\u003euser = Auth::user();\n        $this-\u003esession = $session;\n\n        return $this;\n    }\n}\n```\n\n4. `php slim make:listener FlashWelcomeBackMessage`\n5. Open `App/Listeners/FlashWelcomeBackMessage`\n6. Handle the event payload in the Listener `__invoke` method\n```\n\u003c?php\n\nnamespace App\\Listeners;\n\nuse App\\Events\\UserLogin;\n\nclass FlashWelcomeBackMessage\n{\n   public function __invoke(UserLogin $event)\n   {\n      $event-\u003esession-\u003eflash()-\u003eadd('success', \"Welcome Back {$event-\u003euser-\u003efirst_name}!\"); \n   }\n\n}\n```\n**Register Class Event \u0026 Listeners in `config/events.php`**\n``` \nreturn [\n   'events' =\u003e [\n      UserLogin::class =\u003e [\n          FlashWelcomeBackMessage::class,\n          // ExampleListenerTwo::class,\n          // ExampleListenerThree::class\n      ],\n      // ResetUserPasswordEvent::class =\u003e [\n           // GenerateResetPasswordKey::class,\n           // SendUserResetPasswordEmail::class,\n      // ]\n   ]\n];\n```\n\n**Finally trigger event**\n`(Example: App\\Http\\Controllers\\LoginController@login)`\n```\npublic function login(StoreLoginRequest $input)\n{\n  if ($input-\u003efailed()) return back(); \n\n  if (Auth::attempt($input-\u003eemail, $input-\u003epassword)) \n  {\n      event()-\u003efire(\\App\\Events\\UserLogin::class); // Fire Event\n\n      return redirect('/home');\n   }\n\n   return back();\n}\n```\n\n**Event Constructor and Listener Invoke Methods Support Dependency Injection**\n// App\\Http\\LoginController@login\n```\n// Example Using UserLogin Event:\n// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n$session = app()-\u003eresolve('session');\n$different_user = \\App\\User::find(5); \n\nevent()-\u003efire(UserLogin::class, [\n   $session, $different_user\n]);\n\n// Example Using Random Event\n// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nevent()-\u003efire(ExampleEvent::class, [\n   // parameterOne\n   // parameterTwo\n]);\n\n// Dependency Injection With While Using event() to register listeners\n// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nevent()-\u003elisten('welcome-view', fn (\\Jessengers\\Blade\\Blade $blade) =\u003e $blade-\u003emake('welcome')-\u003erender());\n\n// Fire's event. Listeners will work using the blade instance resolved from our service container\nevent()-\u003efire('welcome-view');\n\n// inject blade instance with different template path than the one binded to our container\nevent()-\u003efire('welcome-view', [\n    new \\Jessengers\\Blade\\Blade(\n        base_path('vendor/package/resources/views'), \n        storage_path('cache'),\n    )\n]);\n\n\n```\n### Packages \u0026 Resources Glossary\n - [Slim 4](http://www.slimframework.com/docs/v4/)\n - [Slim Csrf](https://github.com/slimphp/Slim-Csrf)\n - [Laravel Validators](https://laravel.com/docs/7.x/validation)\n - [Laravel Homestead](https://laravel.com/docs/7.x/homestead)\n - [Jenssegers Blade](https://github.com/jenssegers/blade)\n - [Zeuxisoo Slim Whoops](https://github.com/zeuxisoo/php-slim-whoops)\n - [Php Dot Env](https://github.com/vlucas/phpdotenv)\n - [CakePhp Seeders \u0026 Migrations](https://github.com/cakephp/phinx)\n - [Fzaninotto Faker For Factories](https://github.com/fzaninotto/Faker)\n - [Illuminate Database](https://github.com/illuminate/database)\n - [Illuminate Support](https://github.com/illuminate/support)\n - [Php Dependency Injection Container](http://php-di.org/doc/)\n - [Php Dependency Injection Container Slim Bridge](https://github.com/PHP-DI/Slim-Bridge)\n - [Laravel Mix Webpack Wrapper](https://laravel-mix.com)\n - [Swift Mailer for Emails](https://github.com/swiftmailer/swiftmailer)\n - [Mailtrap for local email testing](https://mailtrap.io)\n - [Illuminate Mail For Markdown Parser](https://github.com/illuminate/mail)\n - [Symfony Console Component For Console Commands](https://symfony.com/doc/current/components/console.html)\n - [Symfony Session Component For Sessions](https://symfony.com/doc/current/session.html)\n - [Eloquent For Database ORM](https://packagist.org/packages/illuminate/database)\n - [Vuejs For Front-end Reactivity](https://vuejs.org/v2/guide/)\n - [Tailwind For CSS \u0026 SCSS](https://tailwindcss.com/components)\n - [Vue Material Design Icons](https://www.npmjs.com/package/vue-material-design-icons)\n - [Guzzle Http Wrapper](https://github.com/guzzle/guzzle)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzhorton34%2Fauthorize-slim-4","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzhorton34%2Fauthorize-slim-4","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzhorton34%2Fauthorize-slim-4/lists"}