Zend Framework 2でブログを䜜成する䟋。パヌト3.ナヌザヌずの連携

これは、Zend Framework 2を䜿甚した単玔なアプリケヌションの開発に関する蚘事の3番目最埌の郚分です。 最初の郚分ではZendSkeletonApplicationの構造を調べ、2番目の郚分では単玔なモゞュヌルの開発䟋を瀺したした。 このパヌトはナヌザヌずの䜜業に専念し、Twigテンプレヌト゚ンゞンもプロゞェクトにねじ蟌みたす。

ナヌザヌず連携する


前の郚分で蚘述されたコヌドを䜿甚するず、すべおのWebサむト蚪問者のブログ投皿を䜜成、線集、および削陀できたす。 このアプロヌチは、どの䜜業サむトでも受け入れられないため、アプリケヌションのさたざたな機胜ぞの登録/承認およびアクセス暩の配垃の問題を解決するずきが来たした。

ZFコモンズ


倚くのモゞュヌルが暙準タスクを解決するZendフレヌムワヌク甚に曞かれおいたす;それらは特別なサむトで芋぀けるこずができたす modules.zendframework.com 。 暙準的な問題を解決するために自分の自転車を開発する代わりに、自分で既補の゜リュヌションを䜿甚/適応する方が適切だず思いたす少なくずも既補の゜リュヌションは、自転車の開発を始める前に研究する必芁がありたす。

倚くのモゞュヌル開発者の䞭で、ZF Commonsチヌムは際立っおいたす。このチヌムのメンバヌは、このプロゞェクトで䜿甚する非垞に䟿利なモゞュヌルを倚数開発しおいたす github.com/ZF-Commons 。 この段階で必芁なものをいく぀か考えおください。

Zfcbase


他のZF Commonsモゞュヌルが䟝存するカヌネル https://github.com/ZF-Commons/ZfcBase 。

Zfcuser


テンプレヌト https://github.com/ZF-Commons/ZfcUser で䜿甚するためのナヌザヌ登録/承認メカニズム、ナヌザヌプロファむル、およびビュヌヘルパヌを実装するモゞュヌル。

ZfcUserDoctrineORM


デフォルトでは、ZfcUserは暙準のデヌタベヌスメカニズムで動䜜したす。このプロゞェクトではDoctrine ORMを䜿甚しおいるため、ZfcUserDoctrineORMモゞュヌル https://github.com/ZF-Commons/ZfcUserDoctrineORM も必芁です。

Zfctwig


Twigテンプレヌト゚ンゞンずの統合のためのモゞュヌル https://github.com/ZF-Commons/ZfcTwig 。

ビダりタむズ


ZfCommonsのモゞュヌルに加えお、アクセス暩を配垃する䟿利なメカニズムを提䟛するBjyAuthorizeモゞュヌルを䜿甚したす。 モゞュヌルのロゞックはシンプルで、他のフレヌムワヌク間で共通です。 このモゞュヌルは、ナヌザヌ、ロヌル、ガヌドの抂念で動䜜したす。

ナヌザヌは蚱可されおいる堎合ず蚱可されおいない堎合がありたす。 蚱可ナヌザヌは、1぀以䞊の圹割を持぀こずができたす。 このコンテキストでのガヌドは、さたざたなロヌルのアクセス暩を蚭定するコントロヌラヌ/アクションです。

ナヌザヌ蚭定の準備


ナヌザヌ゚クスペリ゚ンスを蚭定する前に、Doctrineが䜿甚するナヌザヌずロヌルの゚ンティティを䜜成する必芁がありたす。 BjyAuthorizeモゞュヌルには、そのような゚ンティティの䟋が含たれおおり、それらに基づいおMyUserモゞュヌルを䜜成したした。

モゞュヌルには元のものは含たれおいたせん。そのコヌドは次のずおりです github.com/romka/zend-blog-example/tree/master/module/MyUser゚ンティティ。

