中文字幕一区二区人妻电影,亚洲av无码一区二区乱子伦as ,亚洲精品无码永久在线观看,亚洲成aⅴ人片久青草影院按摩,亚洲黑人巨大videos

是時候給Drupal換個樣子了嗎?

發(fā)布于:2020-12-24 16:05:27

10

84

0

公告 cms drupal php stackoverflow

Drupal 9剛剛發(fā)布,開源CMS已接近20年。 對于許多開發(fā)人員而言,“ CMS”讓人想起2000年代后期的幽靈-十年間,Internet Explorer仍占據(jù)瀏覽器市場份額的65%,尚未提出HTML5規(guī)范,Git只是在VCS領(lǐng)域確立了統(tǒng)治地位,而jQuery 是JavaScript庫的原作者。 但是,如果這是想到Drupal時腦海中的影像,那么該換個角度了。

房間里的elePHPant

在撰寫本文時,我意識到Drupal的臭名昭著的區(qū)別是在Stack Overflow的2020年開發(fā)人員調(diào)查中獲得了第二個最令人恐懼的Web框架,而PHP是其編寫的基礎(chǔ)語言,在該排名中排名第六 可怕的語言列表。

當(dāng)然,這并不是任何開放源代碼社區(qū)都會為之驕傲的徽章-那么Drupal 9值得一看的是什么呢?

我們可以僅僅因為Drupal被廣泛使用而忽略了這一點,但是我們擁有更好的數(shù)據(jù)。 對Drupal以及其他開放源代碼和專有CMS的情緒調(diào)查發(fā)現(xiàn),Drupal的最大負(fù)面情緒來自初次使用的用戶,但隨著平臺上用戶的專業(yè)知識,這種情緒變得越來越積極。 這說明只有專家級別的用戶會對使用Drupal的清晰度有積極的印象,并且通常會推薦給其他人。

 

Drupal社區(qū)在受調(diào)查的開發(fā)人員和最終用戶中確定了一些推動這一觀點的關(guān)鍵領(lǐng)域:易用性和總擁有成本(尤其是困難的主要版本升級)。改善初學(xué)者體驗(針對開發(fā)人員,貢獻(xiàn)者和最終用戶)。

讓我們看一下Drupal項目如何解決這些初學(xué)者和中級用戶的問題,然后看一下使學(xué)習(xí)曲線對專家級用戶有價值的基本功能。

即使這種探索并不能說服您在下一個Web開發(fā)項目中使用Drupal,但管理成熟的開源項目的經(jīng)驗對于任何開源社區(qū)的貢獻(xiàn)者來說都應(yīng)該是有價值的。

讓我們開始吧。

輕松升級

在多年的開發(fā)和新的主要版本中,關(guān)于管理大型軟件項目存在兩種思想流派:

一、項目可以選擇將向后兼容性作為優(yōu)先重點。以WordPress為例,“力爭永不向后兼容”,目標(biāo)是“用戶無需擔(dān)心就可以輕松更新”。

1.優(yōu)點:對后向兼容性的高度關(guān)注對初學(xué)者非常友好。對于管理更大規(guī)模部署的更高級的用戶或工程團(tuán)隊,這種精神可以使保持最新狀態(tài)的任務(wù)不再那么艱巨。

2.缺點:在這種極端情況下保持向后兼容性會導(dǎo)致大量代碼庫崩潰,導(dǎo)致執(zhí)行相同功能的API數(shù)組混亂,并阻止采用新的最佳實踐或技術(shù)。

二、項目可以選擇專注于最新的體系結(jié)構(gòu)創(chuàng)新和最佳實踐,以犧牲主要版本之間的完全不兼容為代價。

1.優(yōu)點:該項目可以采用最新的技術(shù)標(biāo)準(zhǔn)和創(chuàng)新,并根據(jù)從先前版本的多年經(jīng)驗中學(xué)到的所有經(jīng)驗來重寫技術(shù)??梢詣h除舊版代碼,并為新功能保留貢獻(xiàn)者時間,而將重點放在兼容性上。

 2.缺點:主要版本之間的任何升級實際上都是完整的平臺重組。從一個版本轉(zhuǎn)移到另一個版本的數(shù)據(jù)必須遷移,而不是就地更新。用戶群必須在主要版本之間重新學(xué)習(xí)平臺。

