From 7965ed1032095b7260ec0436d5ff84347fdd5b1c Mon Sep 17 00:00:00 2001 From: Oscar Otero Date: Sat, 30 Nov 2019 17:32:48 +0100 Subject: [PATCH] v2 --- .gitattributes | 15 ++--- .gitignore | 3 +- .php_cs | 135 +++--------------------------------------- .travis.yml | 3 +- CHANGELOG.md | 34 +++-------- LICENSE | 2 +- README.md | 37 ++++++++---- composer.json | 15 +++-- src/TrailingSlash.php | 18 +++--- 9 files changed, 66 insertions(+), 196 deletions(-) diff --git a/.gitattributes b/.gitattributes index 2d48476..c540470 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,9 +1,10 @@ * text=auto eol=lf -/tests export-ignore -.editorconfig export-ignore -.gitattributes export-ignore -.gitignore export-ignore -.travis.yml export-ignore -phpunit.xml export-ignore -phpcs.xml export-ignore +/tests export-ignore +.editorconfig export-ignore +.gitattributes export-ignore +.gitignore export-ignore +.php_cs export-ignore +.travis.yml export-ignore +phpcs.xml.dist export-ignore +phpunit.xml.dist export-ignore diff --git a/.gitignore b/.gitignore index d0ec629..364d1a4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ vendor composer.lock -.php_cs.cache coverage -.phpunit.result.cache +*.cache diff --git a/.php_cs b/.php_cs index 84bca01..90b12a3 100644 --- a/.php_cs +++ b/.php_cs @@ -1,129 +1,10 @@ files() - ->name('*.php') - ->in(__DIR__ . '/src') - ->in(__DIR__ . '/tests') -; - -return PhpCsFixer\Config::create() - ->setRules(array( - '@PSR2' => true, - 'array_syntax' => ['syntax' => 'short'], - 'binary_operator_spaces' => ['align_double_arrow' => false, 'align_equals' => false], - 'blank_line_after_namespace' => true, - 'blank_line_after_opening_tag' => false, - 'blank_line_before_return' => false, - 'braces' => ['allow_single_line_closure' => false], - 'cast_spaces' => true, - 'class_definition' => ['singleLine' => false, 'singleItemSingleLine' => true, 'multiLineExtendsEachSingleLine' => true], - 'class_keyword_remove' => false, - 'combine_consecutive_unsets' => true, - 'concat_space' => false, - 'declare_equal_normalize' => ['space' => 'single'], - 'declare_strict_types' => false, - 'elseif' => true, - 'encoding' => true, - 'full_opening_tag' => true, - 'function_declaration' => true, - 'function_typehint_space' => true, - 'general_phpdoc_annotation_remove' => ['expectedExceptionMessageRegExp', 'expectedException', 'expectedExceptionMessage'], - 'hash_to_slash_comment' => true, - 'header_comment' => false, - 'heredoc_to_nowdoc' => true, - 'include' => true, - 'indentation_type' => true, - 'line_ending' => true, - 'linebreak_after_opening_tag' => true, - 'lowercase_cast' => true, - 'lowercase_constants' => true, - 'lowercase_keywords' => true, - 'mb_str_functions' => false, - 'method_argument_space' => true, - 'method_separation' => true, - 'native_function_casing' => true, - 'native_function_invocation' => false, - 'new_with_braces' => true, - 'no_blank_lines_after_class_opening' => true, - 'no_blank_lines_after_phpdoc' => false, - 'no_blank_lines_before_namespace' => false, - 'no_closing_tag' => true, - 'no_empty_comment' => true, - 'no_empty_phpdoc' => true, - 'no_empty_statement' => true, - 'no_extra_consecutive_blank_lines' => ['break', 'continue', 'extra', 'return', 'throw', 'use', 'parenthesis_brace_block', 'square_brace_block', 'curly_brace_block'], - 'no_leading_import_slash' => true, - 'no_leading_namespace_whitespace' => true, - 'no_mixed_echo_print' => ['use' => 'echo'], - 'no_multiline_whitespace_around_double_arrow' => true, - 'no_multiline_whitespace_before_semicolons' => true, - 'no_short_bool_cast' => true, - 'no_short_echo_tag' => true, - 'no_singleline_whitespace_before_semicolons' => true, - 'no_spaces_after_function_name' => true, - 'no_spaces_around_offset' => true, - 'no_spaces_inside_parenthesis' => true, - 'no_trailing_comma_in_list_call' => true, - 'no_trailing_comma_in_singleline_array' => true, - 'no_trailing_whitespace' => true, - 'no_trailing_whitespace_in_comment' => true, - 'no_unneeded_control_parentheses' => true, - 'no_unused_imports' => true, - 'no_useless_else' => true, - 'no_useless_return' => true, - 'no_whitespace_before_comma_in_array' => true, - 'no_whitespace_in_blank_line' => true, - 'normalize_index_brace' => true, - 'not_operator_with_space' => false, - 'not_operator_with_successor_space' => false, - 'object_operator_without_whitespace' => true, - 'ordered_class_elements' => false, - 'ordered_imports' => true, - 'php_unit_fqcn_annotation' => true, - 'php_unit_strict' => false, - 'phpdoc_add_missing_param_annotation' => true, - 'phpdoc_align' => true, - 'phpdoc_inline_tag' => true, - 'phpdoc_no_access' => true, - 'phpdoc_no_alias_tag' => ['property-read' => 'property', 'property-write' => 'property', 'type' => 'var'], - 'phpdoc_no_empty_return' => true, - 'phpdoc_no_package' => true, - 'phpdoc_no_useless_inheritdoc' => true, - 'phpdoc_order' => true, - 'phpdoc_return_self_reference' => true, - 'phpdoc_scalar' => true, - 'phpdoc_separation' => false, - 'phpdoc_single_line_var_spacing' => true, - 'phpdoc_summary' => false, - 'phpdoc_to_comment' => true, - 'phpdoc_trim' => true, - 'phpdoc_types' => true, - 'phpdoc_var_without_name' => true, - 'pow_to_exponentiation' => false, - 'pre_increment' => true, - 'protected_to_private' => true, - 'return_type_declaration' => true, - 'semicolon_after_instruction' => true, - 'short_scalar_cast' => true, - 'single_blank_line_at_eof' => true, - 'single_blank_line_before_namespace' => false, - 'single_class_element_per_statement' => true, - 'single_import_per_statement' => true, - 'single_line_after_imports' => true, - 'single_quote' => true, - 'space_after_semicolon' => true, - 'standardize_not_equals' => true, - 'strict_param' => false, - 'switch_case_semicolon_to_colon' => true, - 'switch_case_space' => true, - 'ternary_operator_spaces' => true, - 'ternary_to_null_coalescing' => false, - 'trailing_comma_in_multiline_array' => true, - 'trim_array_spaces' => true, - 'unary_operator_spaces' => true, - 'visibility_required' => true, - 'whitespace_after_comma_in_array' => true, - )) - ->setFinder($finder) -; +return My\PhpCsFixerConfig::create() + ->setFinder( + PhpCsFixer\Finder::create() + ->files() + ->name('*.php') + ->in(__DIR__.'/src') + ->in(__DIR__.'/tests') + ); \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 9194866..7b6a26f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,9 +2,8 @@ language: php sudo: false php: - - 7.0 - - 7.1 - 7.2 + - 7.3 before_script: - composer self-update diff --git a/CHANGELOG.md b/CHANGELOG.md index ec788ed..0c7c815 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,85 +2,65 @@ All notable changes to this project will be documented in this file. -The format is based on [Keep a Changelog](http://keepachangelog.com/) +The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). -## [Unreleased] - -### Fixed - -- Use `phpstan` as a dev dependency to detect bugs - +## [2.0.0] - 2019-11-30 ### Added +- Added argument to `redirect()` option to define a `responseFactory` -- Added `responseFactory` option to `__construct` +### Removed +- Support for PHP 7.0 and 7.1 +- `responseFactory` option ## [1.1.0] - 2018-08-04 - ### Added - - PSR-17 support - New option `responseFactory` ## [1.0.0] - 2018-01-24 - ### Added - - Improved testing and added code coverage reporting - Added tests for PHP 7.2 ### Changed - - Upgraded to the final version of PSR-15 `psr/http-server-middleware` ### Fixed - - Updated license year ## [0.5.0] - 2017-11-13 - ### Changed - - Replaced `http-interop/http-middleware` with `http-interop/http-server-middleware`. ### Removed - - Removed support for PHP 5.x. ## [0.4.0] - 2017-09-21 - ### Changed - - Append `.dist` suffix to phpcs.xml and phpunit.xml files - Changed the configuration of phpcs and php_cs - Upgraded phpunit to the latest version and improved its config file - Updated to `http-interop/http-middleware#0.5` ## [0.3.0] - 2016-12-26 - ### Changed - - Updated tests - Updated to `http-interop/http-middleware#0.4` - Updated `friendsofphp/php-cs-fixer#2.0` ## [0.2.0] - 2016-11-22 - ### Changed - - Updated to `http-interop/http-middleware#0.3` ## [0.1.1] - 2016-10-01 - ### Fixed - - Changed `composer.json` to include the latest version of `middlewares/utils 0.*` ## 0.1.0 - 2016-09-30 - First version -[Unreleased]: https://github.com/middlewares/trailing-slash/compare/v1.1.0...HEAD +[2.0.0]: https://github.com/middlewares/trailing-slash/compare/v1.1.0...v2.0.0 [1.1.0]: https://github.com/middlewares/trailing-slash/compare/v1.0.0...v1.1.0 [1.0.0]: https://github.com/middlewares/trailing-slash/compare/v0.5.0...v1.0.0 [0.5.0]: https://github.com/middlewares/trailing-slash/compare/v0.4.0...v0.5.0 diff --git a/LICENSE b/LICENSE index d46d39c..017c0cd 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2018 +Copyright (c) 2019 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index af29071..a94ce61 100644 --- a/README.md +++ b/README.md @@ -5,13 +5,12 @@ [![Build Status][ico-travis]][link-travis] [![Quality Score][ico-scrutinizer]][link-scrutinizer] [![Total Downloads][ico-downloads]][link-downloads] -[![SensioLabs Insight][ico-sensiolabs]][link-sensiolabs] Middleware to normalize the trailing slash of the uri path. By default removes the slash so, for example, `/post/23/` is converted to `/post/23`. Useful if you have problems with the router. ## Requirements -* PHP >= 7.0 +* PHP >= 7.2 * A [PSR-7 http library](https://github.com/middlewares/awesome-psr15-middlewares#psr-7-implementations) * A [PSR-15 middleware dispatcher](https://github.com/middlewares/awesome-psr15-middlewares#dispatcher) @@ -34,19 +33,37 @@ $dispatcher = new Dispatcher([ $response = $dispatcher->dispatch(new ServerRequest()); ``` -## Options +## Usage -#### `__construct(booll $trailingSlash = false)` +By default, this middleware removes the trailing slash of the uri path. Set `true` to the constructor's first argument to add instead remove: -Set `true` to add the slash instead remove so, for example, `post/23` is converted to `/post/23/`. Note that if the path contains an extension, the slash is **NOT** added. For example, `images/image.png` remains the same, instead be converted to `images/image.png/`. +```php +//Removes the slash, so /post/23/ is converted to /post/23 +$slash = new Middlewares\TrailinSlash(); + +//Force the slash, so /post/23 is converted to /post/23/ +$slash = new Middlewares\TrailinSlash(true); +``` -#### `redirect(true)` +Of course, if the path contains an extension, the slash is **NOT** added. For example, `images/image.png` remains the same, instead be converted to `images/image.png/`. -Set this option to return a `301` response redirecting to the new path +### redirect -#### `responseFactory(Psr\Http\Message\ResponseFactoryInterface $responseFactory)` +If the path must be converted, this option returns a `301` response redirecting to the new path. Optionally, you can provide a `Psr\Http\Message\ResponseFactoryInterface` that will be used to create the redirect response. If it's not defined, [Middleware\Utils\Factory](https://github.com/middlewares/utils#factory) will be used to detect it automatically. + +```php +$responseFactory = new MyOwnResponseFactory(); + +//Simply removes the slash +$slash = new Middlewares\TrailinSlash(); + +//Returns a redirect response to the new path +$slash = (new Middlewares\TrailinSlash())->redirect(); + +//Returns a redirect response to the new path using a specific response factory +$slash = (new Middlewares\TrailinSlash())->redirect($responseFactory); +``` -A PSR-17 factory to create `301` responses. --- Please see [CHANGELOG](CHANGELOG.md) for more information about recent changes and [CONTRIBUTING](CONTRIBUTING.md) for contributing details. @@ -58,10 +75,8 @@ The MIT License (MIT). Please see [LICENSE](LICENSE) for more information. [ico-travis]: https://img.shields.io/travis/middlewares/trailing-slash/master.svg?style=flat-square [ico-scrutinizer]: https://img.shields.io/scrutinizer/g/middlewares/trailing-slash.svg?style=flat-square [ico-downloads]: https://img.shields.io/packagist/dt/middlewares/trailing-slash.svg?style=flat-square -[ico-sensiolabs]: https://img.shields.io/sensiolabs/i/82362f27-d8e9-4808-aed0-ce2cb5e339d4.svg?style=flat-square [link-packagist]: https://packagist.org/packages/middlewares/trailing-slash [link-travis]: https://travis-ci.org/middlewares/trailing-slash [link-scrutinizer]: https://scrutinizer-ci.com/g/middlewares/trailing-slash [link-downloads]: https://packagist.org/packages/middlewares/trailing-slash -[link-sensiolabs]: https://insight.sensiolabs.com/projects/82362f27-d8e9-4808-aed0-ce2cb5e339d4 diff --git a/composer.json b/composer.json index 190d5f6..951670f 100644 --- a/composer.json +++ b/composer.json @@ -17,16 +17,16 @@ "issues": "https://github.com/middlewares/trailing-slash/issues" }, "require": { - "php": "^7.0", - "middlewares/utils": "^2.1", + "php": "^7.2", + "middlewares/utils": "^3.0", "psr/http-server-middleware": "^1.0" }, "require-dev": { - "phpunit/phpunit": "^6.0|^7.0", - "zendframework/zend-diactoros": "^1.3", + "phpunit/phpunit": "^8.1", + "zendframework/zend-diactoros": "^2.2", "friendsofphp/php-cs-fixer": "^2.0", "squizlabs/php_codesniffer": "^3.0", - "phpstan/phpstan": "^0.9.2|^0.10.3" + "oscarotero/php-cs-fixer-config": "^1.0" }, "autoload": { "psr-4": { @@ -43,8 +43,7 @@ "phpunit --coverage-text", "phpcs" ], - "cs-fix": "php-cs-fixer fix .", - "coverage": "phpunit --coverage-html=coverage", - "analyse": "phpstan analyse --no-progress --level 7 src" + "cs-fix": "php-cs-fixer fix", + "coverage": "phpunit --coverage-html=coverage" } } diff --git a/src/TrailingSlash.php b/src/TrailingSlash.php index 16ed486..db5caa1 100644 --- a/src/TrailingSlash.php +++ b/src/TrailingSlash.php @@ -3,7 +3,6 @@ namespace Middlewares; -use Middlewares\Utils\Traits\HasResponseFactory; use Middlewares\Utils\Factory; use Psr\Http\Message\ResponseFactoryInterface; use Psr\Http\Message\ResponseInterface; @@ -13,33 +12,30 @@ class TrailingSlash implements MiddlewareInterface { - use HasResponseFactory; - /** * @var bool Add or remove the slash */ private $trailingSlash; /** - * @var bool Returns a redirect response or not + * @var ResponseFactoryInterface */ - private $redirect = false; + private $responseFactory; /** * Configure whether add or remove the slash. */ - public function __construct(bool $trailingSlash = false, ResponseFactoryInterface $responseFactory = null) + public function __construct(bool $trailingSlash = false) { $this->trailingSlash = $trailingSlash; - $this->responseFactory = $responseFactory ?: Factory::getResponseFactory(); } /** * Whether returns a 301 response to the new path. */ - public function redirect(bool $redirect = true): self + public function redirect(ResponseFactoryInterface $responseFactory = null): self { - $this->redirect = $redirect; + $this->responseFactory = $responseFactory ?: Factory::getResponseFactory(); return $this; } @@ -52,8 +48,8 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface $uri = $request->getUri(); $path = $this->normalize($uri->getPath()); - if ($this->redirect && ($uri->getPath() !== $path)) { - return $this->createResponse(301) + if ($this->responseFactory && ($uri->getPath() !== $path)) { + return $this->responseFactory->createResponse(301) ->withHeader('Location', (string) $uri->withPath($path)); }