[Yii2][RBAC] 權限項目管理實踐 – Module Items Management

Intro 如果使用Yii2原生RBAC做好多層權限架構管理,例如video類下的program控制器下的create權限,可以讓你在Menu上看到video類跟program控制器選單。 資料結構 3-layer Item Name pattern: {module}.{controller}.{action} 依照上述例子,一個create的權限Item Name應為: video.program.create 那還需要另外兩個權限:video, video.program, 以作為如選單上僅判斷video大類以及video.program選單。 video, video.program,video.program.create三個繼承關係的權限items,並不適合使用Yii2 RBAC中的auth_item_child關係(如透過addChild()建構),因為video不能為最高父層,本身擁有video僅代表至少擁有一個子層,然後auth_item_child架構上有video代表擁有全部子層權限。 所以一個action的權限勢必連帶擁有其父層權限,例如擁有video.program.create items則必須連帶擁有父層: video.program.create video.program video 在管理介面應用上,在下層有選取任一action時往父層繼承(例如選一個action,其controller自動加入權限,再其module自動加入權限) Group結構實現 上述這種需要多層商業邏輯權限,可以使用auth_item中的data欄位做自定義,架構出type及階層關係,在管理介面時就可以透過getItems()取得全部權限items在逐一依照Data做分類資料建構,實現分群。 完成後的資料即可顯示出每個Group下擁有哪些Controllers再以下擁有哪些actions。 在Menu顯示與否的應用上,大分類透過can(‘video’)驗證,再往下如選單透過can(‘video.program’)驗證,action一般控制項在頁面上,就可以再透過can(‘video.program.create’)控制新增按鈕。

[PHP] Yii2 – RBAC原理指南 – Role Based Access Control Guide

