Table des matières
Qu'est-ce que le composant de routage Symfony ?
Installation et configuration
Configurer le routage de base
paramètres fournis sous forme de chaînes.
RequestContext 对象" >初始化 RequestContext 对象
UrlMatcher 对象" >初始化 UrlMatcher 对象
如何匹配路由
从 YAML 文件加载路由
路由 YAML 文件
示例文件
一体化路由器
将路由创建为注释:推荐方式
结论
Maison développement back-end tutoriel php Configurer le routage dans les applications PHP à l'aide du composant de routage Symfony

Configurer le routage dans les applications PHP à l'aide du composant de routage Symfony

Sep 03, 2023 pm 10:37 PM
php应用程序 composant de routage Symfony Configurer le routage

Configurer le routage dans les applications PHP à laide du composant de routage Symfony

Qu'est-ce que le composant de routage Symfony ?

Le composant de routage Symfony est un composant de routage très populaire qui est adapté de plusieurs frameworks et offre beaucoup de flexibilité si vous souhaitez mettre en place le routage dans votre application PHP.

Si vous avez créé une application PHP personnalisée et recherchez une bibliothèque de routage riche en fonctionnalités, alors Symfony Routing Component est l'un des meilleurs candidats. Il vous permet également de définir les routes de votre application au format YAML.

En commençant par l'installation et la configuration, nous démontrerons à travers des exemples pratiques les différentes options dont dispose ce composant pour la configuration du routage. Dans cet article, vous découvrirez :

  • Installation et configuration des composants de routage Symfony
  • Comment configurer un itinéraire de base
  • Comment charger des itinéraires à partir d'un fichier YAML
  • Créer des itinéraires en commentaires : Voie recommandée

Installation et configuration

Dans cette section, nous installerons les bibliothèques nécessaires à la configuration du routage dans les applications PHP. Je suppose que Composer est déjà installé sur votre système car nous en avons besoin pour installer les bibliothèques nécessaires disponibles sur Packagist.

Après avoir installé Composer, procédez à l'installation des composants de routage principaux à l'aide des commandes suivantes.

$composer require symfony/routing
Copier après la connexion

Bien que le composant de routage lui-même soit suffisant pour fournir des capacités de routage complètes dans votre application, nous allons également installer quelques composants supplémentaires pour nous faciliter la vie et enrichir la fonctionnalité de routage de base existante.

Tout d'abord, nous allons procéder à l'installation du composant HttpFoundation, qui fournit des wrappers orientés objet pour les variables globales PHP et les fonctions liées aux réponses. Cela garantit que vous n'avez pas besoin d'accéder directement à des variables globales comme $_GET$_POST.

$composer require symfony/http-foundation
Copier après la connexion

Ensuite, si vous souhaitez définir vos routes d'application dans un fichier YAML au lieu du code PHP, le composant YAML entre en jeu car il vous aide à convertir les chaînes YAML en tableaux PHP et vice versa.

$composer require symfony/yaml
Copier après la connexion

Enfin, nous installerons le composant Config, qui fournit plusieurs classes utilitaires pour initialiser et traiter les valeurs de configuration définies dans différents types de fichiers (tels que YAML, INI, XML, etc.). Dans notre cas, nous l'utiliserons pour charger des routes à partir d'un fichier YAML.

$composer require symfony/config
Copier après la connexion

C'est la partie installation, mais comment êtes-vous censé l'utiliser ? En fait, incluez simplement le fichier autoload.php créé par Composer dans votre application, comme indiqué dans l'extrait de code suivant.

<?php
require_once './vendor/autoload.php';
 
// application code
?>
Copier après la connexion

Configurer le routage de base

Dans la section précédente, nous avons terminé l'installation des composants de routage nécessaires. Vous pouvez désormais configurer instantanément le routage dans votre application PHP.

Allons-y et créons le fichier basic_routes.php avec le contenu suivant.

<?php
require_once './vendor/autoload.php';
 
use Symfony\Component\Routing\Matcher\UrlMatcher;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Generator\UrlGenerator;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
 
