This is a skeleton to quickly set up a new Slim 4 application.

Overview

Slim 4 Skeleton

Latest Version on Packagist Software License Build Status Coverage Status Quality Score Total Downloads

This is a skeleton to quickly set up a new Slim 4 application.

Requirements

  • PHP 7.4+ or 8.0+
  • MySQL 5.7+ or MariaDB

Recommended

  • Apache with mod_rewrite
  • Apache Ant to build deployment artifacts

Installation

composer create-project odan/slim4-skeleton my-app

Read more: Documentation

Features

This project is based on best practices and industry standards:

  • HTTP message interfaces (PSR-7)
  • HTTP Server Request Handlers, Middleware (PSR-15)
  • HTTP factories (PSR-17)
  • HTTP router and dispatcher (Slim)
  • Dependency injection container (PSR-11)
  • Modern coding style (PSR-1, PSR-12)
  • PHPDoc standard (PSR-5, PSR-19)
  • Autoloading (PSR-4)
  • Logging (PSR-3)
  • Standard PHP package skeleton
  • Single action controllers (ADR)
  • Input validation
  • SQL Query Builder
  • Database migrations
  • Immutable date and time (Chronos)
  • Unit- and integration tests (PHPUnit)
  • Console Commands
  • Tested with Github Actions and Scrutinizer CI
  • PHPStan (Level: max)
  • Build and deployment scripts
  • Docker container with Xdebug support
  • Swagger OpenAPI documentation

Screenshot

screely-1611483778132

Usage

You can clone this project to modify it as you wish to create awesome API's and web applications.

This project is just a skeleton-project and not a "framework".

Read more: Documentation

Support

Contributing

Please create an issue first, so we can discuss it in advance.

License

The MIT License (MIT). Please see License File for more information.

