Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Logika biznesowa w aplikacjach web - Symfony wo...
Search
Dominik
March 16, 2017
Programming
0
290
Logika biznesowa w aplikacjach web - Symfony workflow
Business application management using Symfony Workflow
Slides from phpers Rzeszów
http://phpers.pl
Dominik
March 16, 2017
Tweet
Share
Other Decks in Programming
See All in Programming
AIコードレビューがチームの"文脈"を 読めるようになるまで
marutaku
0
350
tparseでgo testの出力を見やすくする
utgwkk
1
180
非同期処理の迷宮を抜ける: 初学者がつまづく構造的な原因
pd1xx
1
700
全員アーキテクトで挑む、 巨大で高密度なドメインの紐解き方
agatan
8
20k
テストやOSS開発に役立つSetup PHP Action
matsuo_atsushi
0
150
「コードは上から下へ読むのが一番」と思った時に、思い出してほしい話
panda728
PRO
38
25k
認証・認可の基本を学ぼう前編
kouyuume
0
190
リリース時」テストから「デイリー実行」へ!開発マネージャが取り組んだ、レガシー自動テストのモダン化戦略
goataka
0
120
Developing static sites with Ruby
okuramasafumi
0
250
認証・認可の基本を学ぼう後編
kouyuume
0
180
WebRTC と Rust と8K 60fps
tnoho
2
1.9k
【CA.ai #3】ワークフローから見直すAIエージェント — 必要な場面と“選ばない”判断
satoaoaka
0
230
Featured
See All Featured
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.5k
Mobile First: as difficult as doing things right
swwweet
225
10k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
390
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.1k
Making Projects Easy
brettharned
120
6.5k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Scaling GitHub
holman
464
140k
Building an army of robots
kneath
306
46k
A Tale of Four Properties
chriscoyier
162
23k
Bash Introduction
62gerente
615
210k
Transcript
LOGIKA BIZNESOWA APLIKACJI WEB SYMFONY WORKFLOW COMPONENT Dominik Hajduk
None
DOMINIK HAJDUK PHP developer Twitter: @DominikHaj
SKĄD CZERPIEMY INFORMACJE O PROCESACH I LOGICE BIZNESOWEJ APLIKACJI?
DOKUMENTACJA KLIENT KOMENTARZE W KODZIE SCENARIUSZE TESTOWE
JAKIE PRZYNOSI TO EFEKTY?
NIEAKTUALNA, ODERWANA OD PROJEKTU DOKUMENTACJA ROZSIANA PO KODZIE LOGIKA ROZBIEŻNOŚCI
$status;
$status = $a->getStatus(); if(is_array($status)){ $this->doSth(); } if($status > 3 &&
$a->deleted() == false){ $this->doOther(); } if($status > 5 || $status != false) { $this->wtf_this_status_is(); //?!? }
// set status 2 to mark as deleted // http://documentation.com?id=986875
$status = 1; // not sure why but for 2 not works // link to doc not working!!!
/** * set tutorial * * rules: * 1. start
only for not UK users * 2. publishers only * 3. just if active tutorial * 4. set only if not finished already * ... * 99. display also if forced !! */ public function tutorialAction() { }
/** * When I wrote this, only God and *
I understood what I was doing * * Now, God only knows * * * Magic. Do not touch. */ function parse_magic($sth, $sth2) {
CZY MOŻNA COŚ Z TYM ZROBIĆ?
A MUERTE
AUTOMAT SKONCZONY (ANG. FINITE STATE MACHINE)
None
None
None
None
SYMFONY WORKFLOW COMPONENT Symfony 3.2
Grégoire Pineau
MASZYNA STANU CZY WORKFLOW?
MASZYNA STANU Nie może być w więcej niż jednym miejscu
w tym samym momencie Może mieć ścieżki cykliczne
WORKFLOW Może być w więcej niż jednym miejscu w tym
samym momencie Zwykle nie ma ścieżek cyklicznych
POKAŻ KOD!
use Symfony\Component\Workflow \DefinitionBuilder; use Symfony\Component\Workflow \Transition; use Symfony\Component\Workflow \Workflow; use
Symfony\Component\Workflow \MarkingStore \SingleStateMarkingStore;
$builder = new DefinitionBuilder(); $builder->addPlaces( [ 'initial', 'booked', 'payed', 'done',
] ); $builder->addTransition( new Transition( 'pay', 'booked', 'payed' ) ); $builder->addTransition ...
$definition = $builder->build(); $marking = new SingleStateMarkingStore( 'currentState' ); $workflow
= new Workflow( $definition, $marking );
use Symfony\Component\Workflow\Registry; use Acme\Entity\Booking; $registry = new Registry(); $registry->add( $bookingWorkflow,
Booking::class ); $registry->add( $newsletterWorkflow, Newsletter::class );
$booking = new Booking(); $workflow = $registry->get($booking); // False $workflow->can($booking,
'pay'); // True $workflow->can($booking, 'book'); $workflow->apply($booking, 'book'); $workflow->can($booking, 'pay');
$workflow->getEnabledTransitions( $booking ); // ['pay']
UŻYCIE W SYMFONY
workflows: blog_publishing: type: 'workflow' # or 'state_machine' marking_store: type: 'multiple_state'
# or 'single_state'
blog_publishing: ... supports: - AppBundle\Entity\BlogPost places: - draft - review
- rejected - published
blog_publishing: ... transitions: to_review: from: draft to: review publish: from:
review to: published
$post = new \AppBundle\Entity\Blog(); $workflow = $this->container->get( 'workflow.blog_publishing' ); $workflow->can($post,
'publish');
try { $workflow->apply( $post, 'to_review' ); } catch (LogicException $e)
{ // ... } $transitions = $workflow ->getEnabledTransitions($post);
<h3>Twig</h3> {% if workflow_can(post, 'publish') %} <a href="...">Publish article</a> {%
endif %}
<h3>Twig cd..</h3> {% for transition in workflow_transitions(post) %} <a href="...">{{
transition.name }}</ {% else %} No actions available. {% endfor %}
UŻYWA ZDARZENIA guard logowanie
JAK TO ZADZIAŁAŁO?
1. POBRANIE OBIEKTU (STANU) 2. ZWRÓCENIE MOŻLIWYCH AKCJI
1. POBRANIE OBIEKTU (STANU) 2. SPRAWDZENIE CZY TRANZYCJA MOŻLIWA 3.
AKCJA NA OBIEKCIE (SERWIS) 4. WYKONANIE TRANZYCJI
None
JAK PRZYGOTOWAĆ DOKUMENTACJE?
Graphviz.org // dump-graph.php $dumper = new GraphvizDumper(); echo $dumper->dump($definition); php
dump-graph.php > out.dot dot -Tpng out.dot -o graph.png
bin/console workflow:dump name > out.dot dot -Tpng out.dot -o graph.png
None
None
CZY ROZWIĄŻE PROBLEMY?
DOKUMENTACJA JEST W KONFIGACH (YAML, XML, PHP)
MOŻNA SZYBKO WYGENEROWAĆ GRAFY
LOGIKA ZAMKNIĘTA W KOMPONENCIE
TESTOWALNE? PEWNIE!
ZACIEKAWIŁO? symfony.com/doc/current/workflow.html lyrixx/SFLive-Paris2016-Workflow
PYTANIA?
DZIĘKI!
UWAGI @DominikHaj
ŻRÓDŁA: symfony.com/doc/current/workflow.html symfony.com/doc/current/workflow/state- machines.html symfony.com/doc/current/workflow/usage.html symfony.com/doc/current/workflow/dumping- workflows.html