SymfonyWorld Online 2021 Winter Edition December 9 – 10, 2021 100% Online 25 talks and 10 workshops

New in Symfony 5.4: Filesystem Path Class

Symfony 5.4 is backed by Private Packagist. Private Packagist is a fast, reliable, and secure Composer repository for your private packages. It mirrors all your open-source dependencies for better availability and monitors them for security vulnerabilities.

Contributed by
Théo FIDRY
in #41954.

The Filesystem component is a small utility component that provides functions related to the filesystem which are independent of the underlying operating system. Its scope is small, but it's so convenient that it has more than 200 million downloads.

In Symfony 5.4 we're improving this component by adding a new Path class. This class provides utilities to manipulate file/dir paths in a consistent manner. For example, it includes a canonicalize() method that normalizes slashes, resolves .. segments, etc.

1
2
3
4
use  Symfony\Component\Filesystem\Path;

echo Path::canonicalize('../uploads/../config/config.yaml');
// => ../config/config.yaml

PHP provides a dirname() function to get the directory path of a given file path, but it has some quirks. The Path class provides a getDirectory() method as an alternative:

1
2
3
4
5
6
7
dirname('C:/Programs');  // returns 'C:', not 'C:/'
dirname('C:/');          // returns '.', not 'C:/'

Path::getDirectory('C:/');            // returns 'C:/'
Path::getDirectory('C:/Programs');    // returns 'C:/'
Path::getDirectory('C:\\');           // returns 'C:/'
Path::getDirectory('C:\\Programs');   // returns 'C:/'

This class includes many other utilities that come in handy in web applications, such as finding the longest common part of some file paths:

1
2
3
4
5
6
7
8
9
10
$paths = [
    '/var/www/vhosts/project/httpdocs/config/config.yaml',
    '/var/www/vhosts/project/httpdocs/config/routing.yaml',
    '/var/www/vhosts/project/httpdocs/config/services.yaml',
    '/var/www/vhosts/project/httpdocs/images/banana.gif',
    '/var/www/vhosts/project/httpdocs/uploads/images/nicer-banana.gif',
];

Path::getLongestCommonBasePath($paths);
// return '/var/www/vhosts/project/httpdocs'

Do you want to sponsor the Symfony Filesystem component? Thanks to the new Symfony sponsoring program your company logo can be displayed next to the Filesystem component on GitHub and symfony.com. Browse Symfony support, select the "Symfony Backers" option and send us a message to get more details.

Help the Symfony project!

As with any Open-Source project, contributing code or documentation is the most common way to help, but we also have a wide range of sponsoring opportunities.

Comments

It's worth noting that this class is more or less an import of the webmozart/path-util: https://github.com/webmozart/path-util

As the original creator is searching for maintainers, Théo FIDRY proposed to include it in the Filesystem component. Happy to welcome the library in the Symfony community :)
That's a good point Wouter! I wasn't sure about how much "old code" was maintained in this new feature. But, you are right: let's thank Bernhard Schussek too for his work on the original package 👏
Login with SymfonyConnect to post a comment