try
{
    // Init basic route
    $foo_route = new Route(
      '/foo',
      array('controller' => 'FooController')
    );
 
    // Init route with dynamic placeholders
    $foo_placeholder_route = new Route(
      '/foo/{id}',
      array('controller' => 'FooController', 'method'=>'load'),
      array('id' => '[0-9]+')
    );
 
    // Add Route object(s) to RouteCollection object
    $routes = new RouteCollection();
    $routes->add('foo_route', $foo_route);
    $routes->add('foo_placeholder_route', $foo_placeholder_route);
 
    // Init RequestContext object
    $context = new RequestContext();
    $context->fromRequest(Request::createFromGlobals());
 
    // Init UrlMatcher object
    $matcher = new UrlMatcher($routes, $context);
 
    // Find the current route
    $parameters = $matcher->match($context->getPathInfo());
 
    // How to generate a SEO URL
    $generator = new UrlGenerator($routes, $context);
    $url = $generator->generate('foo_placeholder_route', array(
      'id' => 123,
    ));
 
    echo '<pre class="brush:php;toolbar:false">';
    print_r($parameters);
 
    echo 'Generated URL: ' . $url;
    exit;
}
catch (ResourceNotFoundException $e)
{
  echo $e->getMessage();
}
Copier après la connexion

La configuration du routage à l'aide du composant Symfony Routing implique généralement une série d'étapes répertoriées ci-dessous.

  • Initialisez Route objet pour chaque itinéraire d'application.
  • Ajoutez tous les Route 对象添加到 RouteCollection objets aux
  • objets.
  • RequestContextInitialisez l'objet
  • , qui enregistre les informations contextuelles de la requête actuelle.
  • RouteCollection 对象和 RequestContext 对象来初始化 UrlMatcherInitialisez l'objet UrlMatcher en passant l'objet
  • et l'objet
.

Initialiser les objets de routage pour différents itinérairesfoo

Allons-y et définissons un itinéraire

très basique. Route

$foo_route = new Route(
  '/foo',
  array('controller' => 'FooController')
);
Copier après la connexion

Le premier paramètre du constructeur est le chemin URI et le deuxième paramètre est un tableau de propriétés personnalisées à renvoyer lors de la correspondance avec cette route spécifique. En règle générale, il s'agit d'une combinaison de contrôleurs et de méthodes que vous appelez lorsque cette route est demandée.

Jetons ensuite un œil au routage paramétré. foo/1foo/123 等类似的 URI。请注意,我们将 {id} 参数限制为仅限数字值,因此它不会匹配 foo/bar 这样的 URI,因为 {id}

$foo_placeholder_route = new Route(
  '/foo/{id}',
  array('controller' => 'FooController', 'method'=>'load'),
  array('id' => '[0-9]+')
);
Copier après la connexion

Les itinéraires ci-dessus peuvent correspondre aux

paramètres fournis sous forme de chaînes.

Ajoutez tous les objets route à l'objet RouteCollectionRouteCollection

L'étape suivante consiste à ajouter l'objet de routage que nous avons initialisé dans la section précédente à l'objet 🎜. 🎜
$routes = new RouteCollection();
$routes->add('foo_route', $foo_route);
$routes->add('foo_placeholder_route', $foo_placeholder_route);
Copier après la connexion

正如您所看到的,这非常简单,您只需要使用 RouteCollection 对象的 add 方法来添加路由对象。 add 方法的第一个参数是路由名称,第二个参数是路由对象本身。

初始化 RequestContext 对象

接下来,我们需要初始化RequestContext对象,该对象保存当前请求上下文信息。当我们初始化 UrlMatcher 对象时,我们将需要这个对象,因为我们稍后会详细介绍它。

$context = new RequestContext();
$context->fromRequest(Request::createFromGlobals());
Copier après la connexion

初始化 UrlMatcher 对象

最后,我们需要初始化 UrlMatcher 对象以及路由和上下文信息。

// Init UrlMatcher object
$matcher = new UrlMatcher($routes, $context);
Copier après la connexion

现在,我们拥有了可以匹配路线的一切。

如何匹配路由

这是 UrlMatcher 对象的 match 方法,它允许您将任何路由与一组预定义路由进行匹配。

match 方法将 URI 作为其第一个参数,并尝试将其与预定义的路由进行匹配。如果找到该路由,它将返回与该路由关联的自定义属性。另一方面,如果没有与当前 URI 关联的路由,它会抛出 ResourceNotFoundException 异常。

$parameters = $matcher->match($context->getPathInfo());
Copier après la connexion

在我们的例子中,我们通过从 $context 对象获取当前 URI 来提供它。因此,如果您访问 https://your-domain/basic_routes.php/foo URL,则 $context->getPathInfo() 返回 foo,并且我们已经为 foo URI 定义了一条路由,因此它应该返回以下内容。

Array
(
    [controller] => FooController
    [_route] => foo_route
)
Copier après la connexion

现在,让我们继续访问 http://your-domain/basic_routes.php/foo/123 URL 来测试参数化路由。

Array
(
    [controller] => FooController
    [method] => load
    [id] => 123
    [_route] => foo_placeholder_route
)
Copier après la connexion