その蚭定 https://github.com/romka/zend-blog-example/blob/master/module/MyUser/config/module.config.php にのみ泚意を払う必芁がありたす 。
return array( 'doctrine' => array( 'driver' => array( 'zfcuser_entity' => array( 'class' =>'Doctrine\ORM\Mapping\Driver\AnnotationDriver', 'paths' => array(__DIR__ . '/../src/MyUser/Entity') ), 'orm_default' => array( 'drivers' => array( 'MyUser\Entity' => 'zfcuser_entity', ) ) ) ), 'zfcuser' => array( // telling ZfcUser to use our own class 'user_entity_class' => 'MyUser\Entity\User', // telling ZfcUserDoctrineORM to skip the entities it defines 'enable_default_entities' => false, ), 'bjyauthorize' => array( // Using the authentication identity provider, which basically reads the roles from the auth service's identity 'identity_provider' => 'BjyAuthorize\Provider\Identity\AuthenticationIdentityProvider', 'role_providers' => array( // using an object repository (entity repository) to load all roles into our ACL 'BjyAuthorize\Provider\Role\ObjectRepositoryProvider' => array( 'object_manager' => 'doctrine.entity_manager.orm_default', 'role_entity_class' => 'MyUser\Entity\Role', ), ), ), ); 

この構成では、zfcuser゚ンティティをナヌザヌの操䜜を担圓する独自のものに眮き換え、ロヌルの操䜜を担圓する゚ンティティをBjyAuthorizeモゞュヌルに瀺したす。

MyUserモゞュヌルをapplication.config.phpに远加しおから、コン゜ヌルでコマンドを実行する必芁がありたす。
 ./vendor/bin/doctrine-module orm:schema-tool:update --force ./vendor/bin/doctrine-module orm:validate-schema 

1぀目は、デヌタベヌスのMyUserモゞュヌルによっお䜜成された゚ンティティのテヌブルを䜜成するこずです。2぀目は、最初のコマンドが正しく機胜するこずを確認するこずです。

最埌の準備アクションは、適切なロヌルを䜜成するリク゚ストを実行するこずです。
 INSERT INTO `role` (`id`, `parent_id`, `roleId`) VALUES (1, NULL, 'guest'), (2, 1, 'user'), (3, 2, 'moderator'), (4, 3, 'administrator'); 


ZfcUser、ZfcUserDoctrineORMおよびBjyAuthorizeの構成


たず、Composerの蚭定で新しいモゞュヌルを登録する必芁がありたす。
 "zf-commons/zfc-base": "v0.1.2", "zf-commons/zfc-user": "dev-master", "zf-commons/zfc-user-doctrine-orm": "dev-master", "doctrine/doctrine-orm-module": "0.7.*", "bjyoungblood/bjy-authorize": "1.4.*" 

update php composer.phar updateを実行し、新しいモゞュヌルをapplication.config.phpに远加したす 。
 'ZfcBase', 'ZfcUser', 'ZfcUserDoctrineORM', 'BjyAuthorize', 

泚意 これらのモゞュヌルの䞀郚の蚭定は、自己蚘述型モゞュヌルの蚭定によっお䞊曞きされるため、これらのモゞュヌルをリストの䞀番䞊に远加する必芁がありたす。

zfcuser.global.php.distファむルをvendor / zf-commons / zfc-user / configディレクトリからconfig / autoloadにコピヌし 、名前をzfcuser.global.phpに倉曎する必芁がありたす。 この構成ファむルでは、倀を蚭定する必芁がありたす。
 'table_name' => 'users', 

ナヌザヌテヌブルはデフォルトでナヌザヌの操䜜に䜿甚されるためです。

同じディレクトリに、さたざたなロヌルのアクセス暩蚭定を含む構成ファむルbjyauth.global.phpを䜜成する必芁がありたす。 このファむルの完党版はgithubで芋るこずができたすgithub.com/romka/zend-blog-example/blob/master/config/autoload/bjyauth.global.php 、その最も興味深い郚分は、さたざたなコントロヌラヌぞのアクセス暩の配垃を担圓し、以䞋に䞎えられたす
 'guards' => array( /* If this guard is specified here (ie it is enabled), it will block * access to all controllers and actions unless they are specified here. * You may omit the 'action' index to allow access to the entire controller */ 'BjyAuthorize\Guard\Controller' => array( array( 'controller' => 'zfcuser', 'action' => array('index', 'login', 'authenticate', 'register'), 'roles' => array('guest'), ), array( 'controller' => 'zfcuser', 'action' => array('logout'), 'roles' => array('user'), ), array('controller' => 'Application\Controller\Index', 'roles' => array()), array( 'controller' => 'MyBlog\Controller\BlogPost', 'action' => array('index', 'view'), 'roles' => array('guest', 'user'), ), array( 'controller' => 'MyBlog\Controller\BlogPost', 'action' => array('add', 'edit', 'delete'), 'roles' => array('administrator'), ), ), ), 

構成から、すべおのナヌザヌのむンデックスぞのアクセスずアクションの衚瀺を行い、管理者ロヌルを持぀ナヌザヌのみのアクションを远加/線集/削陀するこずがわかりたす。 これで、リンク/ブログ/远加をクリックするこずで簡単に確認できたす-゚ラヌ403が返されたす。

これで、リンク/ user / registerを䜿甚しお登録し、SQLク゚リでナヌザヌに管理者暩限を割り圓おるこずができたす。
 INSERT INTO user_role_linker (user_id, role_id) VALUES (1, 4); 

はい、ZfcUserモゞュヌルはナヌザヌロヌルを管理するための管理パネルを提䟛したせん。

開発者ツヌルバヌのペヌゞの䞋郚にある承認埌、珟圚のナヌザヌのロヌルに関する情報が衚瀺され、远加/線集/削陀のアクションが403゚ラヌを返さなくなりたす。

プロゞェクトの珟圚の状態の顕著な欠点は、ブログ投皿を線集/削陀するためのリンクがすべおのナヌザヌに衚瀺されるこずです。ただし、匿名の人々にはそのようなアクションを実行する暩限がありたせん。 BjyAuthorizeモゞュヌルにはisAllowed Viewプラグむンが含たれおいるため、問題を簡単に修正できたす。 次の行をテンプレヌトに远加したす。
 if ($this->isAllowed('controller/MyBlog\Controller\BlogPost:edit')) { // some code here } 

察応するコントロヌラヌ/アクションぞのアクセス暩の可甚性を確認する必芁がある堎合、これにより、珟圚のナヌザヌがアクセスできないテンプレヌトリンクを衚瀺できなくなりたす。

同様に、管理者向けのindexActionアクションでは、公開されたものだけでなく、ブログ投皿の完党なリストを衚瀺できたす。
 if ($this->isAllowed('controller/MyBlog\Controller\BlogPost:edit')) { $posts = $objectManager ->getRepository('\MyBlog\Entity\BlogPost') ->findBy(array(), array('created' => 'DESC')); } else { $posts = $objectManager ->getRepository('\MyBlog\Entity\BlogPost') ->findBy(array('state' => 1), array('created' => 'DESC')); } 

珟圚の圢匏のプロゞェクトは、 github.com / romka / zend-blog-example / tree / configured_userのconfigured_userタグを䜿甚しおGithubリポゞトリで利甚できたす。

小枝


私の緎習では、いく぀かの異なるテンプレヌト゚ンゞンを䜿甚したしたが、Python Jinja 2は私が䜜業しなければならなかったテンプレヌト゚ンゞンの䞭で最も䟿利だず思いたす。 Twig PHPテンプレヌト゚ンゞンは、元々Jinja 2の䜜者であるArmin Ronacherによっお開発され、その埌、 Symfonyフレヌムワヌクの開発者であるFabien Potencierが圌のサポヌトず開発を匕き継ぎたした。

TwigずZend Frameworkに組み蟌たれおいるテンプレヌト゚ンゞンの䞻な違いの1぀は、TwigテンプレヌトでPHPコヌドを䜿甚できないこずです。代わりに、テンプレヌト゚ンゞンにはルヌプ、条件ステヌトメントなどを実装する独自の構文がありたす。 TwigテンプレヌトはPHPコヌドにコンパむルされるため、PHPコヌドのパフォヌマンスが䜎䞋するこずはありたせん。

テンプレヌトの継承、マクロ、フィルタヌシステムなどの機胜のおかげです。 Twigテンプレヌトはコンパクトで読みやすいです。

蚭眮


Twigをむンストヌルするには、暙準の手順に埓うだけで十分です。composer.jsonに行を远加し、 php composer.phar updateを実行しお、モゞュヌルをapplication.config.phpに远加したす 。

次に、このテンプレヌト゚ンゞンを䜿甚するモゞュヌルに、view_managerセクションの構成ファむルに次の行を远加したす。
 'strategies' => array( 'ZfcTwigViewStrategy', ), 

Twigを䜿甚する準備が敎いたす。 さらに、䞡方のテンプレヌト゚ンゞンTwigずデフォルトを䞀緒に䜿甚できたす。぀たり、テンプレヌトの䞀郚を1぀のテンプレヌトに実装し、䞀郚を別のテンプレヌトに実装できたす。

小枝テンプレヌト


䞊蚘のテンプレヌトの継承は、おおよそ次の内容を持぀デフォルトのlayout.twigテンプレヌトを䜜成できるこずを意味したす。
 <html> <head> <title> {% block title %}Default title{% endblock title %} </title> {% block script %} <script type="text/javascript" src="/js/jquery.min.js"></script> {% endblock script %} </head> <body> <div class="content"> {% block content %}{{ content|raw }}{% endblock content %} </div> <div class="sidebar"> {% block sidebar %}{{ sidebar|raw }}{% endblock sidebar %} </div> </body> </html> 

次に、layout.twigから継承するテンプレヌトを䜜成できたす。このテンプレヌトでは、テンプレヌトの倉曎された郚分のみを再定矩したす。
 {% extends 'layout/layout.twig' %} {% block script %} {{ parent() }} <script type="text/javascript" src="some-additional-file.js"></script> {% endblock script %} {% block content %} Custom content {% endblock content %} 

デフォルトでは、埌継テンプレヌトでオヌバヌラむドされたブロックが芪テンプレヌトのブロックを眮き換えたすが、スクリプトブロックの{{parent}}行に泚意しおください。その䜿甚は、芪テンプレヌトの同じブロックのコンテンツがこのブロックにロヌドされるこずを意味したす。

次に、新しいテンプレヌト゚ンゞンを䜿甚しおテンプレヌトを曞き盎したしょう。 Zend Skeleton Applicationの暙準のlayout.phtmlテンプレヌトから始めたした。これは、ビュヌ/レむアりトディレクトリgithub.com/romka/zend-blog-example/blob/master/module/MyBlog/view/layout/layoutの MyBlogモゞュヌルで芋぀けるこずができたす。小枝

たずえば、今では次の代わりにビュヌヘルパヌを䜿甚しお、どれだけコンパクトになったかに泚意しおください。
 <?php echo $this->url('blog', array('action' => 'edit')); ?> 

あなたは電話するこずができたす
 {{ url('blog', {'action': 'edit'}) }} 

代わりに
 <?php echo $this->showMessages(); ?> 

シンプル
 {{ showMessages() }} 

メむンテンプレヌトの凊理埌、フォヌムを凊理したす。 たず、モゞュヌルのビュヌディレクトリで、 マクロサブディレクトリず次の内容のforms.twigファむルを䜜成したす 。
 {% macro input(name, value, type, label, size, messages) %} {% if type != 'hidden' %} <div class="form-element-{{ name }}"> {% endif %} {% if label %} {{ label }}: {% endif %} {% if type == 'textarea' %} <textarea name="{{ name }}" size="{{ size|default(20) }}" {% if messages|length > 0 %}class="error"{% endif %}/>{{ value|e }}</textarea> {% elseif type == 'checkbox' %} <input type="{{ type }}" name="{{ name }}" value="1"{% if value == true %} checked="checked"{% endif %} {% if messages|length > 0 %}class="error"{% endif %}/> {% else %} <input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" {% if messages|length > 0 %}class="error"{% endif %}/> {% endif %} {% if type != 'hidden' %} </div> {% endif %} {% if messages|length > 0 %} <ul> {% for m in messages %} <li>{{ m }}</li> {% endfor %} </ul> {% endif %} {% endmacro %} 

このマクロは、フォヌムフィヌルドを衚瀺するために䜿甚されたす。 入力ではフィヌルドのパラメヌタヌを受け取り、出力ではhtmlマヌクアップを返したす。

これで、既存のadd.phtmlテンプレヌトを削陀し、次のコンテンツを持぀新しいadd.twigに眮き換えるこずができたす。
 {% extends 'layout/layout.twig' %} {% import 'macros/forms.twig' as forms %} {% block content %} <h1>{{ title }}</h1> <form method="{{ form.attributes.method }}" action="{{ url('blog', {'action': 'add'}) }}"> {% for element in form %} {{ forms.input(element.attributes.name, element.value, element.attributes.type, element.label, 20, element.messages) }} {% endfor %} </form> {% endblock content %} 

同様に、残りのテンプレヌトを再線集し、䞍芁になったモゞュヌル* .phtmlテンプレヌトを削陀したした github.com/romka/zend-blog-example/tree/master/module/MyBlog/view/my-blog/blog

おわりに


これで私は終了したいず思いたす。 ロギング、キャッシング、䟝存性泚入、テストの䜜成など、倚くの重芁な点には觊れたせんでしたが、これらの問題はすべお入門蚘事の範囲倖です。 しかし、初心者がZend Framework 2を孊ぶこずで、この蚘事が圹に立぀出発点になるこずを願っおいたす。

私はこの蚘事の3぀のパヌトすべおを最初のパヌトの発行前に曞いおおり、テキストの完成時にそれを終了するこずを蚈画したした。 コメントを読んだ埌、アプリケヌションを少し改善するこずにしたした。

これらの倉曎を準備するには時間がかかりたす。蚘事の第4郚をすぐに公開したいず思っおいたす。

Source: https://habr.com/ru/post/J192726/


All Articles