Yish

Hey, I’m Yish, the minimalist and an engineer.

Laravel Precognition

如果要提供給前端作即時表單驗證時,傳統作法是要在提供一組 API 作為驗證返回使用,Laravel Precognition 這個新的 Laravel 套件提供了較為方便的即時驗證,並且不會讓驗證規則同時存在兩份,也與前端框架作了整合,以下將以註冊功能添即時驗證為範例。 前置 配置 Breeze $ laravel new laravel10 $ cd laravel10 $ composer require laravel/breeze --dev $ php artisan breeze:install $ php artisan migrate $ npm install $ npm run dev 原本規則 預設配置好之後,原本的規則寫法是送表單型態,也就是說在送出表單當下才會去驗證欄位機制,這邊如果要調整成即時作表單驗證會有兩種作法: 前端取得後端驗證規則後以 JS 再寫入一次規則 後端提供驗證 API 操作 這邊可以看到前端寫規則的話當需要作欄位驗證調整時就得再調整,規則分散在兩邊; 而後端自行提供驗證 API 操作需要經過一定設計才會讓代碼不會有重複的狀況。 Laravel Precognition 在先前版本中提供了一種新的工具 Precognition 就是用來解決這個煩惱的。 routes/auth.php 添加中間件作為驗證機制 Route::post('register', [RegisteredUserController::class, 'store'])->middleware([HandlePrecognitiveRequests::class]); Http/Controllers/Auth/RegisteredUserController.php 將 Validation rule 複製 創建 RegisterRequest $ php artisan make:request RegisterRequest 刪除 authorize 或是改為 true 添加規則,用於判斷送入與即時驗證 precognitive 要驗證什麼,我這邊僅先用 unique 作範例 return [ 'name' => ['required', 'string', 'max:255'], 'email' => [ // 判斷成立 -> 展開陣列到上層陣列 ....

May 25, 2023 · Yish

探索 Laravel 核心機制與生命週期

Laravel 功能相當強大且實用,本篇文章將逐步探索 Laravel 核心生命週期機制和註解理解的流程和功能,不難發現其實核心設計是相當巧妙且具有高彈性和客製化,從 public/index.php 進入點出發,理解其核心運作原理和概念會有助於後續客製化和開發,文末會簡單列出核心步驟方便大家在設計代碼時參考。 Entry point // public/index.php <?php use Illuminate\Contracts\Http\Kernel; use Illuminate\Http\Request; // 定義了常數 LARAVEL_START,其值為當前時間的微秒數,用於計算應用程式的啟動時間 define('LARAVEL_START', microtime(true)); // 檢查應用程式是否處於維護模式。 // 如果存在,則引入該檔案。維護模式用於暫時關閉應用程式,以進行維護或升級。 if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) { require $maintenance; } // 用於自動載入所需的依賴項和類別 require __DIR__.'/../vendor/autoload.php'; // 這邊會細說,這邊會返回 app instance $app = require_once __DIR__.'/../bootstrap/app.php'; // 使用 Service Container 解析實作 Http Kernel 接口的實例。 $kernel = $app->make(Kernel::class); // 使用 Request::capture() 捕獲了當前的請求,並將其傳遞給 handle() 方法進行處理。handle() 方法處理請求並返回一個回應對象,並將其賦值給 $response 變數。 $response = $kernel->handle( $request = Request::capture() )->send(); // 使用 terminate() 方法通知 Kernel 實例已經處理完畢,並傳遞了原始請求和回應對象。這個方法在應用程式執行結束後執行,例如在回應被送出到瀏覽器之後。 $kernel->terminate($request, $response); 核心 Application: Service Container 上面代碼是講述 Laravel 整個生命週期運行的步驟,接下來說明 app....

May 23, 2023 · Yish

Comparing Optimistic and Arbitrum: Which Ethereum Layer-2 Scaling Solution Is Best for You?

Optimistic Features: Uses fraud proofs to ensure the security of transactions. Is a rollup-based scaling solution, which means that it can achieve scalability by batching transactions and processing them off-chain. Is compatible with most Ethereum-based dApps. Has a large user base and a wide range of dApps deployed on it. Pros: Is fast and efficient. Has low transaction fees. Is easy to use. Has a large user base and a wide range of dApps deployed on it....

May 18, 2023 · Yish

實作 Container in PHP

Container 機制是一種依賴注入的設計模式,它允許您將對象的創建和解析分離。這意味著您可以在應用程序中創建一個容器,然後使用容器來解析對象,而不是直接創建它們。這樣做的好處是,您可以更輕鬆地管理對象之間的依賴關係,並且可以更輕鬆地進行單元測試。 Container 機制通常由一個容器類別實現,該類別包含一個綁定數組,用於存儲抽象類別和具體類別之間的映射。當您需要解析一個對象時,容器會查找該對象的綁定,然後使用綁定中指定的具體類別或 Closure 創建該對象。 Container 機制還支持單例模式。如果您需要在應用程序中共享一個對象,則可以使用 singleton 方法來綁定抽象類別到具體類別或 Closure,並將 shared 參數設置為 true。這樣做可以確保每次解析該對象時都返回同一個實例。 使用 ReflectionClass 來解析對象,並使用 ReflectionParameter 來獲取對象的構造函數的參數列表。然後,它遞歸地解析每個參數的依賴關係,直到所有依賴關係都被解析為止。如果對象沒有構造函數,則直接返回一個新的對象實例。否則,它會使用 ReflectionClass::newInstanceArgs() 方法創建一個新的對象實例,並傳遞解析後的依賴關係作為參數。這種方法的好處是,它可以更輕鬆地管理對象之間的依賴關係,並且可以更輕鬆地進行單元測試。 基礎 Container 實作 <?php require_once 'Container.php'; class Foo {} $container = new Container; // 綁定 foo => new Foo $container->bind('foo', function ($container) { return new Foo; }); $foo1 = $container->make('foo'); var_dump($foo1); // object(Foo)#3 (0) { } 具體來說是怎麼實現這種綁定 Container,以下會逐步實現: 實現 bind class Container { protected $bindings = []; // 綁定一個實例進入 container public function bind($abstract, $concrete = null, $shared = false) { // $shared 參數用於指示是否應該返回同一個實例。 // 如果 shared 參數設置為 true,則返回同一個實例。 // 這對於需要共享的對象非常有用,例如資料庫連接或日誌記錄器。 // 如果 shared 參數設置為 false,則每次調用 make 方法時都會創建一個新的實例。 $this->bindings[$abstract] = compact('concrete', 'shared'); // array(1) { ["foo"]=> array(2) { ["concrete"]=> object(Closure)#1 (1) { ["parameter"]=> array(1) { ["$container"]=> string(10) "" } } ["shared"]=> bool(false) } } } ....

May 16, 2023 · Yish

What Is ERC-20?

ERC-20 是以太坊上的一種標準協議,用於創建和交換可互操作的代幣。它定義了一組規則和函數,使開發者能夠在以太坊區塊鏈上創建代幣,並在兼容 ERC-20 的錢包和交易所中進行交易。 TL;DR 發行 ERC-20 代幣本身不難,如何讓代幣具有價值跟共識性,讓別人認同其價值、營銷手段跟生態系才是關鍵,在做任何投資和操作一定要 DYOR 跟知道其原理和遊戲規則再進場,畢竟生成一個空氣或土狗代幣不用到 2 分鐘。 定義 ERC-20是以太坊的一種協議(智能合約),用於約定和規範代幣的發行。目前主流代幣都是基於這個協議進行開發的,當然比較早期的代幣沒有,而額外延伸了 Wrapped 的方式,下面會說明 WETH 與 ETH 之間的關係。 WETH vs ETH 作為擁有智能合約實現層的 Ethereum 鏈卻沒有自己的 ERC-20 代幣(token) 而 ETH 卻是作為加密貨幣的存在真的不好進行交易,所以衍伸了打包代幣,其目的都是將貨幣或沒有在這條鏈上發行的代幣進行打包,方便使用 ERC-20 標準進行投資與交易。所以後續看到 wrapped 絕大部分都是為了這個目的,可以透過 DEX 進行交換打包代幣等方式換取。 實現 ERC-20協議規定了代幣必須實現的6個函數,包括totalSupply、balanceOf、allowance、transfer、approve和transferFrom。這些函數定義了代幣的基本屬性和行為,使得開發者可以在以太坊上創建自己的代幣,並且可以方便地與其他應用程序集成。 totalSupply:獲取代幣的總供應量。 balanceOf:獲取指定帳戶的代幣餘額。 allowance:獲取擁有者授權給另一個帳戶的代幣數量。 transfer:從當前帳戶轉移代幣到另一個帳戶。 approve:授權另一個帳戶可以從當前帳戶轉移代幣。 transferFrom:從一個帳戶轉移代幣到另一個帳戶,前提是該帳戶已經得到了擁有者的授權。 但最主要還是實現核心幾個介面就是定義為 ERC-20: There are a few core contracts that implement the behavior specified in the EIP: IERC20: the interface all ERC20 implementations should conform to....

May 12, 2023 · Yish

What Is BRC-20?

最近幣圈很火紅的 BRC-20 究竟是什麼東西,帶來了何種價值與改進,Ordinals 協議又是什麼,以及對於未來的預測想法。 TL;DR BRC-20 是基於 Ordinals 協議的代幣標準(由社群定義,非認證),Ordinals 協議是讓 satoshi 有編號序列化(使得 satoshi 可以附加而外資料),而BRC-20 則是產生出一段 payload 寫入到 satoshi 內,這個動作稱為銘文(inscribe)。目前所有協議和標準都為實驗性質,然而被炒作跟各種 fomo 導致目前交易量大增讓 BTC 交易費拉高,進而拖垮 BTC 交易速度。 Ordinals 協議是什麼 由軟體工程師 Casey Rodarmor 於比特幣主網上打造的協議 Ordinals,於今年 1 月 21 日正式亮相。它是一個用於編號比特幣的最小單位 Satoshi 的系統,Satoshi 會依照挖掘和轉移的順序進行編號,故將該協議取名為 Ordinals (序數)。 Ordinals 可以讓用戶透過附加額外資料的方式(除了 JPEG 之外,PDF、影片和音檔內容也可以拿來創建 Ordinals。)使個別 Satoshi 成為獨一無二的 NFT。原文連結 Satoshi 是比特幣的最小單位,為 0.00000001 顆比特幣,也就是說 1 顆比特幣為 1 億顆 Satoshi。 然後發生了一件大事… Updated the gitbook to address common questions and my intentions for the experiment going forward....

May 12, 2023 · Yish