如果您可以看到 id 参数与适当的值 123 绑定,则说明有效。

接下来,让我们尝试访问不存在的路由,例如 http://your-domain/basic_routes.php/unknown-route,您应该会看到以下消息。

No routes found for "/unknown-route".
Copier après la connexion

这就是如何使用 match 方法查找路由。

除此之外,您还可以使用路由组件在应用程序中生成链接。提供了 RouteCollectionRequestContext 对象,UrlGenerator 允许您为特定路由构建链接。

$generator = new UrlGenerator($routes, $context);
$url = $generator->generate('foo_placeholder_route', array(
  'id' => 123,
));
Copier après la connexion

generate 方法的第一个参数是路由名称,第二个参数是数组,如果是参数化路由,则可以包含参数。上面的代码应该生成 /basic_routes.php/foo/123 URL。

从 YAML 文件加载路由

在上一节中,我们使用 RouteRouteCollection 对象构建了自定义路由。事实上,路由组件提供了不同的方式供您选择来实例化路由。您可以从各种加载器中进行选择,例如 YamlFileLoaderXmlFileLoaderPhpFileLoader

在本节中,我们将通过 YamlFileLoader 加载器来了解如何从 YAML 文件加载路由。

路由 YAML 文件

继续创建包含以下内容的 routes.yaml 文件。

foo_route:
    path:     /foo
    controller: App\Controller\FooController::index
    methods:    GET
 
foo_placeholder_route:
    path:     /foo/{id}
    controller: App\Controller\FooController::load
    methods:    GET
    requirements:
        id: '[0-9]+'
Copier après la connexion

示例文件

接下来,继续使用以下内容创建 load_routes_from_yaml.php 文件。

load('routes.yaml');
 
    // Init RequestContext object
    $context = new RequestContext();
    $context->fromRequest(Request::createFromGlobals());
 
    // Init UrlMatcher object
    $matcher = new UrlMatcher($routes, $context);
 
    // Find the current route
    $parameters = $matcher->match($context->getPathInfo());
 
    // How to generate a SEO URL
    $generator = new UrlGenerator($routes, $context);
    $url = $generator->generate('foo_placeholder_route', array(
      'id' => 123,
    ));
 
    echo '
';
    print_r($parameters);
 
    echo 'Generated URL: ' . $url;
    exit;
}
catch (ResourceNotFoundException $e)
{
  echo $e->getMessage();
}
Copier après la connexion

在这种情况下唯一不同的是我们初始化路由的方式!

$fileLocator = new FileLocator(array(__DIR__));
$loader = new YamlFileLoader($fileLocator);
$routes = $loader->load('routes.yaml');
Copier après la connexion

我们使用 YamlFileLoader 加载器从 routes.yaml 文件加载路由,而不是直接在 PHP 本身中对其进行初始化。除此之外,一切都是相同的,并且应该产生与 basic_routes.php 文件相同的结果。

一体化路由器

在本节中,我们将介绍 Router 类,它允许您使用更少的代码行快速设置路由。

继续制作包含以下内容的 all_in_one_router.php 文件。

<?php
require_once './vendor/autoload.php';
 
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\Router;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Generator\UrlGenerator;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\Routing\Loader\YamlFileLoader;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
 
try
{
    $fileLocator = new FileLocator(array(__DIR__));
 
    $requestContext = new RequestContext();
    $requestContext->fromRequest(Request::createFromGlobals());
 
    $router = new Router(
        new YamlFileLoader($fileLocator),
        'routes.yaml',
        array('cache_dir' => __DIR__.'/cache'),
        $requestContext
    );
 
    // Find the current route
    $parameters = $router->match($requestContext->getPathInfo());
 
    // How to generate a SEO URL
    $routes = $router->getRouteCollection();
    $generator = new UrlGenerator($routes, $requestContext);
    $url = $generator->generate('foo_placeholder_route', array(
      'id' => 123,
    ));
 
    echo '<pre class="brush:php;toolbar:false">';
    print_r($parameters);
 
    echo 'Generated URL: ' . $url;
    exit;
}
catch (ResourceNotFoundException $e)
{
  echo $e->getMessage();
}
Copier après la connexion

一切都几乎相同,除了我们实例化了 Router 对象以及必要的依赖项。

$router = new Router(
    new YamlFileLoader($fileLocator),
    'routes.yaml',
    array('cache_dir' => __DIR__.'/cache'),
    $requestContext
);
Copier après la connexion

完成后,您可以立即使用 Router 对象的 match 方法进行路由映射。

$parameters = $router->match($requestContext->getPathInfo());
Copier après la connexion