從最初的版本到版本7,Drupal遵循后一種開發(fā)理念,犧牲了向后兼容性和易于更新的特性,以重塑架構(gòu)以與最新標(biāo)準(zhǔn)和創(chuàng)新保持同步。

從Drupal 8開始,該項目對開發(fā)哲學(xué)進(jìn)行了根本性的轉(zhuǎn)變,以橋接這兩種哲學(xué):采用語義版本控制(SemVer)和嚴(yán)格的棄用策略。 SemVer仍然被許多開發(fā)人員廣泛誤解,因此值得重申一下它的含義:

一、SemVer版本架構(gòu)為:MAJOR.MINOR.PATCH,其中三個版本組件中的每個組件(自然)具有語義:

       1.任何不兼容的API更改都必須增加MAJOR版本。

       2.以向后兼容的方式添加新功能需要增加MINOR版本。

       3.向后兼容的錯誤修復(fù)程序并不會從根本上改變功能,因此會增加PATCH版本。

二、通過采用SemVer與精心設(shè)計的棄用策略相結(jié)合,Drupal試圖將這兩種理念之間的差異進(jìn)行劃分

       1.優(yōu)點:Drupal現(xiàn)在可以維護(hù)一個明確的向后兼容性窗口,以實現(xiàn)更可預(yù)測的升級,同時可以持續(xù)采用新技術(shù)和最佳實踐。

       2.缺點:軟件開發(fā)人員不是完美的邏輯學(xué)家,有時在構(gòu)成向后兼容的突破性變化方面存在主觀性或模糊性。人為錯誤有時可能意味著向后兼容承諾在補(bǔ)丁程序或次要發(fā)行版中被出賣。

改善初學(xué)者體驗

改善初學(xué)者的體驗是一項比較主觀的工作,由于要考慮許多角色,因此更加復(fù)雜。

一、開發(fā)人員:以Drupal為框架。

二、Site Builders:在管理界面的無代碼上下文中組裝和配置模塊以及自定義結(jié)構(gòu)組件(如內(nèi)容類型)。

三、最終用戶:內(nèi)容編輯者,通常是開發(fā)人員為其構(gòu)建體驗的組成部分。

我們將保留最終用戶體驗,以檢查Drupal的功能,因為這種體驗的質(zhì)量在很大程度上取決于開發(fā)團(tuán)隊和創(chuàng)建該體驗的網(wǎng)站建設(shè)者的特定實施方式。 Drupal并非開箱即用,因此針對不同用例和環(huán)境的配置看起來可能有很大不同。但是,我們將重點介紹一些結(jié)構(gòu)性功能,這些功能使Drupal開發(fā)人員有能力構(gòu)建這些體驗。

讓我們來看看Drupal通過2020年內(nèi)容管理系統(tǒng)應(yīng)提供的功能為開發(fā)人員和網(wǎng)站建設(shè)者提供的功能。

今天的內(nèi)容管理與十年前不同

 

如今,內(nèi)容管理的問題空間與十年前大不相同。十年前,大多數(shù)實現(xiàn)仍集中在基礎(chǔ)知識上:提供一個既可以充當(dāng)編輯內(nèi)容存儲又可以充當(dāng)顯示層的整體框架-通常采用一種結(jié)合在一起的方法來使用第三方模塊和主題。

既定的CMS項目已廣泛分享了對CMS應(yīng)具有的早期了解,近年來,Wix.com,Squarespace等廉價專有服務(wù)已將其商品化。

現(xiàn)代內(nèi)容管理系統(tǒng)必須提供更強(qiáng)大的功能:

一、一個結(jié)構(gòu)化的數(shù)據(jù)引擎,提供豐富的元數(shù)據(jù),并使內(nèi)容可用作可重用的組件。

二、結(jié)構(gòu)化數(shù)據(jù)構(gòu)成使現(xiàn)代CMS變得強(qiáng)大的所有其他功能的基礎(chǔ)。當(dāng)數(shù)據(jù)本身被構(gòu)造為原子成分時,可以將其發(fā)布到不同的端點或顯示中,無論是博客的直接RSS提要還是GraphQL查詢的結(jié)構(gòu)化響應(yīng)。

