selective / basepath
A URL base path detector for Slim 4
Installs: 394 701
Dependents: 14
Suggesters: 0
Security: 0
Stars: 48
Watchers: 3
Forks: 6
Open Issues: 0
Requires
- php: ^8.1
- psr/http-server-middleware: ^1
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3
- phpstan/phpstan: ^1
- phpunit/phpunit: ^10
- slim/psr7: ^1
- slim/slim: ^4
- squizlabs/php_codesniffer: ^3
README
A URL base path detector for Slim 4.
Features
- Support for Apache and the PHP built-in webserver
- Tested
- No dependencies
- Very fast
Supported servers
- Apache webserver with mod_rewrite and .htaccess
- PHP build-in webserver
Requirements
- PHP 7.2+ or 8.1+
Installation
composer require selective/basepath
The recommended directory structure:
public/
Web server files, the DocumentRoot.htaccess
Apache redirect rules for the front controllerindex.php
The front controller
.htaccess
Internal redirect to the public/ directory
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
- Start the apache webserver
- Open your website, e.g.
http://localhost
orhttp://localhost/{my-sub-directory}
and you should see the messageHello, World!
.
PHP built-in webserver usage
- Open the console and change into the project
public/
directory. Then run:
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
- Open
http://localhost:8000
and you should see the messageHello, World!
.
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.
Good URLs:
https://www.example.com
https://www.example.com/users
https://www.example.com/my-app
https://www.example.com/my-app/users
Bad URLs:
https://www.example.com/public
https://www.example.com/public/users
https://www.example.com/my-app/public
https://www.example.com/my-app/public/users
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
- Issues: https://github.com/selective-php/basepath/issues
- Here you can donate for this project.
License
The MIT License (MIT). Please see License File for more information.