Routovací systém v NopCommerce

Posted on Posted in NopCommerce

V dnešním díle se budeme věnovat routovacímu systému a url adresám v NopCommerce. Každá MVC aplikace potřebuje mít routovací systém, aby se dokázala rozhodnout, jakým způsobem bude zpracovávat příchozí http požadavky. V dnešním světě je kladen poměrně velký důraz na hezké url adresy. Ať už se jedná o zvýšení uživatelského komfortu nebo o SEO optimalizaci, tak hezké url adresy jsou nepostradatelné, a to hlavně v oblasti e-commerce.

ASP.NET MVC aplikace mají routovací tabulku, kam je nutné všechny cesty aplikace zaregistrovat. V případě NopCommerce se o tuto roli postará rozhraní IRouteProvider. Vše probíhá opět pomocí reflexe. Při startu aplikace si systém najde všechny třídy, které implementují rozhraní IRouteProvider a postupně zaregistruje všechny cesty.

SEO a přátelské URL

Abychom dokázali pochopit, jakým způsobem systém obsluhuje přátelské url adresy, je nejlepší se podívat do databáze, a to konkrétně na tabulku UrlRecord, která udržuje část url adres aplikace. Při příchozím http požadavku se aplikace podívá do tabulky UrlRecord, kde zjistí, zda najde shodu ve sloupci Slug.

Pokud se tak stane, tak se aplikace již dokáže rozhodnout, jaký controler bude příslušný požadavek obsluhovat. Pokud se jedná například o doménový objekt Category, tak požadavek bude pokračovat do controlleru CatagoryController. Zárověň se předává i identifikátor doménového objektu, aby se mohla načíst všechna data.

Když se podíváte do kódu zjistíte, že přístup do databáze je trochu sofistikovanější, než jsem naznačil. Systém NopCommerce se snaží na nejvíce zatížených místech využít cache a to routování rozhodně je.

Aby aplikace co nejvíce snížila vytížení databáze, tak NopCommerce umožňuje při startu načíst všechny adresy do cache systému, takže při obsluze dalších http požadavků již databázi nezatěžujete a čtete data z paměti. V případě, že nevyužíváte načtení adres při startu aplikace, tak NopCommerce ukládá do cache systému url adresy, až ve chvíli, kdy přijde http požadavek na konkrétní adresu. To znamená, že při druhém dotazu na stejnou stránku se nedotazujeme do databáze, ale pouze do paměti.

Třída UrlRecordService se stará o režii spojenou s ukládáním, mazáním a načítáním url adres. S url adresami a SEO souvisí i další stěžejní záležitost, a to je soubor sitemap.xml. V našem případě je za generování obsahu souboru sitemap.xml zodpovědná třída SitemapGenerator. Takže není nutné používat nástroje třetích stran pro vygenerování mapy webu. Soubor je pak dostupný na adrese vas-obchod.cz/sitemap.xml

IRouteProvider

Jak jsme již viděli, když budete chtít zaregistrovat novou cestu v aplikaci, budete muset implementovat rozhraní IRouteProvider.

 

namespace Nop.Web.Framework.Mvc.Routes
{
    public interface IRouteProvider
    {
        void RegisterRoutes(RouteCollection routes);
        int Priority { get; }
    }
}

 

Můžeme se podívat, jak vypadá jednoduchá implementace pro modul externího přihlášení pomocí Facebooku.

namespace Nop.Plugin.ExternalAuth.Facebook
{
    public partial class RouteProvider : IRouteProvider
    {
        public void RegisterRoutes(RouteCollection routes)
        {
            routes.MapRoute("Plugin.ExternalAuth.Facebook.Login",
                 "Plugins/ExternalAuthFacebook/Login",
                 new { controller = "ExternalAuthFacebook", action = "Login" },
                 new[] { "Nop.Plugin.ExternalAuth.Facebook.Controllers" }
            );

            routes.MapRoute("Plugin.ExternalAuth.Facebook.LoginCallback",
                 "Plugins/ExternalAuthFacebook/LoginCallback",
                 new { controller = "ExternalAuthFacebook", action = "LoginCallback" },
                 new[] { "Nop.Plugin.ExternalAuth.Facebook.Controllers" }
            );
        }
        public int Priority
        {
            get
            {
                return 0;
            }
        }
    }
}

 

V metodě RegisterRoutes se registrují jednotlivé cesty, jak jsme na to zvyklí z klasických ASP.NET MVC aplikací. Na co je dobré upozornit je vlastnost priority. Routovací systém totiž funguje na principu, že první nalezená cesta vyhrává. Takže v případě, že budete mít dvě stejné cesty do různých controllerů, tak systém upřednostní cestu s vyšší prioritou.

Každý modul a rozšíření bude obsahovat IRouteProvider, abyste mohli modul konfigurovat a používat. Můžete se však dostat i do situace, že budete přizpůsobovat zdrojový kód NopCommerce a budete si chtít přidat controller přímo do aplikace.  Jak tedy na to?

Jediné úskalí, na které asi narazíte je, kde naleznete třídu RouteProvider. Třída se nachází ve složce infrastructure. Takže pouze stačí přidat cestu na Váš nově vytvořený controller do souboru a můžete využívat celou infrastrukturu NopCommerce.