三、健壯的API,通過API提供的功能與管理UI中提供的功能之間具有完全的功能奇偶校驗。

以編程方式公開CMS的功能是實現(xiàn)超越傳統(tǒng)網(wǎng)頁的數(shù)字體驗的基礎(chǔ):這些API可以實現(xiàn)無頭或分離的體驗,其中CMS管理數(shù)據(jù),但用于顯示數(shù)據(jù)的一個或多個端點是單獨構(gòu)建的前端應(yīng)用程序。

編輯和工作流工具,以及強(qiáng)大的角色和權(quán)限管理,以支持將填充平臺的內(nèi)容編輯器。

為什么不簡單地構(gòu)建自己的MEA / RN堆棧,并負(fù)責(zé)直接構(gòu)建數(shù)據(jù)庫中的數(shù)據(jù)并在React或Vue.js之類的框架中構(gòu)建完整的應(yīng)用程序呢?

如果您的用例定義明確,不太可能更改,并且管理內(nèi)容的人員很少,那么這可能是一個很好的解決方案。但是,一旦您需要定義更復(fù)雜的編輯工作流程并使用角色和權(quán)限來執(zhí)行它們,使用像Drupal這樣的CMS可以節(jié)省大量的開發(fā)時間。

在任何規(guī)模較大的用例中,以可復(fù)制和/或版本控制的方式管理依賴關(guān)系(即第三方庫)和網(wǎng)站配置(即定義的角色和權(quán)限)都是至關(guān)重要的。

可以在“首次內(nèi)容豐富的繪畫”(或更新的指標(biāo),例如“最大內(nèi)容豐富的繪畫”)之前的很短時間內(nèi)與以應(yīng)用程序為中心的體驗競爭的性能。

開放網(wǎng)絡(luò)的生存威脅之一是,封閉的基于應(yīng)用程序的體驗會提供比我們以往在網(wǎng)絡(luò)上更出色的性能和響應(yīng)速度的用戶體驗。但這是可以克服的挑戰(zhàn)。

Drupal代表現(xiàn)代CMS的地方

定義了現(xiàn)代CMS的要求之后,讓我們看一下Drupal如何處理每種內(nèi)容。Drupal的核心優(yōu)勢一直是其作為結(jié)構(gòu)化數(shù)據(jù)引擎的力量。

很簡單,實體是Drupal中內(nèi)容的基本單位。 實體包括以下內(nèi)容:節(jié)點(Drupal的通用內(nèi)容項),注釋,用戶,塊,分類術(shù)語等。

字段表示存儲在實體內(nèi)的數(shù)據(jù)。 任何單個字段都可以保存一種數(shù)據(jù):純文本,格式化文本,圖像,其他文件,日期等。

開發(fā)人員還可以定義自己的實體。 此示例顯示了一個名為Event的新實體的定義,該實體可用于存儲有關(guān)Drupal聚會的結(jié)構(gòu)化數(shù)據(jù),以及ID和Universally Unique Identifier的一些基本字段的定義。

 

<?php

 

namespace DrupaleventEntity;

 

use DrupalCoreEntityContentEntityBase;

use DrupalCoreFieldBaseFieldDefinition;

use DrupalCoreEntityEntityTypeInterface;

use DrupalCoreEntityContentEntityInterface;

 

/**

 * Defines the event entity.

 *

 * @ingroup event

 *

 * @ContentEntityType(

 *   id = "event",

 *   label = @Translation("event"),

 *   base_table = "event",

 *   entity_keys = {

 *     "id" = "id",

 *     "uuid" = "uuid",

 *   },

 * )

 */

 

class Event extends ContentEntityBase implements ContentEntityInterface {

 

  public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {

 

    // Standard field, used as unique if primary index.

    $fields['id'] = BaseFieldDefinition::create('integer')

      ->setLabel(t('ID'))

      ->setDescription(t('The ID of the Event entity.'))

      ->setReadOnly(TRUE);

 

    // Standard field, unique outside of the scope of the current project.

    $fields['uuid'] = BaseFieldDefinition::create('uuid')

      ->setLabel(t('UUID'))

      ->setDescription(t('The UUID of the Event entity.'))

      ->setReadOnly(TRUE);

 

    return $fields;

  }

}

?>

 

