franzwilding/last

View on GitHub
README.md

Summary

Maintainability
Test Coverage

# Last – static site generator for any Symfony project

[![Build Status](https://travis-ci.org/franzwilding/last.svg?branch=master)](https://travis-ci.org/franzwilding/last)
[![Test Coverage](https://api.codeclimate.com/v1/badges/e9334f9657fc4a65e24c/test_coverage)](https://codeclimate.com/github/franzwilding/last/test_coverage)

Last is a minimalistic static site generator for Symfony 4 applications. Once installed, Last provides a 
command that will simply create requests for all of your routes and dumps the result as a static file to a dist folder.

## Installation
*(A symfony/flex recipe will be created soon. )*

    composer require fw/last-bundle
    
Last should get registered automatically to config/bundles.php. If not, add it by hand:

    ...
    Fw\LastBundle\FwLastBundle::class => ['all' => true],

## Usage
Now you can run the dump command and your Symfony app gets exported as static html files. 

    # will dump to the configured dist folder, defaults to %project%/dist
    bin/console last:dump 
    
    # wil dump to the given folder
    bin/console last:dump --dist=./custom_dist_folder
    
## Is it production ready?
Soon, however the following is missing yet:

- [ ] Test with more real life projects
- [ ] Provide an symfony/flex recipe
- [ ] Automatically copy assets from public/build, public/bundles/* and other locations to dist folder after dumping

## Configuration

    fw_last:
        dist_folder: '%kernel.project_dir%/dist' # this is the default dist folder, if you don't set it 
        providers:
            static: true # Static provider is enabled per default, you can disable it here

## Request providers

Last runs requests against your kernel. So in order to make it work, all desired requests must be defined. To make 
things more easy, Last comes with a request provider for all static routes (routes without mandatory placeholders). So
you only need to implement a custom request provider if you want to include dynamic routes like *blog/article/{id}*. A
simple provider could look like this: 

    use Fw\LastBundle\Router\RouteProvider;

    class YourustomProvider implements RouteProvider
    {
        /**
         * {@inheritdoc}
         */
        public function getRoutes(): array
        {
            return [
                Request::create('blog/article/1'),
                Request::create('blog/article/2'),
                Request::create('blog/article/3'),
            ];
        }
    } 

And needs to be a tagged service, in order to make it visible for Last.

    Your\CustomBundle\Provider\CustomProvider:
            tags: ['fw.last.route_provider']

Of course you can inject any dependencies like an entity manager to create more advanced providers.

## Troubleshooting

### My links start with `http://localhost/` what should I do?
Use `{{ path() }}` instead of `{{ url() }}` in your templates to make your urls relative.