Home

Awesome

selective/basepath

A URL base path detector for Slim 4.

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

Features

Supported servers

Requirements

Installation

composer require selective/basepath

The recommended directory structure:

The following steps are necessary for your Slim 4 application:

For Apache we have to "redirect" the web traffic to the front controller in public/index.php.

Create a file: public/.htaccess with this content:

# Redirect to front controller
RewriteEngine On
# RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]

We also need a rule to "redirect" the sub-directories to the front-controller in public/index.php.

Create a second .htaccess file above the public/ directory with this content:

RewriteEngine on
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]

Usage

Slim 4 integration

Add the BasePathMiddleware after addRoutingMiddleware() to set the basePath before the routing is started.

Example: public/index.php

<?php

use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Selective\BasePath\BasePathMiddleware;
use Slim\Factory\AppFactory;

require_once __DIR__ . '/../vendor/autoload.php';

$app = AppFactory::create();

// Add Slim routing middleware
$app->addRoutingMiddleware();

// Set the base path to run the app in a subdirectory.
// This path is used in urlFor().
$app->add(new BasePathMiddleware($app));

$app->addErrorMiddleware(true, true, true);

// Define app routes
$app->get('/', function (Request $request, Response $response) {
    $response->getBody()->write('Hello, World!');
    return $response;
})->setName('root');

// Run app
$app->run();

Apache usage

PHP built-in webserver usage

php -S localhost:8000

If you don't start the webserver from the project public/ directory, you have start it with a specific document root directory:

php -S localhost:8000 -t public

Good URLs

The public/ directory is only the DocumentRoot of your webserver, but it's never part of your base path and the official url.

<span style="color:green">Good URLs:</span>

<span style="color:red">Bad URLs:</span>

Retrieving the base path

$basePath = \Slim\Routing\RouteContext::fromRequest($request)->getBasePath();

Creating a relative url with the base path

$routeParser = \Slim\Routing\RouteContext::fromRequest($request)->getRouteParser();
$url = $routeParser->urlFor('root');

Rendering the base path into a Twig layout template

This example requires slim/twig-view

<!DOCTYPE html>
<head>
    <meta charset="utf-8">
    <base href="{{ base_path() }}/"/>
</head>
<body>
{% block content %}{% endblock %}
</body>
</html>

Support

License

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