因為實體和字段在架構(gòu)上是Drupal的核心,所以它們干凈地繼承了Drupal提供的所有功能-在Drupal的API中自動可用,可修改和可轉(zhuǎn)換,受中央角色和權(quán)限系統(tǒng)的訪問控制,并且至關(guān)重要的是, Drupal的結(jié)構(gòu)化查詢構(gòu)建器視圖。

什么是視圖?

從概念上講,視圖是Drupal的核心組件,它使您可以從數(shù)據(jù)庫中獲取內(nèi)容并將其結(jié)構(gòu)化為提要或顯示。

這與僅編寫SQL查詢有何區(qū)別? 除了簡單地查詢結(jié)構(gòu)化數(shù)據(jù)外,View還繼承了Drupal的所有其他功能,使您可以定義多個顯示,使查詢參數(shù)與上下文相關(guān),以及使用Drupal的核心角色和權(quán)限系統(tǒng)來實施訪問控制。

雖然可以通過Drupal管理界面中的Views UI來管理所有這些功能,但是對于更細(xì)粒度的控件,可以在代碼中定義Views。

視圖功能的一個例子

假設(shè)我們的Drupal實例存儲了體育統(tǒng)計數(shù)據(jù)。 也許我們已經(jīng)建立了一種典型的網(wǎng)站體驗,用戶可以瀏覽這些統(tǒng)計信息,但是我們的實例還向安裝在體育館中的數(shù)字信息亭提供內(nèi)容。 該信息亭不能在Drupal上運行,而是使用RESTful Web服務(wù)查詢我們的Drupal網(wǎng)站以獲取有關(guān)使用該信息亭點擊的體育迷隊伍的統(tǒng)計信息。

我們可以在我們的Drupal站點中定義運動隊實體的視圖,該視圖收集所有包含服務(wù)亭可能要求的團(tuán)隊統(tǒng)計信息的字段。

然后,我們可以使用信息亭將調(diào)用的REST導(dǎo)出路徑配置Views輸出,并選擇是否將輸出序列化為XML或JSON。

請注意,除了信息亭可以使用哪種輸出格式外,我們對信息亭的構(gòu)建方式一無所知。

當(dāng)跨通道和端點顯示結(jié)構(gòu)化內(nèi)容時,Drupal中的視圖可以節(jié)省大量開發(fā)時間。

健壯的內(nèi)容展示API

Drupal 9是使用API優(yōu)先開發(fā)方法構(gòu)建的。這意味著Drupal的所有應(yīng)用程序功能都可以作為API使用,并且可以通過Drupal的RESTful Web服務(wù)和JSON:API來使用Drupal中存儲的所有結(jié)構(gòu)化數(shù)據(jù)??赏ㄟ^貢獻(xiàn)的模塊獲得對其他API擴(kuò)展(例如GraphQL)的支持。至關(guān)重要的是,這些API尊重所有其他Drupal核心功能,例如修訂,權(quán)限管理等。

我們在上面討論了Views,它是Drupal的核心組件,可啟用CMS的“一次編寫,隨處發(fā)布”功能。傳統(tǒng)上,它是用來在Drupal自己的表示層中創(chuàng)建結(jié)構(gòu)化數(shù)據(jù)的靈活顯示,但我們在上面的示例中已經(jīng)表明,它還可以創(chuàng)建API端點,以允許在解耦的前端應(yīng)用程序中使用和顯示內(nèi)容。

以這種方式使用Drupal的情況越來越普遍。消耗來自解耦的Drupal安裝中的數(shù)據(jù)的前端應(yīng)用程序通常是在Node.js,React,Vue.js,Gatsby和類似框架中構(gòu)建的。

是將Drupal用作獨立的,“耦合的”應(yīng)用程序,還是使用多種分離的選項,這取決于項目的編輯和開發(fā)需求。

編輯和工作流程工具

內(nèi)容管理系統(tǒng)的作用僅在于其使內(nèi)容編輯者能夠執(zhí)行其工作的能力,并且以Drupal為基礎(chǔ)的開發(fā)團(tuán)隊通常被賦予對編輯功能的特定要求,編輯人員應(yīng)能夠在不涉及開發(fā)人員的情況下使用這些功能。在Drupal 9中,有一些用于定義編輯工作流程的結(jié)構(gòu)性工具。