此外,您还需要使用 Router 对象的 getRouteCollection 方法来获取路由。

$routes = $router->getRouteCollection();
Copier après la connexion

将路由创建为注释:推荐方式

在本节中,我们将讨论如何实现基于注释的路由。它正在成为在不同框架之间定义路由的最流行的方法之一。

在我们继续实现基于注释的路由之前,我们需要安装几个软件包。让我们快速完成此操作,如以下代码片段所示。

$composer require symfony/framework-bundle
$composer require doctrine/annotations
$composer require doctrine/cache
Copier après la connexion

如您所见,我们安装了三个不同的组件。

在您的 composer.json 文件中,添加以下内容:

"autoload": {
    "psr-4": {
        "App\\": "app/"
    }
}
Copier après la connexion

现在,运行以下命令。

$composer dump-autoload
Copier après la connexion

现在,我们准备好文件了。

继续创建包含以下内容的 index.php 文件。

load(__DIR__ . '/src/Controller/');
$context = new RequestContext();
$context->fromRequest(Request::createFromGlobals());

$matcher = new UrlMatcher($routes, $context);
$parameters = $matcher->match($context->getPathInfo());

$controllerInfo = explode('::',$parameters['_controller']);

$controller = new $controllerInfo[0];
$action = $controllerInfo[1];

$controller->$action();
Copier après la connexion

现在,让我们在 src/Controller/FooController.php 中创建包含以下内容的控制器文件。

<?php
namespace App\Controller;

use Symfony\Component\Routing\Annotation\Route;

class DefaultController
{
    /**
     * @Route("/",name="index")
     */
    public function index()
    {
        echo "Index action";
    }

    /**
     * @Route("/hello",name="hello")
     */
    public function hello()
    {
        echo "Hello action";
    }
}
Copier après la connexion

您可能已经注意到,我们以注释的形式为每个方法定义了路由。这种方法的好处是,它允许您在与这些路由关联的控制器的代码旁边定义路由。

继续访问 https://your-domain/index.php/ URL。根据以下路由配置,它应该调用 index 方法。

/**
 * @Route("/",name="index")
 */
Copier après la connexion

另一方面,如果您尝试访问 http://your-domain/index.php/hello URL,它应该调用 DefaultController 控制器的 hello 方法类。

这就是基于注释的路由的工作原理!

结论

继续探索路由组件中可用的其他选项。

今天,我们探索了 Symfony 路由组件,它使得在 PHP 应用程序中实现路由变得轻而易举。在此过程中,我们创建了一些示例来演示路由组件的各个方面。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Commandes de chat et comment les utiliser
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

L'arme secrète pour accélérer le déploiement d'applications PHP : Deployer L'arme secrète pour accélérer le déploiement d'applications PHP : Deployer Jul 12, 2023 am 10:22 AM

L'arme secrète pour accélérer le déploiement d'applications PHP : Le déploiement rapide et efficace des applications a toujours été l'une des tâches importantes de l'équipe de développement logiciel. Dans le développement PHP, le déploiement d'une application implique généralement plusieurs étapes telles que le téléchargement de fichiers, la mise à jour du code et la configuration de l'environnement. Afin de simplifier et d'accélérer ce processus, des outils et technologies de développement modernes sont progressivement introduits, et l'une des armes secrètes largement reconnues est le Deployer. Deployer est une bibliothèque PHP pour le déploiement automatisé d'applications

Comment déployer des applications PHP à l'aide de Deployer Comment déployer des applications PHP à l'aide de Deployer Jul 12, 2023 pm 07:03 PM

Comment utiliser Deployer pour déployer des applications PHP Dans le processus de développement logiciel moderne, le déploiement automatisé devient de plus en plus important. Deployer est un outil de déploiement PHP simple et puissant, qui peut nous aider à déployer facilement des applications PHP. Cet article explique comment utiliser Deployer pour déployer des applications PHP et fournit quelques exemples de code. 1. Installer Deployer Tout d’abord, nous devons installer Deployer via Composer. Exécutez la commande suivante dans la ligne de commande

Configurer le routage dans les applications PHP à l'aide du composant de routage Symfony Configurer le routage dans les applications PHP à l'aide du composant de routage Symfony Sep 03, 2023 pm 10:37 PM

