ðž 项ç®ååæ¶æäžç颿Œç€º
Sylius/Sylius 项ç®å±ç€ºåŸ
Sylius/Sylius 项ç®å±ç€ºåŸ
Sylius/Sylius 项ç®å±ç€ºåŸ
ð ïž ææ¯æ : PHP / Symfony
> åšçµåç³»ç»éåé¢åïŒPHPçæé¿æè¢«èŽšç"猺ä¹äŒäžçº§æ¶æèœå"ãSylius以7.6k+ GitHub Starsè¯æäºïŒåºäºSymfonyæ¡æ¶æå»ºççµåç³»ç»ïŒåæ ·å¯ä»¥å®ç°é«å èãäœèŠåã坿µè¯ã坿©å±çç°ä»£åæ¶æè®Ÿè®¡ãæ¬æå°ä»æ¶æåžè§è§ïŒæ·±åºŠåæè¿äžåŒæºçµåæ¡æ¶çææ¯åºå äžå·¥çšå®è·µä»·åŒã
—
1. é¡¹ç®æŠè§äžåŒæºå°å
1.1 è¯çèæ¯äžæ žå¿çç¹
äŒ ç»çµåç³»ç»æ®éé¢äžŽäžå€§æ¶æå°å¢ïŒåäœèŠå富èŽè¿ä»£ææ¬ææ°çº§äžåãåå端区ç»å®å¶çºŠå€ç«¯éé èœåãæµè¯èŠçäžè¶³åŒåçº¿äžæ éé¢åãSyliusç±æ³¢å °åŒåè å¢éäº2014幎åèµ·ïŒå ¶æ žå¿è®Ÿè®¡å²åŠæ¯ïŒå°Symfonyæ¡æ¶çäŒäžçº§åŒåè§èäžçµåäžå¡é¢åæš¡åæ·±åºŠèåïŒæå»ºäžäžªçæ£é¢åæªæ¥çHeadlessçµååºç¡è®Ÿæœã
äžMagentoç倿æä»¶äœç³»ãWooCommerceçWordPressç»å®äžåïŒSyliusä»è¯çä¹åå°±åæBDDïŒè¡äžºé©±åšåŒåïŒæµè¯é©±åšïŒæææ žå¿åèœæš¡ååéè¿Behatè¿è¡åºæ¯åéªæ¶æµè¯ïŒè¿åšPHPçµåçæäžæäžºçœè§ã
1.2 åŒæºåè®®äžç€Ÿåºçæ
项ç®åŒæºå°åïŒSylius
GitHub: https://github.com/Sylius/Sylius
åŒæºåè®®: MIT License
GitHub Stars: 7.6k+
莡ç®è
æ°é: 300+
ææ°çš³å®çæ¬: v1.12.x (2024)
Sylius瀟åºéçšæ žå¿æ¡æ¶+宿¹æä»¶çå屿¶ææš¡åŒãæ žå¿æ¡æ¶ä¿æç²Ÿç®ïŒææäžå¡æ©å±ïŒæ¯ä»çœå ³ãç©æµéæãå€è¯è𿝿çïŒå以ç¬ç«Bundleåœ¢åŒæäŸãè¿ç§è®Ÿè®¡äœ¿åŸç³»ç»æ¢å ·å€äŒäžçº§çš³å®æ§ïŒåæ¥æçµæŽ»çæ©å±èœåã
—
2. è¯èšäžæ žå¿ææ¯æ 深床åæ
2.1 åç«¯ææ¯æ æ¶æ
| ææ¯å±çº§ | å
·äœææ¯éå | çæ¬èŠæ± | æ¶æä»·åŒ |
|———|————-|———|———|
| åŒåè¯èš | PHP 8.1+ | äž¥æ Œç±»å声æ | å©çšPHP 8æ°ç¹æ§å®ç°é«æ§èœä»£ç |
| æ žå¿æ¡æ¶ | Symfony 6.x/7.x | LTSçæ¬äŒå
| äŒäžçº§æ¡æ¶è§èãäŸèµæ³šå
¥ãæå¡å®¹åš |
| ORMå± | Doctrine ORM | 2.14+ | 区倧çå®äœæ å°ãæ¥è¯¢çæåšãçåœåšæåè° |
| APIè§è | RESTful + Swagger | OpenAPI 3.0 | æ å忥å£å®ä¹ãèªåšçæAPIææ¡£ |
| æµè¯æ¡æ¶ | PHPUnit + Behat | BDDé©±åš | åå
æµè¯+è¡äžºæµè¯åä¿é© |
| äŸèµç®¡ç | Composer | 2.x | PSRæ åèªåšå 蜜 |
2.2 åç«¯ææ¯æ ç©éµ
SyliusæäŸäž€ç§åç«¯æ¹æ¡ïŒéåºäžåäžå¡åºæ¯ïŒ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â 宿¹æšèæ¹æ¡ïŒSylius Admin (Symfony UX) â
â âââ æ¡æ¶: Symfony UX + Stimulus â
â âââ UIç»ä»¶: Sylius UI (åºäºTailwind CSS) â
â âââ æå»ºå·¥å
·: Webpack Encore â
â âââ éçšåºæ¯: 管çåå°å¿«éå®å¶ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â Headlessæ¹æ¡ïŒSylius Storefront â
â âââ æ¡æ¶: Sylius Storefront (Twig + Stimulus) â
â âââ æå»º: Webpack Encore + PostCSS â
â âââ éçšåºæ¯: äŒ ç»æå¡ç«¯æž²æçµåç« â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â èªå®ä¹åç«¯æ¹æ¡ïŒä»»æJSæ¡æ¶ â
â âââ æšè: React / Vue / Next.js / Nuxt.js â
â âââ éä¿¡: Sylius API (REST/GraphQL) â
â âââ éçšåºæ¯: å€ç«¯éé
ãSPAåºçšãç¬ç«å端å¢é â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
2.3 æ°æ®ååšäžçŒåå±
| ç»ä»¶ç±»å | æšèæ¹æ¡ | é
眮诎æ |
|———|———|———|
| å
³ç³»åæ°æ®åº | PostgreSQL 14+ / MySQL 8.0 | PostgreSQLæšèïŒæŽå¥œçJSONæ¯æåå¹¶åæ§å¶ |
| çŒåå± | Redis 7.x | äŒè¯ååšãçŒåå±ãæ¶æ¯éå |
| æçŽ¢åŒæ | Elasticsearch 8.x / Algolia | ååæçŽ¢ãçéãæåº |
| æ¶æ¯éå | Symfony Messenger + RabbitMQ/Redis | åŒæ¥ä»»å¡å€çã订åäºä»¶åå |
| 对象ååš | AWS S3 / MinIO | åååŸçãåªäœæä»¶ååš |
2.4 éšçœ²äžåºç¡è®Ÿæœæ¯æ
Syliusåçæ¯æå®¹åšåéšçœ²ïŒå®æ¹æäŸå®æŽçDocker Composeé 眮ïŒ
# docker-compose.yml æ žå¿æå¡
services:
sylius:
build: ./docker/sylius
ports:
- "80:80"
- "443:443"
depends_on:
- postgres
- redis
- elasticsearch
postgres:
image: postgres:15-alpine
environment:
POSTGRES_DB: sylius
POSTGRES_USER: sylius
POSTGRES_PASSWORD: sylius
redis:
image: redis:7-alpine
command: redis-server --appendonly yes
elasticsearch:
image: elasticsearch:8.10.0
environment:
- discovery.type=single-node
- xpack.security.enabled=false
—
3. æ žå¿åèœäžäžå¡æš¡åæè§£
3.1 çµåæ žå¿äžå¡ç©éµ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Sylius æ žå¿åèœæš¡å â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â ãååäžå¿ã â
â âââ åååäœç®¡ç (Product Variants) â
â âââ åç±»å±çº§äœç³» (Categories Tree) â
â âââ 屿§ç³»ç» (Options & Values) â
â âââ åªäœç®¡ç (Images & Galleries) â
â âââ åºå管ç (Stock Management) â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â ã订åç³»ç»ã â
â âââ èŽç©èœŠ (Cart) - æ¯æå€èŽç©èœŠãå
±äº«èŽç©èœŠ â
â âââ ç»ç®æµçš (Checkout) - 忥åŒç»ç®ïŒå°å/é
é/æ¯ä»/确讀 â
â âââ 订å管ç (Orders) - ç¶ææºé©±åšã订åä¿®æ¹åå² â
â âââ 鿬Ÿå€ç (Refunds) - éšå鿬Ÿãå
šé¢é欟 â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â ãçšæ·äœç³»ã â
â âââ é¡Ÿå®¢èŽŠæ· (Customers) - å€å°å管çã订ååå² â
â âââ çšæ·è§è² (Roles) - RBACæéæ§å¶ â
â âââ 瀟亀ç»åœ (Social Login) - OAuth2éæ â
â âââ äŒåç级 (Loyalty Program) - æä»¶æ©å± â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â ãä¿éåŒæã â
â âââ äŒæ åžç³»ç» (Promo Codes) - çŸåæ¯/åºå®éé¢ææ£ â
â âââ ä¿éæŽ»åš (Promotions) - æ¡ä»¶è§Šåãé¶æ¢¯å®ä»· â
â âââ æç»éå® (Bundles) - ä¹°AéBãç»åäŒæ â
â âââ å®ä»·çç¥ (Pricing Rules) - åºäºçšæ·ç»/æ°éçåšæå®ä»· â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â ãæ¯ä»äžç©æµã â
â âââ æ¯ä»çœå
³ (Payment Gateways) - Stripe/PayPal/Adyençæä»¶ â
â âââ é
éæ¹æ¡ (Shipping) - æéé/ä»·æ Œ/å°å计ç®è¿è޹ â
â âââ ç©æµè·èžª (Tracking) - æä»¶æ©å± â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â ãå€è¯èšäžåœé
åã â
â âââ å€è¯è𿝿 (Internationalization) - å
眮i18n â
â âââ å€èŽ§åžæ¯æ (Multi-currency) - 宿¶æ±çèœ¬æ¢ â
â âââ å€ååºæ¯æ (Multi-store) - åå®äŸå€åºéº â
â âââ çšå¡é
眮 (Taxation) - åºäºå°åºççšå¡è§å â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
3.2 æéäžè§è²æ§å¶äœç³»
SyliuséçšSymfony Securityç»ä»¶å®ç°ç»ç²åºŠæéæ§å¶ïŒ
// æéé
眮瀺äŸ
roles:
ROLE_ADMIN: 管çåè§è²
ROLE_ADMIN_SHOP_MANAGER: ååºç®¡çå
ROLE_ADMIN_PRODUCT_MANAGER: 产å管çå
ROLE_CUSTOMER: æ®é顟客
ROLE_GUEST: 访客
// è®¿é®æ§å¶è§å
access_control:
- { path: ^/admin, roles: ROLE_ADMIN }
- { path: ^/api, roles: IS_AUTHENTICATED_FULLY }
- { path: ^/checkout, roles: ROLE_CUSTOMER }
—
4. ææ¯æ¶æäº®ç¹äžäºæ¬¡åŒåäŒå¿
4.1 æ¶æè®Ÿè®¡æ žå¿äº®ç¹
#### 4.1.1 é¢å驱åšè®Ÿè®¡ïŒDDDïŒå®è·µ
Syliusæ¯PHPçæäžæåœ»åºè·µè¡DDDç念ççµåæ¡æ¶ïŒ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â å屿¶æè®Ÿè®¡ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â ã衚ç°å±ã â
â âââ API Controller (REST) â
â âââ Admin Controller (Symfony Form) â
â âââ Store Controller (Twig + Stimulus) â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â ãåºçšå±ã â
â âââ Command Handlers (CQRSæš¡åŒ) â
â âââ Event Handlers (é¢åäºä»¶å€ç) â
â âââ Service Layer (äžå¡çŒæ) â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â ãé¢åå±ã â
â âââ Entities (é¢åå®äœ) â
â âââ Value Objects (åŒå¯¹è±¡) â
â âââ Domain Events (é¢åäºä»¶) â
â âââ Domain Services (é¢åæå¡) â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â ãåºç¡è®Ÿæœå±ã â
â âââ Repositories (æ°æ®è®¿é®) â
â âââ Migrations (æ°æ®åºè¿ç§») â
â âââ External Services (ç¬¬äžæ¹éæ) â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
#### 4.1.2 æä»¶åæ¶ææºå¶
SyliuséçšSymfony Bundleæºå¶å®ç°æä»¶åæ©å±ïŒ
æä»¶åŒåç»æïŒ
MyPlugin/
âââ MyPlugin.php # Bundle泚åç±»
âââ config/
â âââ services.yaml # æå¡é
眮
â âââ routes.yaml # è·¯ç±é
眮
âââ src/
â âââ Entity/ # é¢åå®äœ
â âââ Repository/ # æ°æ®ä»åº
â âââ Controller/ # æ§å¶åš
â âââ Form/ # 衚åç±»å
âââ tests/ # æµè¯çšäŸ
æä»¶åŒåäŒå¿ïŒ
– å®å
šé犻çäžå¡æš¡åïŒäžåœ±åæ žå¿æ¡æ¶
– å¯ç¬ç«æµè¯ãç¬ç«éšçœ²
– æ¯ææä»¶éŽäŸèµç®¡ç
– å¯ååžè³Packagistå
񄧮
#### 4.1.3 BDDæµè¯é©±åšåŒå
Syliusçæ žå¿ä»·åŒä¹äžæ¯å ¶æµè¯èŠççïŒ
# 订ååå»ºåºæ¯æµè¯ (Behat)
Feature: Checkout process
In order to buy products
As a customer
I need to be able to complete checkout
Scenario: Add product to cart
Given I am logged in as "customer@example.com"
And I want to buy "Product Name"
When I add it to cart
Then I should be notified that it has been added
And I should see 1 item in my cart
æµè¯èŠç绎床ïŒ
– PHPUnitåå
æµè¯ïŒæ žå¿äžå¡é»èŸ
– Behatåºæ¯æµè¯ïŒçšæ·äº€äºæµçš
– APIæµè¯ïŒæ¥å£å¥çºŠéªè¯
– æ§èœæµè¯ïŒé«å¹¶ååºæ¯æš¡æ
4.2 äºæ¬¡åŒåå·¥çšåè§è
#### 4.2.1 代ç è§èéµåŸª
Syliusäž¥æ ŒéµåŸªPSRæ ååSymfonyæäœ³å®è·µïŒ
# PHPStan é
眮 (éæåæ)
parameters:
level: 8 # æé«çº§å«éæåæ
paths:
- src/
- tests/
# PHP_CodeSniffer é
眮
standard: Symfony
#### 4.2.2 æ©å±åŒåæš¡åŒ
æ¹åŒäžïŒèŠçæ žå¿å®äœ
// ç»§æ¿æ žå¿å®äœïŒæ·»å èªå®ä¹å段
class MyProduct extends Product
{
#[ORMColumn(type: 'string', length: 255)]
private string $customField;
}
æ¹åŒäºïŒäºä»¶è®¢é è
class OrderEventsSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
OrderEvents::ORDER_PLACED => 'onOrderPlaced',
];
}
public function onOrderPlaced(OrderEvent $event): void
{
// èªå®ä¹äžå¡é»èŸ
}
}
æ¹åŒäžïŒèªå®ä¹æä»¶
# åå»ºæ°æä»¶
bin/contribute sylius:plugin:create MyCustomPlugin
—
5. å¿«éäžæãéšçœ²å®æäžéå建议
5.1 ç¯å¢äŸèµèŠæ±
# ç³»ç»çº§äŸèµ
PHP >= 8.1
Composer >= 2.0
Node.js >= 18.x
NPM >= 9.x
# æ°æ®åº
PostgreSQL >= 14 æ MySQL >= 8.0
Redis >= 7.0
Elasticsearch >= 8.0 (å¯éïŒçšäºæçŽ¢åèœ)
# æšèåŒåå·¥å
·
Docker Desktop
Symfony CLI
5.2 æ¬å°åŒåç¯å¢æå»º
# æ¹åŒäžïŒComposerå¿«éå®è£
composer create-project sylius/sylius-standard my-shop
cd my-shop
# å®è£
äŸèµ
composer install
npm install
npm run build
# é
眮ç¯å¢åé
cp .env.test .env
# åå§åæ°æ®åº
bin/console sylius:install
# å¯åšåŒåæå¡åš
symfony server:start
5.3 Dockeräžé®éšçœ²
# æ¹åŒäºïŒDocker Composeå¿«éå¯åš
git clone https://github.com/Sylius/Sylius.git
cd Sylius
cp .env.local .env
docker-compose up -d
# çåŸ
æå¡å¯åš
docker-compose ps
# 访é®åºçš
# Admin: http://localhost/admin
# Store: http://localhost
# API: http://localhost/api
5.4 ç产ç¯å¢éšçœ²æ£æ¥æž å
éšçœ²åæ£æ¥é¡¹:
- [ ] å¯çšç产暡åŒ: APP_ENV=prod
- [ ] å
³éè°è¯æš¡åŒ: APP_DEBUG=0
- [ ] é
眮çäº§æ°æ®åºè¿æ¥
- [ ] 讟眮RedisçŒå
- [ ] é
眮Elasticsearch玢åŒ
- [ ] çæèµäº§: npm run build -- --production
- [ ] æž
é€çŒå: bin/console cache:clear
- [ ] äŒåèªåšå 蜜: composer dump-autoload --optimize
- [ ] é
眮SSLè¯ä¹Š
- [ ] 讟眮æ¥å¿èœ®èœ¬
- [ ] é
çœ®çæ§åèŠ
5.5 项ç®éåå³çæå
| è¯äŒ°ç»ŽåºŠ | éçšåºæ¯ | äžå»ºè®®åºæ¯ |
|———|———|———–|
| äžå¡è§æš¡ | äžå€§åäŒäžçµåãå€åºéºè¿è¥ | å°å䞪人ååãç®åå±ç€ºåçœç« |
| ææ¯å¢é | çæSymfony/PHPçå·¥çšåžå¢é | æ PHPç»éªãä»
çæJSçæçå¢é |
| å®å¶éæ± | éèŠæ·±åºŠå®å¶äžå¡é»èŸ | æ ååSaaSçµåéæ± |
| å€ç«¯éé
| éèŠAPI驱åšå€ç«¯åºçš | ä»
éåäžWeb端 |
| åœé
å | å€è¯èšãå€èާåžãå€å°åºäžå¡ | åäžåžåºæ¬å°å |
| æ§èœèŠæ± | é«å¹¶åãå€§æ°æ®éåºæ¯ | äœæµéãç®åæ¥è¯¢åºæ¯ |
éå建议ïŒ
– â
åŒºçæšèïŒäŒäžçº§B2B/B2CçµåãéèŠAPIäŒå
çå€ç«¯æ¶æãåœé
åçµåäžå¡
– â ïž è°šæ
èèïŒé¢ç®æéçå°å项ç®ãå¢éæ Symfonyç»éªãå¿«éäžçº¿éªè¯MVP
– â äžæšèïŒWordPressçæäŸèµãç®åå±ç€ºåçœç«ãæ PHPææ¯åšå€çå¢é
—
ç»è¯
Sylius代衚äºPHPçµåæ¡æ¶çæ¶æé«åºŠââå®å°SymfonyçäŒäžçº§è§èãDDDé¢å建暡ãBDDæµè¯é©±åšçç°ä»£èœ¯ä»¶å·¥çšå®è·µïŒå®æŽæ å°å°çµåäžå¡åºæ¯äžã对äºè¿œæ±ä»£ç 莚éã坿©å±æ§ãæµè¯èŠçççäŒäžçº§é¡¹ç®ïŒSyliusæäŸäºç»è¿ç产éªè¯çææ¯åºåº§ã
å ¶Headlessæ¶æè®Ÿè®¡ãæä»¶åæ©å±æºå¶ã以åå®åçAPIæ¯æïŒäœ¿åŸSyliusèœå€éåºä»äŒ ç»çµåçœç«å°ç°ä»£å€ç«¯åºçšçåç±»äžå¡åºæ¯ãåšçµåç³»ç»éåæ¶ïŒSyliusåŒåŸè¿å ¥ææ¯å³çè çæ žå¿è¯äŒ°æž åã
⢠Git å éåœä»€ïŒ
git clone https://github.com/Sylius/Sylius.git