工作區(qū)使您可以為編輯工作流定義內(nèi)容暫存環(huán)境,預(yù)覽多個內(nèi)容更改,然后可以將其同時部署到公共環(huán)境。

在單個內(nèi)容類型中,您可以為內(nèi)容定義狀態(tài),這些內(nèi)容可以具有自己的屬性,控制有權(quán)查看或編輯內(nèi)容的人員,更改默認(rèn)修訂版等。

過渡定義了用戶可以放置內(nèi)容的可允許狀態(tài)更改,并且角色和權(quán)限還可以進(jìn)一步限制這些更改。

可以通過Drupal的配置管理系統(tǒng)來導(dǎo)入/導(dǎo)出工作區(qū)和工作流程配置,并對其版本進(jìn)行控制,下面將對其進(jìn)行描述,從而大大簡化了在一系列安裝中管理這些編輯工作流的任務(wù)。

例如,如果開發(fā)人員的任務(wù)是為整個編輯套件中的多個編輯團(tuán)隊的編輯工作流程添加新的內(nèi)容批準(zhǔn)步驟,每個編輯團(tuán)隊都在各自的代碼庫實例上,則可以在單個環(huán)境中創(chuàng)建配置,然后導(dǎo)出,然后導(dǎo)入到所有其他環(huán)境中。

依賴性和配置管理

Composer是PHP生態(tài)系統(tǒng)的依賴管理工具,與JavaScript生態(tài)系統(tǒng)的npm或Yarn相當(dāng)。 Drupal 8首先引入了對基于Composer的依賴性管理的支持,但是對于Drupal 9,它成為管理Drupal安裝的首選方法。 Drupal.org的發(fā)布打包系統(tǒng)可確保無論是在命令行上啟動Drupal項目還是通過下載.tar.gz,該項目都可以使用Composer。

使用Composer啟動Drupal項目非常簡單。一旦有了滿足系統(tǒng)要求的開發(fā)環(huán)境(通常是標(biāo)準(zhǔn)LAMP堆棧),就可以使用推薦的Composer模板安裝Drupal:


 

$ composer create-project drupal/recommended-project my_site_name_dir

遵循適當(dāng)?shù)陌姹炯s束語法,可以使用composer require命令將其他Drupal模塊或主題添加到您的安裝中。

例如,如果您想要添加令牌模塊(提供用于將動態(tài)生成的值插入內(nèi)容的擴(kuò)展選項)以及GraphQL模塊(因為您的內(nèi)容正被另一個前端應(yīng)用程序使用),則可以添加這些模塊使用以下命令到您的項目:


 

$ composer require 'drupal/token'
       $ composer require 'drupal/graphql'

使用其他依賴性管理工具的開發(fā)人員應(yīng)該熟悉這種常規(guī)工作流程。

配置管理

Drupal對所有站點配置使用標(biāo)準(zhǔn)格式,無論是Drupal核心組件的配置還是已安裝的模塊。 這意味著Drupal配置可以作為YAML導(dǎo)出和導(dǎo)入,這允許分階段進(jìn)行配置更改,在站點之間部署配置以及輕松的版本控制。

在配置管理UI中,您可以查看活動(數(shù)據(jù)庫中)配置以及當(dāng)前可用的暫存(YAML中)配置。 可以導(dǎo)出活動配置以覆蓋當(dāng)前的暫存配置,或者可以將活動配置還原為暫存YAML中的設(shè)置。

如上所述,Drupal的任何自定義擴(kuò)展都可以定義自己的配置。 配置YAML的模式非常簡單:

 

 

# /modules/example/config/schema/example.schema.yml

example.settings:

  type: config_object

  label: 'Example config'

  mapping:

    message:

      type: text

      label: 'Message'

 

作為開發(fā)人員,這種導(dǎo)出和導(dǎo)入配置以及通過版本控制進(jìn)行管理的功能使站點配置更易于控制,可審核,并且更易于從登臺環(huán)境部署到生產(chǎn)環(huán)境。

性能和可擴(kuò)展性

要與壁掛式移動應(yīng)用程序近乎即時的響應(yīng)能力競爭,就意味著要高度重視現(xiàn)代性能和渲染技術(shù)。