Que sont les composants de routage Symfony ? Le composant de routage Symfony est un composant de routage très populaire qui est adapté de plusieurs frameworks et offre beaucoup de flexibilité si vous souhaitez mettre en place le routage dans votre application PHP. Si vous avez créé une application PHP personnalisée et recherchez une bibliothèque de routage riche en fonctionnalités, Symfony Routing Component est l'un des meilleurs candidats. Il vous permet également de définir les routes de votre application au format YAML. En commençant par l'installation et la configuration, nous démontrerons à travers des exemples pratiques les différentes options dont dispose ce composant pour la configuration du routage. Dans cet article, vous apprendrez : Installation et configuration du composant de routage Symfony Comment mettre en place une route de base Comment charger une route à partir d'un fichier YAML Créer une route sous forme d'annotation :

Comment utiliser Memcache pour améliorer les performances et la disponibilité des applications PHP ? Comment utiliser Memcache pour améliorer les performances et la disponibilité des applications PHP ? Nov 08, 2023 pm 09:57 PM

Comment utiliser Memcache pour améliorer les performances et la disponibilité des applications PHP ? Introduction : Avec le développement rapide des applications Internet et l'augmentation des visites des utilisateurs, l'amélioration des performances et de la disponibilité des applications est devenue l'un des problèmes que les développeurs doivent résoudre de toute urgence. Parmi eux, l’utilisation du cache est une méthode d’optimisation courante. Memcache est une technologie de mise en cache couramment utilisée qui peut améliorer considérablement les performances et la disponibilité des applications. Cet article explique comment utiliser Memcache dans les applications PHP et donne des exemples de code spécifiques. Installer

Déploiement batch efficace d'applications PHP : à l'aide de Deployer Déploiement batch efficace d'applications PHP : à l'aide de Deployer Jul 12, 2023 am 08:36 AM

Déploiement par lots efficace d'applications PHP : Utiliser Deployer Introduction : Avec l'essor du cloud computing, de la conteneurisation et de l'architecture de microservices, le déploiement d'applications modernes est devenu de plus en plus complexe et fastidieux. Surtout dans les situations où une équipe de développement doit déployer fréquemment plusieurs applications PHP, le déploiement manuel de chaque application prend beaucoup de temps et est sujet aux erreurs. Pour résoudre ce problème, nous pouvons utiliser l'outil Deployer pour automatiser et simplifier le processus de déploiement des applications PHP. Dans cet article, nous présenterons le Deployer

Comment optimiser le temps de réponse des applications PHP grâce à la technologie de mise en cache ? Comment optimiser le temps de réponse des applications PHP grâce à la technologie de mise en cache ? Jun 20, 2023 pm 12:12 PM

Ces dernières années, alors que les applications Web sont devenues de plus en plus complexes, la manière d'optimiser le temps de réponse des applications Web est devenue un sujet brûlant. Parmi eux, la technologie de mise en cache constitue un moyen important pour optimiser le temps de réponse. Dans cet article, nous détaillerons comment optimiser le temps de réponse des applications PHP grâce à la technologie de mise en cache. 1. Pourquoi la mise en cache est-elle nécessaire ? Lorsqu'un utilisateur accède à une application Web, le serveur Web analyse le script PHP en code HTML et le renvoie au navigateur de l'utilisateur. Cependant, si le script PHP est très complexe, avant de renvoyer HTM

Application d'outils de tests de sécurité aux applications PHP Application d'outils de tests de sécurité aux applications PHP Aug 07, 2023 pm 07:36 PM

Application d'outils de tests de sécurité aux applications PHP Avec le développement d'Internet, l'utilisation d'applications PHP dans le réseau devient de plus en plus courante. Cependant, les menaces à la sécurité augmentent également. Pour garantir la sécurité des applications PHP, les développeurs doivent effectuer des tests de sécurité efficaces. Cet article présentera certains outils de test de sécurité couramment utilisés et fournira des exemples de code pertinents pour aider les développeurs à mieux protéger leurs applications. Outils d'analyse de code statique Les outils d'analyse de code statique peuvent vérifier les vulnérabilités potentielles du code source et fournir des informations pertinentes.

Discussion sur la façon dont le cache Memcached optimise les applications PHP Discussion sur la façon dont le cache Memcached optimise les applications PHP Jun 20, 2023 am 08:43 AM

Memcached est un système de mise en cache distribué open source, facile à déployer et léger, largement utilisé dans la mise en cache des applications Web. Il peut être utilisé pour résoudre les goulots d'étranglement d'accès aux bases de données souvent utilisés dans les applications Web plus volumineuses, tout en améliorant les performances des applications. Dans cet article, nous verrons comment utiliser Memcached pour optimiser la mise en cache des applications PHP. Utilisation de la mise en cache L'utilisation de la mise en cache peut réduire efficacement le nombre de requêtes sur la base de données dans une application Web. Parce que si un résultat de requête existe déjà

See all articles