Intro Yii RBAC可以整合User Component提供完整的權限控管,官方文件可以參考: Yii2 – Role Based Access Control (RBAC) 概念 RBAC關聯架構 Items分為Role與Module,用Type區分,但皆可直接Assign給User Items裡的Role即為Module的父集合,一個Role可以對多個Modules 一個User可以對多個Items,意即一人可以有多個Role再聯集多個指定Module 在介面概念上,Roles為一區塊可多選,選取或取消將影響Module區塊的Children選項並考慮其他已選Role聯集 RBAC系統架構 User為獨立Component與資料Model,RBAC與之整合 RBAC主要包含assignment(User-items)、items(角色與模組兩種Type)、rules(資料級別規則) RBAC三個Model提供PhpManager(檔案管理)與DbManager(資料庫)載體選擇,皆支援Data Building方法 Data Building提供操作器管理RBAC資料 驗證實作 設定好RBAC後,可以調用yii\web\User::can()做Module驗證判斷。 另外可以搭配ACF做Controller級別驗證,注意ACF中的roles即為RBAC的items: public function behaviors() { return [ ‘access’ => [ ‘class’ => AccessControl::className(), ‘rules’ […]

[Yii2] i18n(Internationalization) – 語系架構設定範例 (使用Key對應架構)

Intro 官網文件:Internationalization 語系代碼:[i18n] 淺談Internationalization – Language Identifiers (RFC 3066) 架構範例 別於官網以主要語系(英文)為sourceLanguage,本章範例以Key的架構去定義語系(也就是Message是指定一個Key必經轉譯)。 Configuration return [ // set target language to be English ‘language’ => ‘en-US’, // set source language to be a customized key which means it will always translate. ‘sourceLanguage’ […]

[Yii2] Widget 建構與目錄架構 – Widget Pattern

Intro Yii2 Application Structure: Widgets Directory Structure 通用(共用)Widget架構 your_app (e.g. frontend)/ – widgets/ – assets/ – js/ – hedaer.js – css/ – header.css – views/ – hedaer.php – HeaderWidget.php – HeaderWidgetAsset.php 通用架構上,assets即可以考慮另外移至web外層以省搬移成本。 獨立Widget架構 your_app (e.g. frontend)/ – widgets/ – header/ […]

[Yii2] Why Yii2 Framwork – Yii2 框架選型指南

Introduction 為什麼選擇Yii2作為PHP Framework。 特色 Application Components Components事先定義,透過Magic Method用到才new出來,效能與結構兼具考量。 概念如同CodeIgniter 3的Library(不做Alias),在單一Request cycle中為一次性啟動物件(Singleton)。 Asset Manager Assets支援物件導向管理,並且支援application內動態生成(適合用在Composer assets)。特色包含繼承、載入順序、重複載入防止。 保留Controller作為預設路由 如同CodeIgniter,預設使用Controller資料夾結構映射Route,但也支援自訂Route Map。 Yii2 Url Manager的Rule還可以支援URL生成比對,對應的Route Value在Url::to()宣告是可以自動生成Route Key。例如,’test’ => ‘site/action’的rule在URL::to設定site/action實際會生成test。 Pure Template Engine PHP本身就是個樣板引擎! Yii2使用原生PHP達到框架View Layout,相對於Laravel額外多一層打造的Blade引擎或CodeIgniter沒架構的純粹View引入法,Yii2扮演著中庸最適解決方案。 原理是使用規範的嵌入點打造每個Layout,藉由Controller決定選用的Layout套入Content View。 …補齊中…

[Yii2] Yii 2 Advanced Template 開發流程指南

Intro Yii 2 Advanced Project Template 適合前後站台Spec開發模板。 Dev – 開發人員 建置與更新其實與Composer流程相同: ./init –env=Development –overwrite=All composer install Prod/Stage – 佈署 Stage的建置與更新也相同,唯獨佈署時Stage可以包固定流程以確保每次更新: ./init –env=Production –overwrite=All composer install 設定檔 設定檔位於/environments內,更新後對應的環境得再跑一次init。

[PHP][Yii2] 資料庫操作使用範例 – Command & Builder & AR – Demo

介紹 Yii2 Framework對Database的操作有非常良好的結構彈性,供開發者從底層到Object-Oriented自行評估選用。 這裡對Yii2 Database定義了三層設計模式:SQL Command、Query builder、Active Record(ORM) 其中效能差異在於Active Record(ORM)設計模式, 範例程式碼 SQL Command Level # Get DB componet of Application $db = Yii::$app->db; # Get data form SQL execution $arrayData = $db->createCommand(‘SELECT * FROM table limit 10’) ->queryAll(); print_r($arrayData); Query […]

[Yii2] Nginx 配置 – 讓PHP全進framework – nginx php location try_files

原由 這邊主要是要解決yii2 UrlManager應用中,網址內含.php的路由會導至nginx 404 Not Found問題。 原因為yii2官方建議的Nginx配置: location / { # Redirect everything that isn’t a real file to index.php try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass 127.0.0.1:9000; #fastcgi_pass unix:/var/run/php5-fpm.sock; try_files $uri […]

[Yii2] Composer bower-asset 更新失敗解法

遇到的Composer update問題: yiisoft/yii2 2.*.* requires bower-asset/jquery *.*.*@stable | … -> no matching package found. Yii官網解:composer global require fxp/composer-asset-plugin 本篇是針對不使用Plugin提供解法。 原因: bower-asset在Packagist已經是Virtual Package,以下為bower因果: Update: bower 在 0.9.0 版以前可以使用 component.json,但是為了避免跟其他工具命名衝突,故 0.9.0 以後版本請改為 bower.json bower 是 Twitter 團隊開發的一套網頁工具,用來管理或安裝 Web 開發所需要的 Package,像是 CSS 和 […]

[Yii2] 佈署子目錄網址架構(Route SubDirectory) – 設定 $request->baseUrl、修正Url與PrettyUrl

Yii2部屬上,如果不是在Domain根目錄,要部屬Yii2恐造成Base Url錯亂及PrettyUrl後的Route吃不進Yii。 例如,在Nginx location目錄名與實體uri(Sub document root in location)不一樣下,預設的Yii其Base Url會以uri為主而非Nginx location目錄名,另外PrettyUrl因為無法正確比對REQUEST_URI導致Route無法解析。 基本影響層級,Url可能是取自DOCUMENT_URI \yii\helpers\Url::to([‘/’]); \yii\helpers\Url::home(); 【解決方法】: 在Yii2 config -> request component -> baseUrl 設定基礎目錄(同Nginx location目錄名),以讓Yii依此套用全部基礎Url,也才能依此路徑去比對REQUEST_URI取得Route。 $config = [ ‘components’ => [ ‘request’ => [ ‘cookieValidationKey’ => ”, ‘baseUrl’ => ‘/subdir’ ], ] […]