Comments
  • Slim Role Auth

    Slim Role Auth

    Hello @odan,

    Do you think your JWT authorization is compatible with this dependency? For role auth https://github.com/jaywilliams/slim-role-auth

    It should be loaded after the JWT was authorized right? The role data should be inside the JWT?

    Thanks!

    opened by fvtorres 12
  • The validateUserUpdate() function of UserValidator service does not return the error message, only the status code (422)

    The validateUserUpdate() function of UserValidator service does not return the error message, only the status code (422)

    Hi @odan, how are you?

    In my tests, the ValidationException of validateUserUpdate() does not return the 'User not found' error message. Returns only the 422 error, but without the error message.

    The validateUser() returns with the error message, and indicates which field is incorrect.

    What is the correct way to solve this?

    Thanks in advanced.

    opened by esallum-iluminare 10
  • Slim 4 Skeleton docker-compose missing

    Slim 4 Skeleton docker-compose missing

    Hi i am following your wiki on: https://odan.github.io/slim4-skeleton/setup/docker.html but after i have created my application with:

    composer create-project odan/slim4-skeleton my-app

    the file docker-compose.yml will not create, and i can't run my docker container.

    Anyone can help me?

    Thank you

    opened by thedarkknight197 10
  • Safari cannot open the page

    Safari cannot open the page

    Cannot send request via Guzzle in home controller. It's weird, but when I add line var_dump($learners); I can see rendered response. Without var_dump page doesn't renders at all.

    < HTTP/1.1 200 OK
    < Date: Wed, 02 Sep 2020 10:53:40 GMT
    < Server: Apache/2.4.34 (Unix) PHP/7.4.6
    < X-Powered-By: PHP/7.4.6
    < Cache-Control: max-age=0, private, must-revalidate
    < Transfer-Encoding: chunked
    < Content-Type: text/html; charset=UTF-8
    
    
    * Received 1783 B chunk
    * Illegal or missing hexadecimal sequence in chunked-encoding
    * stopped the pause stream!
    * Closing connection 20
    
    <?php
    
    namespace App\Action\Home;
    
    use App\Responder\Responder;
    use Psr\Http\Message\ResponseInterface;
    use Psr\Http\Message\ServerRequestInterface;
    use GuzzleHttp\Client;
    
    /**
     * Action.
     */
    final class HomeAction
    {
        /**
         * @var Responder
         */
        private $responder;
    
        /**
         * The constructor.
         *
         * @param Responder $responder The responder
         */
        public function __construct(Responder $responder)
        {
            $this->responder = $responder;
        }
    
        /**
         * Action.
         *
         * @param ServerRequestInterface $request The request
         * @param ResponseInterface $response The response
         *
         * @return ResponseInterface The response
         */
        public function __invoke(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface
        {
            $client = new Client();
            $learnersUrl = 'http://apitest.test/api/learners';// localhost
            $response = $client->request('GET', $learnersUrl);
            $learners = json_decode((string) $response->getBody(), true);
            // var_dump($learners);
            return $this->responder->render($response, 'home/home.twig', [
                'now' => date('d.m.Y H:i:s'),
            ]);
        }
    }
    
    opened by ybelenko 10
  • Way of communication

    Way of communication

    Is there a way of communication to speak/ask question about this skeleton? I have some "generic" questions, but I don't want to abuse the issue system.

    (Maybe by enabling the Discussions feature in this repos settings)

    opened by DigiLive 8
  • getParsedBody

    getParsedBody

    Hi

    i have a middleware `<?php

    namespace App\Middleware;

    use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; use Slim\Views\Twig; use Symfony\Component\HttpFoundation\Session\Session;

    final class OldInputMiddleware implements MiddlewareInterface {

    private Twig $view;
    
    private Session $session;
    /**
     * @param $request
     * @param $response
     * @param $next
     * @return mixed
     */
    public function __construct(Session $session,Twig $view)
    {
        $this->session = $session;
        $this->view= $view;
    }
    
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    {
    
        $tmp=$request->getParsedBody();
         var_dump($tmp);
    
        return $handler->handle($request);
    }
    

    }`

    when i submit a form POST , the dump is empty , the getMethod is "GET"

    `<?php

    use App\Middleware\OldInputMiddleware; use App\Middleware\SessionMiddleware; use App\Middleware\UrlGeneratorMiddleware; use App\Middleware\ValidationErrorsMiddleware; use Selective\BasePath\BasePathMiddleware; use Selective\Validation\Middleware\ValidationExceptionMiddleware; use Slim\App; use Slim\Csrf\Guard; use Slim\Middleware\ErrorMiddleware; use Slim\Views\TwigMiddleware;

    return function (App $app) {

    $app->add(ValidationExceptionMiddleware::class); $app->add(Guard::class); $app->add(UrlGeneratorMiddleware::class);

    $app->addRoutingMiddleware();
    
    $app->add(TwigMiddleware::class);
    $app->add(OldInputMiddleware::class); // EMPTY getParsedBody
    $app->add(ValidationErrorsMiddleware::class);
    $app->add(SessionMiddleware::class);
    $app->add(BasePathMiddleware::class);
    $app->addBodyParsingMiddleware();
    $app->add(ErrorMiddleware::class);
    

    };`

    any idea ?

    opened by ledahu 8
  • Click to Download option

    Click to Download option

    Is this possible to add a link to download with storage directory with slim 4 and how?

    Ex. "Download" and Link is: (myweb/storage/04/download.zip).

    opened by 262926 8
  • Twig + Mailer Integration Issue

    Twig + Mailer Integration Issue

    Hey @odan

    I went though your Tutorial, the Twig implementation and the Mailer Implementation. Would like to thank you for these awesome tutorials.

    So good so far, but when I tried to use Twig inside emails, it simply doenst work. I was following the official documentation in Mailer, but I get an error: Type: Symfony\Component\Mime\Exception\LogicException Code: 0 Message: A message must have a text or an HTML part or attachments. File: /vendor/symfony/mime/Email.php Line: 405

    I found a reference in this github: symfony/symfony#35990

    If this is easy to solve, I guess it would be nice to be in your tutorials

    opened by fvtorres 8
  • Add VSCode snippets to docs

    Add VSCode snippets to docs

    I would like to share few VSCode snippets which I found very useful.

    Snippets in Visual Studio Code - Create your own snippets

    Route declaration snippet

        "slim4 skeleton route": {
            "prefix": [
                "$app->get",
                "$group->get"
            ],
            "body": [
                "// Route for /$1",
                "\\$${2|app,group|}->${3|get,post,put,patch,delete|}('/$1', \\App\\Action\\\\$4::class)->setName('${1/[^A-z^0-9^-]/:downcase/g}');"
            ],
            "description": "Route declaration for Slim4 skeleton"
        },
    

    Generates line like:

    // Route for /
    $app->get('/', \App\Action\::class)->setName('');
    

    Action Controller snippet

        "slim4 skeleton action class": {
            "prefix": "class",
            "body": [
                "namespace App\\Action\\\\${TM_DIRECTORY/^.+\\/(.*)$/$1/};",
                "",
                "use App\\Responder\\Responder;",
                "use Psr\\Http\\Message\\ResponseInterface;",
                "use Psr\\Http\\Message\\ServerRequestInterface;",
                "",
                "/**",
                " * Action.",
                " */",
                "final class $TM_FILENAME_BASE",
                "{",
                "    /**",
                "     * @var Responder",
                "     */",
                "    private \\$responder;",
                "",
                "    /**",
                "     * The constructor.",
                "     *",
                "     * @param Responder \\$responder The responder",
                "     */",
                "    public function __construct(Responder \\$responder)",
                "    {",
                "        \\$this->responder = \\$responder;",
                "    }",
                "",
                "    /**",
                "     * Action.",
                "     *",
                "     * @param ServerRequestInterface \\$request The request",
                "     * @param ResponseInterface \\$response The response",
                "     *",
                "     * @return ResponseInterface The response",
                "     */",
                "    public function __invoke(ServerRequestInterface \\$request, ResponseInterface \\$response): ResponseInterface",
                "    {",
                "        return \\$this->responder->withTemplate(\\$response, '${TM_DIRECTORY/^.+\\/(.*)$/${1:/downcase}/}/$0.twig');",
                "    }",
                "}",
                ""
            ],
            "description": "Slim4 skeleton action class"
        },
    

    Generates file like:

    <?php
    
    namespace App\Action\Home;
    
    use App\Responder\Responder;
    use Psr\Http\Message\ResponseInterface;
    use Psr\Http\Message\ServerRequestInterface;
    
    /**
     * Action.
     */
    final class HelloWorld
    {
        /**
         * @var Responder
         */
        private $responder;
    
        /**
         * The constructor.
         *
         * @param Responder $responder The responder
         */
        public function __construct(Responder $responder)
        {
            $this->responder = $responder;
        }
    
        /**
         * Action.
         *
         * @param ServerRequestInterface $request The request
         * @param ResponseInterface $response The response
         *
         * @return ResponseInterface The response
         */
        public function __invoke(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface
        {
            return $this->responder->withTemplate($response, 'home/.twig');
        }
    }
    
    

    Twig template snippet

        "slim4 skeleton Twig template": {
            "prefix": "extends",
            "body": [
                "{% extends \"layout/${1|layout-empty,layout|}.twig\" %}",
                "",
                "{% block css %}",
                "    {% webpack_entry_css '${TM_DIRECTORY/^.+\\/(.*)$/$1/}/$TM_FILENAME_BASE' %}",
                "{% endblock %}",
                "",
                "{% block js %}",
                "    {% webpack_entry_js '${TM_DIRECTORY/^.+\\/(.*)$/$1/}/$TM_FILENAME_BASE' %}",
                "{% endblock %}",
                "",
                "{% block content %}",
                "",
                "    <div class=\"container\">",
                "        $0",
                "    </div>",
                "",
                "{% endblock %}",
                ""
            ],
            "description": "slim4 skeleton Twig template"
        },
    

    Generates file like:

    {% extends "layout/layout-empty.twig" %}
    
    {% block css %}
        {% webpack_entry_css 'home/hello-world' %}
    {% endblock %}
    
    {% block js %}
        {% webpack_entry_js 'home/hello-world' %}
    {% endblock %}
    
    {% block content %}
    
        <div class="container">
            
        </div>
    
    {% endblock %}
    
    
    opened by ybelenko 7
  • Problem getting JWT to work as per your eBook

    Problem getting JWT to work as per your eBook

    Hi,

    I set up the slim 4 framework following your ebook, but then ran into some issues with composer. After that I just took your slmi4-framwork from github and got it up and running. After that I followed the JWT part in your ebook but can't get it to work. I end up with a "Uncaught DI\DependencyException: Circular dependency detected while trying to resolve entry 'Slim\App'" error. Any help getting this solved would be greatly appreciated.

    The error as i get it in postman when testing:

    <br />
    <b>Fatal error</b>:  Uncaught DI\DependencyException: Circular dependency detected while trying to resolve entry 'Slim\App' in /<project>/vendor/php-di/php-di/src/Container.php:384
    Stack trace:
    #0 /<project>/vendor/php-di/php-di/src/Container.php(139): DI\Container-&gt;resolveDefinition()
    #1 /<project>/config/container.php(149): DI\Container-&gt;get()
    #2 [internal function]: DI\Definition\Source\DefinitionFile-&gt;{closure}()
    #3 /<project>/vendor/php-di/invoker/src/Invoker.php(74): call_user_func_array()
    #4 /<project>/vendor/php-di/php-di/src/Definition/Resolver/FactoryResolver.php(80): Invoker\Invoker-&gt;call()
    #5 /<project>/vendor/php-di/php-di/src/Definition/Resolver/ResolverDispatcher.php(71): DI\Definition\Resolver\FactoryResolver-&gt;resolve()
    #6 /<project>/vendor/php-di/php-di/src/Container.php(390): DI\Definition\Resolver\ResolverDispatcher-&gt;resolve()
    #7 /<project>/vendor/php-di/php-di/src/Container.php(139): DI\Container-&gt;resolveDefinition()
    #8 /<project>/vendor/slim/slim/Slim/Factory/AppFactory.php(109): DI\Container-&gt;get()
    #9 /<project>/config/container.php(37): Slim\Factory\AppFactory::createFromContainer()
    #10 [internal function]: DI\Definition\Source\DefinitionFile-&gt;{closure}()
    #11 /<project>/vendor/php-di/invoker/src/Invoker.php(74): call_user_func_array()
    #12 /<project>/vendor/php-di/php-di/src/Definition/Resolver/FactoryResolver.php(80): Invoker\Invoker-&gt;call()
    #13 /<project>/vendor/php-di/php-di/src/Definition/Resolver/ResolverDispatcher.php(71): DI\Definition\Resolver\FactoryResolver-&gt;resolve()
    #14 /<project>/vendor/php-di/php-di/src/Container.php(390): DI\Definition\Resolver\ResolverDispatcher-&gt;resolve()
    #15 /<project>/vendor/php-di/php-di/src/Container.php(139): DI\Container-&gt;resolveDefinition()
    #16 /<project>/config/bootstrap.php(12): DI\Container-&gt;get()
    #17 /<project>/public/index.php(6): require('...')
    #18 {main}
      thrown in
    <b>/<project>/vendor/php-di/php-di/src/Container.php</b> on line
    <b>384</b>
    <br />
    

    contents of config/container.php:

    <?php
    
    use App\Routing\JwtAuth;
    use Lcobucci\JWT\Configuration;
    use Lcobucci\JWT\Signer\Rsa\Sha256;
    use Lcobucci\JWT\Signer\Key\InMemory;
    use App\Factory\LoggerFactory;
    use App\Handler\DefaultErrorHandler;
    use Cake\Database\Connection;
    use Nyholm\Psr7\Factory\Psr17Factory;
    use Psr\Container\ContainerInterface;
    use Psr\Http\Message\ResponseFactoryInterface;
    use Psr\Http\Message\ServerRequestFactoryInterface;
    use Psr\Http\Message\StreamFactoryInterface;
    use Psr\Http\Message\UploadedFileFactoryInterface;
    use Psr\Http\Message\UriFactoryInterface;
    use Selective\BasePath\BasePathMiddleware;
    use Selective\Validation\Encoder\JsonEncoder;
    use Selective\Validation\Middleware\ValidationExceptionMiddleware;
    use Selective\Validation\Transformer\ErrorDetailsResultTransformer;
    use Slim\App;
    use Slim\Factory\AppFactory;
    use Slim\Interfaces\RouteParserInterface;
    use Slim\Middleware\ErrorMiddleware;
    use Slim\Views\PhpRenderer;
    use Symfony\Component\Console\Application;
    use Symfony\Component\Console\Input\InputOption;
    use Tuupola\Middleware\HttpBasicAuthentication;
    
    return [
        // Application settings
        'settings' => function () {
            return require __DIR__ . '/settings.php';
        },
    
        App::class => function (ContainerInterface $container) {
            $app = AppFactory::createFromContainer($container);
    
            // Register routes
            (require __DIR__ . '/routes.php')($app);
    
            // Register middleware
            (require __DIR__ . '/middleware.php')($app);
    
            return $app;
        },
    
        // HTTP factories
        ResponseFactoryInterface::class => function (ContainerInterface $container) {
            return $container->get(Psr17Factory::class);
        },
    
        ServerRequestFactoryInterface::class => function (ContainerInterface $container) {
            return $container->get(Psr17Factory::class);
        },
    
        StreamFactoryInterface::class => function (ContainerInterface $container) {
            return $container->get(Psr17Factory::class);
        },
    
        UploadedFileFactoryInterface::class => function (ContainerInterface $container) {
            return $container->get(Psr17Factory::class);
        },
    
        UriFactoryInterface::class => function (ContainerInterface $container) {
            return $container->get(Psr17Factory::class);
        },
    
        // The Slim RouterParser
        RouteParserInterface::class => function (ContainerInterface $container) {
            return $container->get(App::class)->getRouteCollector()->getRouteParser();
        },
    
        // The logger factory
        LoggerFactory::class => function (ContainerInterface $container) {
            return new LoggerFactory($container->get('settings')['logger']);
        },
    
        BasePathMiddleware::class => function (ContainerInterface $container) {
            return new BasePathMiddleware($container->get(App::class));
        },
    
        // Database connection
        Connection::class => function (ContainerInterface $container) {
            return new Connection($container->get('settings')['db']);
        },
    
        PDO::class => function (ContainerInterface $container) {
            $db = $container->get(Connection::class);
            $driver = $db->getDriver();
            $driver->connect();
    
            return $driver->getConnection();
        },
    
        ValidationExceptionMiddleware::class => function (ContainerInterface $container) {
            return new ValidationExceptionMiddleware(
                $container->get(ResponseFactoryInterface::class),
                new ErrorDetailsResultTransformer(),
                new JsonEncoder()
            );
        },
    
        ErrorMiddleware::class => function (ContainerInterface $container) {
            $settings = $container->get('settings')['error'];
            $app = $container->get(App::class);
    
            $logger = $container->get(LoggerFactory::class)
                ->addFileHandler('error.log')
                ->createLogger();
    
            $errorMiddleware = new ErrorMiddleware(
                $app->getCallableResolver(),
                $app->getResponseFactory(),
                (bool)$settings['display_error_details'],
                (bool)$settings['log_errors'],
                (bool)$settings['log_error_details'],
                $logger
            );
    
            $errorMiddleware->setDefaultErrorHandler($container->get(DefaultErrorHandler::class));
    
            return $errorMiddleware;
        },
    
        Application::class => function (ContainerInterface $container) {
            $application = new Application();
    
            $application->getDefinition()->addOption(
                new InputOption('--env', '-e', InputOption::VALUE_REQUIRED, 'The Environment name.', 'development')
            );
    
            foreach ($container->get('settings')['commands'] as $class) {
                $application->add($container->get($class));
            }
    
            return $application;
        },
    
        PhpRenderer::class => function (ContainerInterface $container) {
            return new PhpRenderer($container->get('settings')['template']);
        },
    
        HttpBasicAuthentication::class => function (ContainerInterface $container) {
            return new HttpBasicAuthentication($container->get('settings')['api_auth']);
        },
    
        ResponseFactoryInterface::class => function (ContainerInterface $container) {
            return $container->get(App::class)->getResponseFactory();
        },
    
        JwtAuth::class => function (ContainerInterface $container) {
            $configuration = $container->get(Configuration::class);
            $jwtSettings = $container->get('settings')['jwt'];
            $issuer = (string)$jwtSettings['issuer'];
            $lifetime = (int)$jwtSettings['lifetime'];
    
            return new JwtAuth($configuration, $issuer, $lifetime);
        },
    
        Configuration::class => function (ContainerInterface $container) {
            $jwtSettings = $container->get('settings')['jwt'];
    
            $privateKey = (string)$jwtSettings['private_key'];
            $publicKey = (string)$jwtSettings['public_key'];
                
            // Asymmetric algorithms use a private key for signature creation
            // and a public key for verification
            return Configuration::forAsymmetricSigner(
                new Sha256(),
                InMemory::plainText($privateKey),
                InMemory::plainText($publicKey)
            );
        },
        
    ];
    
    opened by noromamai 6
  • Inject RouteParser to UrlGenerator constructor

    Inject RouteParser to UrlGenerator constructor

    Small refactoring.

    It seems easier to expect RouteParserInterface as constructor argument than retrieve it with RouteContext::fromRequest every time.

    I'm not sure about performance, but all urls has been computed correctly.

    I guess fullUrlFor will throw exception when $this->request is null anyway.

    opened by ybelenko 6
Releases(0.25.2)
Slim Framework 4 Skeleton Application

Slim Framework 4 Skeleton Application Use this skeleton application to quickly setup and start working on a new Slim Framework 4 application. This app

Cleonildo Soares Guimaraes Junior 5 Nov 21, 2021
Simple skeleton for the PHP Slim framework

Simple skeleton for the PHP Slim framework

Andrew S Erwin 2 Nov 13, 2021
SPA Skeleton with Mithril.js and Slim Framework

A single-page application (SPA) skeleton based on Mithril.js and Slim Framework 4 trying to use good practices

tebe 5 Oct 23, 2022
This is Slim 3 API skeleton project for Composer

Slim 3 API skeleton This is Slim 3 API skeleton project for Composer. Project uses Zend Table Gateway and Phinx for database operations, Monolog for l

Mika Tuupola 304 Dec 28, 2022
A skeleton WordPress project to be used as a base for new WordPress projects.

BoxUK WordPress Project Skeleton A base WordPress project from Box UK to get you up and running quickly. Installation Create a new project with compos

Box UK 33 Dec 14, 2022
This repository is pre-configured, clean and empty skeleton for creating a new projects using Kraken Framework.

Kraken Application Skeleton Note: This repository contains pre-configured application skeleton for fast creation of new projects with Kraken Framework

Kraken 79 Aug 6, 2022
CodeIgniter 4-based application skeleton

Bonfire 2 Just getting started. More details at Patreon What is Bonfire? Bonfire will be a robust application skeleton for CodeIgniter 4-based applica

Lonnie Ezell 79 Dec 25, 2022
Reverse proxy skeleton built for docker with traefik, showcasing a Symfony + React application

Decoupled Backend(Symfony) + Frontend(React ts) built with Traefik & Docker Reverse proxy skeleton built for docker with traefik, showcasing a decoupl

Sergiu 1 Dec 13, 2021
A skeleton application using the Zend Framework MVC

This is a skeleton application using the Zend Framework MVC layer and module systems. This application is meant to be used as a starting place for those looking to get their feet wet with Zend Framework.

Zend Framework 1.5k Dec 15, 2022
Quick new application creation with Laravel and Valet

Super-powered laravel new for Laravel and Valet Lambo is a command-line tool that replaces the Laravel installer and wraps up the most common tasks yo

Tighten 593 Dec 30, 2022
A skeleton for creating applications with CakePHP 4.x.

CakePHP Application Skeleton A skeleton for creating applications with CakePHP 4.x. The framework source code can be found here: cakephp/cakephp. Inst

Fabiano Araujo 1 Oct 13, 2021
A skeleton for build your Kata with Docker

A skeleton for build your Kata with Docker

Raúl Coloma Bonifacio 1 Nov 12, 2021
Project skeleton generator for Laravel & Lumen projects

Skeletor Skeletor is a PHP based CLI tool that has been built to take away the pain of setting up a base project skeleton for Laravel & Lumen projects

Wouter 39 Oct 4, 2022
⚡️ This package provides a wonderful PHP skeleton to start building your next package idea.

This package provides a wonderful PHP Skeleton to start building your next package idea. Requires PHP 8.0+ ⚡️ Create your package using Composer: comp

Nuno Maduro 383 Dec 20, 2022
A prototype generator to quickly generate prototypes based on Neos nodetype definitions.

UpAssist.PrototypeGenerator What does this package do? This package lets you create scaffolding for prototypes for Neos using the commandline. Why did

UpAssist 6 Nov 8, 2021
Quickly build an admin interface for your Eloquent models

Website | Documentation | Add-ons | Pricing | Services | Stack Overflow | Reddit | Blog | Newsletter Quickly build an admin interface for your Eloquen

Backpack for Laravel 2.5k Jan 6, 2023
Boilerplate for Slim Framework 3

Boilerplate for Slim Framework 3 Boilerplate for getting started with Slim Framework Use this skeleton application to quickly setup and start working

Yudi Purwanto 23 Dec 27, 2022
Learn how to set up a fake authentication web page on a fake WiFi network.

Evil Twin - Mark VII Learn how to set up a fake authentication web page on a fake WiFi network. Read the comments in these two files to get a better u

Ivan Šincek 44 Dec 13, 2022
Start a new Laravel 8 project with the AdminLTE template installed.

AdminLTE template Laravel 8 package Start a new Laravel 8 project with the AdminLTE template installed. Installation Create database. Clone repository

Mairo Rodrigues 12 Dec 21, 2022