Drupal包括一個不需要配置的動態(tài)頁面緩存,它使用頁面上每個呈現(xiàn)項目的聲明性緩存上下文來確定是否可以緩存該項目。 這意味著,無論用戶是匿名的還是經(jīng)過身份驗證的,甚至具有動態(tài),個性化內(nèi)容的頁面都可以部分或全部進(jìn)行緩存。

這樣做的關(guān)鍵是檢測哪些頁面內(nèi)容可以緩存,哪些不應(yīng)該緩存。 檢測頁面的高動態(tài)元素(即,較差的緩存候選對象)以便以后可以呈現(xiàn)的過程稱為自動占位符。

默認(rèn)情況下,Drupal將在渲染器配置中對符合以下條件的元素執(zhí)行自動占位:

 

renderer.config:

    auto_placeholder_conditions:

      max-age: 0

      contexts: ['session', 'user']

      tags: []

 

這些條件可以針對您的特定用例進(jìn)行擴(kuò)展。 舉例來說,如果您想消除對與用戶或當(dāng)前會話無關(guān)的動態(tài)內(nèi)容的緩存(也許是實時活動的可視化),則可以定義一個新的緩存上下文,將其稱為“ dataviz”。 給定上下文的內(nèi)容將通過自動占位符而不是緩存進(jìn)行處理。


 

-       contexts: ['session', 'user']
  +      contexts: ['session', 'user', 'dataviz']

同樣,您可能想做相反的事情:為Drupal默認(rèn)情況下通常不會緩存的內(nèi)容定義一個緩存上下文。 例如,如果您的內(nèi)容與用戶實體相關(guān),但是在很大程度上是不可變的,則可以為它提供一個新的緩存上下文,以對該內(nèi)容實施緩存,而不必緩存可能根據(jù)用戶上下文而動態(tài)變化的所有其他內(nèi)容 。

Drupal還包括BigPipe核心模塊,BigPipe核心模塊是當(dāng)今最先進(jìn)的頁面渲染優(yōu)化技術(shù),最早由Facebook提出并實施。 此技術(shù)建立在上述緩存上下文和自動占位符的基礎(chǔ)上,以允許頁面以早期刷新的方式呈現(xiàn)(在整個頁面就緒之前將初始內(nèi)容發(fā)送到瀏覽器),然后在占位符內(nèi)容中進(jìn)行流式傳輸。

與最大的內(nèi)容豐富的涂料相比,這是一個巨大的改進(jìn)時間。 盡管可以擴(kuò)展BigPipe功能,但默認(rèn)情況下它無需啟用其他配置即可啟用它。

豐富和觸及

CMS生態(tài)系統(tǒng)中技術(shù)復(fù)雜程度的提高同時增加了數(shù)字體驗的豐富性,也增加了構(gòu)建和維護(hù)這些系統(tǒng)的復(fù)雜性。 這改變了Drupal的目標(biāo)。

在Drupal社區(qū)中,我們說Drupal是雄心勃勃的數(shù)字體驗。 這不僅是衡量大小的方法,甚至不是主要衡量標(biāo)準(zhǔn)的方法,而是衡量網(wǎng)絡(luò)體驗整合上面我們探討的這些現(xiàn)代內(nèi)容管理概念所需的程度的方法。

經(jīng)Drupal創(chuàng)始人Dries Buytaert許可使用的圖形。

像Drupal這樣的強(qiáng)大CMS的目的不再是在構(gòu)建博客,投資組合網(wǎng)站或小冊子軟件時,而且希望在進(jìn)行這種探索之后,當(dāng)您想到CMS生態(tài)系統(tǒng)時,這不再是我要想到的。 相反,如果我們在這里探索的現(xiàn)代功能與您的用例產(chǎn)生了共鳴,那么現(xiàn)在該讓Drupal 9煥然一新了。

快速開始

如果您具有LAMP開發(fā)環(huán)境,則可以使用Composer和PHP快速探索一個快速入門的Drupal環(huán)境:


 

$ composer create-project drupal/recommended-project try9
$ php try9/web/core/scripts/drupal quick-start demo_umami

要了解有關(guān)Drupal的更多信息,請瀏覽Drupal項目的文檔,考慮在線或在您所在地區(qū)加入Drupal社區(qū),或在DrupalCon上查看我們。