Laravel 5中的倉儲模式
儲存庫模式是由 Eric Evans 在他的領域驅動設計書中首次引入的。 事實上,儲存庫是應用程式存取網域層的入口點。
簡單來說,儲存庫允許您的所有程式碼使用對象,而無需知道對像是如何持久化的。儲存庫包含持久性的所有知識,包括從表到物件的映射。這提供了持久層的更面向物件的視圖,並使映射程式碼更加封裝。
讓你的儲存庫在 Laravel 中運作(作為一個真正的儲存庫——Eric Evans 領域驅動設計書)的唯一方法是將預設的 ORM 從活動記錄更改為資料映射器。最好的替代品是教義。
學說 ORM
Doctrine 是一種 ORM(物件關聯映射),它實現了資料映射器模式,並允許您將應用程式的業務規則與資料庫的持久層完全分開。 Doctrine 使用 DQL,而不是 SQL。 DQL 為您帶來物件查詢語言,這表示您將使用物件術語進行查詢,而不是傳統的關係查詢術語。
它允許您以物件導向的方式編寫資料庫查詢,並在您需要以使用預設儲存庫方法無法實現的方式查詢資料庫時提供協助。在我看來,DQL 是與資料庫保持聯繫的最強大方式。
教條與雄辯
Doctrine 實體只是一個普通的 PHP 簡單類,不會增加任何 ORM 繼承的開銷。 Doctrine 使用相同的繼承來管理多個查詢請求,而無需存取資料庫,這表示整個請求都存在實體物件。
Doctrine 的另一個不錯的功能是,無需遷移檔案來建立資料庫模式,而是自動建立資料庫來反映實體註解中的元資料。另一方面,Eloquent 不太複雜且非常易於使用。
這兩者之間的完整比較需要一篇單獨的文章。正如您所看到的,Doctrine 物件更輕、更抽象。然而,Doctrine 只適合特定的項目,因此它有時可能會為您帶來開銷。我相信這取決於程式設計師為應用程式選擇最好的 ORM。
部落格應用程式
現在是時候使用 Laravel 建立一個部落格應用程式了。首先,我們需要建立教義。有一個橋樑可以與 Laravel 5 的現有配置進行匹配。要在 Laravel 專案中安裝 Doctrine 2,我們執行以下命令:
composer require laravel-doctrine/orm
像往常一樣,該套件應該添加到app/config.php
,作為服務提供者:
LaravelDoctrine\ORM\DoctrineServiceProvider::class,
也應該要配置別名:
'EntityManager' => LaravelDoctrine\ORM\Facades\EntityManager::class
最後,我們發布套件配置:
php artisan vendor:publish --tag="config"
現在我們已經完成了。
實體是應用程式 App\Entities\Post.php
的重要組成部分:
namespace App\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="posts") * @ORM\HasLifecycleCallbacks() */ class Post { /** * @var integer $id * @ORM\Column(name="id", type="integer", unique=true, nullable=false) * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") * */ private $id; /** * @ORM\Column(type="string") */ private $title; /** * @ORM\Column(type="text") */ private $body; public function __construct($input) { $this->setTitle($input['title']); $this->setBody($input['body']); } public function setId($id) { return $this->id=$id; } public function getId() { return $this->id; } public function getTitle() { return $this->title; } public function setTitle($title) { $this->title = $title; } public function getBody() { return $this->body; } public function setBody($body) { $this->body = $body; } }
現在是時候創建儲存庫了,這在前面已經描述過了。 App/Repositories/PostRepo.php
:
namespace App\Repository; use App\Entity\Post; use Doctrine\ORM\EntityManager; class PostRepo { /** * @var string */ private $class = 'App\Entity\Post'; /** * @var EntityManager */ private $em; public function __construct(EntityManager $em) { $this->em = $em; } public function create(Post $post) { $this->em->persist($post); $this->em->flush(); } public function update(Post $post, $data) { $post->setTitle($data['title']); $post->setBody($data['body']); $this->em->persist($post); $this->em->flush(); } public function PostOfId($id) { return $this->em->getRepository($this->class)->findOneBy([ 'id' => $id ]); } public function delete(Post $post) { $this->em->remove($post); $this->em->flush(); } /** * create Post * @return Post */ private function perpareData($data) { return new Post($data); } }
控制器:App/Http/Controllers/PostController.php
:
namespace App\Http\Controllers; use App\Repository\PostRepo as repo; use App\Validation\PostValidator; class PostController extends Controller { private $repo; public function __construct(repo $repo) { $this->repo = $repo; } public function edit($id=NULL) { return View('admin.edit')->with(['data' => $this->repo->postOfId($id)]); } public function editPost() { $all = Input::all(); $validate = PostValidator::validate($all); if (!$validate->passes()) { return redirect()->back()->withInput()->withErrors($validate); } $Id = $this->repo->postOfId($all['id']); if (!is_null($Id)) { $this->repo->update($Id, $all); Session::flash('msg', 'edit success'); } else { $this->repo->create($this->repo->perpare_data($all)); Session::flash('msg', 'add success'); } return redirect()->back(); } public function retrieve() { return View('admin.index')->with(['Data' => $this->repo->retrieve()]); } public function delete() { $id = Input::get('id'); $data = $this->repo->postOfId($id); if (!is_null($data)) { $this->repo->delete($data); Session::flash('msg', 'operation Success'); return redirect()->back(); } else { return redirect()->back()->withErrors('operationFails'); } } }
如您所見,我使用 Flash 助理來管理訊息(您可以使用 Laravel 的)。關於驗證器,我應該補充一點,您可以建立自己的驗證器(就像我一樣)或使用 Laravel 預設值,這取決於您的偏好。
查看文件與平常相同。在此範例檢視中,檔案看起來像 resources/views/admin/edit.blade.php
:
@if (Session::has('flash_notification.message')) × {!! Session::get('flash_notification.message') !!} @endif @if($errors->has()) @foreach ($errors->all() as $error) {!! $error !!} @endforeach @endif {!! 'title' !!} {!! 'Body' !!} {!! is_object($ListData)?$ListData->getTitle():'' !!} {!! 'save' !!}
以上是Laravel 5中的倉儲模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。
