過去1年にわたり、PHPixieは多くの新機能といくつかのコンポーネントを追加し、開発者のしきい値を下げるために標準のバンドル構造がわずかに変更されました。 それで、新しいチュートリアルを作成する時が来ました。そして今度はそれを少し違ったものにしようとします。 完成したデモプロジェクトを説明とともに見るのではなく、徐々に進み、各反復で完全に機能するサイトを作成します。 ログイン、登録、ソーシャルネットワークとの統合、統計用のコンソールコマンドを含む簡単な見積もりボックスを作成します。 githubコミットの完全な履歴。
1.プロジェクトの作成
始める前に、 チャットで「こんにちは」と発声してください。そこで発生する可能性のある問題の99%は、ほぼ瞬時に解決されます。
Composerが必要です。インストール後、次を実行します。
php composer.phar create-project phpixie/project
これにより、 プロジェクトスケルトンと1つのバンドル「app」を含むプロジェクトフォルダが作成されます。 バンドルは、コードモジュール、テンプレート、CSSなどです。 アプリケーションの一部に関連しています。 Composerを使用して、プロジェクトからプロジェクトに簡単に転送できます。 アプリケーションのロジック全体が含まれるバンドルを1つだけ使用します。
次に、仮想ホストを作成し、プロジェクト内の/ webフォルダーにリダイレクトする必要があります。 すべてが順調に進んだら、ブラウザでhttp:// localhost /に移動すると、挨拶が表示されます。 http:// localhost / greetに移動して、ルーティングが機能するかどうかをすぐに確認します。
Windowsを使用している場合、 create-projectコマンドを実行するとエラーが発生する可能性が高くなります。これは、このPHP OSでsymlink()関数が機能しないためです。 単に無視することができますが、少し後でこの問題を回避する方法を示します。
この段階でのプロジェクトのステータス(コミット1)
2.メッセージを表示する
データベースに接続することから始めましょう。このために/assets/config/database.phpを編集します 。 プロジェクトフォルダーから2つのコンソールコマンドを実行して、接続を確認できます。
./console framework:database drop # ./console framework:database create #
次に、 /assets / migrate / migrations / 1_users_and_messages.sqlのテーブル構造を使用して移行を作成します。
CREATE TABLE users( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL, email VARCHAR(255) UNIQUE, passwordHash VARCHAR(255) ); -- statement CREATE TABLE messages( id INT PRIMARY KEY AUTO_INCREMENT, userId INT NOT NULL, text VARCHAR(255) NOT NULL, date DATETIME NOT NULL, FOREIGN KEY (userId) REFERENCES users(id) );
-- statement
を使用してリクエストを分離していることに注意してください。
また、データベースを埋めるためにいくつかのデータをすぐに追加します。これのために、 / assets / migrate / seeds /にファイルを作成します。ここで、ファイル名はテーブル名に対応します。
<?php
これらのファイルの完全なコンテンツは、githubで表示できます。 次に、さらに2つのコンソールコマンドを実行します。
./console framework:migrate
これで、最初のページに進むことができます。 最初に、ルートが構成されている/bundles/app/assets/config/routeResolver.phpファイル、つまり、どのプロセッサーがどのリンクに対応するかを検討します。 メッセージの表示を担当するメッセージプロセッサを追加します。 デフォルトとして登録し、すぐにメインページのルートを追加します。
return array( 'type' => 'group', 'defaults' => array('action' => 'default'), 'resolvers' => array( 'action' => array( 'path' => '<processor>/<action>' ), 'processor' => array( 'path' => '(<processor>)', 'defaults' => array('processor' => 'messages') ),
親テンプレート/bundles/app/assets/template/layout.phpを変更してレイアウトを開始し、それにBootstrap 4とCSSを追加します。
<!DOCTYPE html> <html lang="en"> <head> <!-- Bootstrap 4 --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta http-equiv="x-ua-compatible" content="ie=edge"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css"> <!-- CSS, --> <link rel="stylesheet" href="/bundles/app/main.css"> <!-- Quickstart --> <title><?=$_($this->get('pageTitle', 'Quickstart'))?></title> </head> <body> <!-- Navigation --> <nav class="navbar navbar-toggleable-md navbar-light bg-faded"> <div class="container"> <!-- --> <a class="navbar-brand mr-auto" href="<?=$this->httpPath('app.frontpage')?>">Quickstart</a> </div> </nav> <!-- --> <?php $this->childContent(); ?> <!-- Bootstrap dependencies --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.3.7/js/tether.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/js/bootstrap.min.js"></script> </body> </html>
main.cssファイルを作成する場所は? 必要なファイルはすべてバンドル内に最適に保持されるため、これは/ bundles / app / web /フォルダーになります。 作曲家がプロジェクトを作成すると、 / bundles / app / webを含むシンボリックリンクがこのフォルダーに自動的に作成され、これらのファイルにブラウザーからアクセスできるようになります。 Windowsでは、ショートカットを作成する代わりに、コマンドを実行するフォルダーをコピーする必要があります。
# web /web/bundles ./console framework:installWebAssets --copy
/bundles/app/src/HTTP/Messages.phpに新しいプロセッサを作成します
namespace Project\App\HTTP; use PHPixie\HTTP\Request; class Messages extends Processor { public function defaultAction($request) { $components = $this->components();
重要:/bundles/app/src/HTTP.phpに登録することを忘れないでください :
namespace Project\App; class HTTP extends \PHPixie\DefaultBundle\HTTP {
ほぼ完了しました。 アプリに追いつくためだけに残っています。プロセッサが使用するメッセージテンプレートです。これが最も簡単な部分です。
<?php
すべて準備が整ったので、 http:// localhostに移動します。メッセージの完全なリストが表示されます。
この段階でのプロジェクトのステータス(コミット2)
3. ORMリンクとページネーション
各メッセージの下でそれを作成したユーザーを示すために、テーブル間の関係を登録する必要があります。 移行では、各メッセージが1 対多の関係になるように、各メッセージに必須のuserIdフィールドが含まれることを示しました。
ページパラメータを使用してメッセージをページ分割する新しいルートを追加します。
そして、メッセージプロセッサ自体を少し変更します。
public function defaultAction($request) { $components = $this->components();
テンプレートで、 $pager->getCurrentItems()
を使用してこのページのメッセージを取得し、 $pager->getCurrentItems()
$message->user()
を$message->user()
に関する情報を取得し、ページャーに追いつくことができます。 ここではページ全体のテンプレートをコピーしません。リポジトリで表示できます。
この段階でのプロジェクトのステータス(コミット3)
4.ユーザー認証
ユーザーにメッセージの書き込みを許可する前に、ユーザーに許可を与える必要があります。 これを行うには、ユーザーとそのリポジトリの本質を指定して拡張する必要があります。 ここでは、エンティティが1人のユーザーを表し、リポジトリがこれらのエンティティを検索および作成する方法を提供するという違いを理解することが重要です。 パスワード認証のために、いくつかのインターフェースを実装する必要がありますが、これらはすべて非常に簡単です。
namespace Project\App\ORM\User; use Project\App\ORM\Model\Repository; use Project\App\ORM\User; use PHPixie\AuthLogin\Repository as LoginUserRepository; class UserRepository extends Repository implements LoginUserRepository { public function getById($id) { return $this->query() ->in($id) ->findOne(); } public function getByLogin($login) { return $this->query() ->where('email', $login) ->findOne(); } }
重要:これらのクラスを/bundles/app/src/ORM.phpに登録することを忘れないでください
namespace Project\App; class ORM extends \PHPixie\DefaultBundle\ORM { protected $entityMap = array( 'user' => 'Project\App\ORM\User' ); protected $repositoryMap = [ 'user' => 'Project\App\ORM\User\UserRepository' ]; }
認可設定を/assets/config/auth.phpに書き込みます:
ログインページを追加するだけです。このために、新しいプロセッサを作成します。
namespace Project\App\HTTP; use PHPixie\AuthLogin\Providers\Password; use PHPixie\HTTP\Request; use PHPixie\Validate\Form; use Project\App\ORM\User\UserRepository; use PHPixie\App\ORM\User; class Auth extends Processor { public function defaultAction($request) {
ここですべてのコードをコピーしないように、承認フォーム自体に追いつくだけです。1つのフィールドの例を示します。
<-- has-danger --> <div class="form-group <?=$this->if($loginForm->fieldError('email'), "has-danger")?>"> <-- --> <input name="email" type="text" value="<?=$_($loginForm->fieldValue('email'))?>" class="form-control" placeholder="Username"> <-- --> <?php if($error = $loginForm->fieldError('email')): ?> <div class="form-control-feedback"><?=$error?></div> <?php endif;?> </div>
また、ログインとログアウトへのルートとリンクをヘッダーに追加すると、ログインは機能します。
この段階でのプロジェクトのステータス(コミット4)
5.登録
登録フォームは完全に類推して行われます。Authプロセッサーの変更を考慮してください。
protected function registerForm() { $validate = $this->components()->validate(); $validator = $validate->validator(); $document = $validator->rule()->addDocument();
唯一の注意点は、フォームのHTMLコードに非表示のregister
フィールドを追加したことです。これにより、このログインまたは登録を確認します。
この段階でのプロジェクトのステータス(コミット5)
6.ソーシャルログイン
次に、FacebookとTwitterからのログインを接続します。 まず、2つのフィールドfacebookId
とtwitterId
をユーザーテーブルに追加して、新しい移行を作成します。
ALTER TABLE users ADD COLUMN twitterId VARCHAR(255) AFTER passwordHash;
次に、これらのプラットフォームでアプリケーションを作成し、 appId
およびappSecret
を取得するappId
ありappSecret
。 登録時に、Callback Urlを正しく指定します。Twitterの場合はhttp://localhost.com/socialAuth/callback/twitter
場合はhttp://localhost.com/socialAuth/callback/twitter
を正しく指定します。 これらのルートは後で作成しますが、今のところ設定を記述します。
そして、使い慣れたauth.php
でソーシャルログインサポートを有効にします。
設定ですべてが完了しました。コードに取りかかりましょう。 パスワードでログインするために、リポジトリおよびユーザーエンティティのクラスにインターフェイスを実装する必要があったことを覚えていますか? ここでもう1つ追加されます。
namespace Project\App\ORM\User;
そして最後に、承認のための新しいプロセッサ自体:
namespace Project\App\HTTP\Auth; use PHPixie\App\ORM\User; use PHPixie\AuthSocial\Providers\OAuth as OAuthProvider; use PHPixie\HTTP\Request; use Project\App\ORM\User\UserRepository; use Project\App\HTTP\Processor; use PHPixie\Social\OAuth\User as SocialUser; class Social extends Processor { public function defaultAction($request) { $provider = $request->attributes()->get('provider');
次に、ルートを登録し、認証フォームにログインリンクを追加します。
この段階でのプロジェクトのステータス(コミット6)
7.メッセージの追加
実際にはここには興味深いものは何もありません。別の形式で、今回は変更のためにAJAXを介してのみです。 ここで注意すべき唯一のもの
そのため、テンプレートのブロックを使用してスクリプトを追加しています。 そして、 scripts
ブロックを親テンプレートに追加します。
<!-- /bundles/app/assets/templates/layout.php --> <!-- --> <?=$this->block('scripts')?>
messages
テンプレート自体で、このブロックにスクリプトを追加できます。
<!-- /bundles/app/assets/templates/messages.php --> <?php $this->startBlock('scripts'); ?> <script> $(function() {
, . ,
, :
<?php $this->startBlock('test'); ?> Hello <?php $this->endBlock(); ?> <?php $this->startBlock('test'); ?> World <?php $this->endBlock(); ?> <?=$this->block('test')?> <!-- --> Hello World
<!-- true , startBlock() false if . --> <?php if($this->startBlock('test', true)): ?> Hello <?php $this->endBlock();endif; ?> <?php if($this->startBlock('test', true)): ?> World <?php $this->endBlock();endif; ?> <?=$this->block('test')?> <!-- --> Hello
Messages
:
public function postAction($request) {
** ( 7)
8.
. :
namespace Project\App\Console; use PHPixie\Console\Command\Config; use PHPixie\Slice\Data; class Messages extends Command { protected function configure($config) {
namespace Project\App\Console; use PHPixie\Console\Command\Config; use PHPixie\Database\Driver\PDO\Connection; use PHPixie\Slice\Data; class Stats extends Command { protected function configure($config) { $config->description("Display statistics"); } public function run($argumentData, $optionData) {
Project\App\Console
:
namespace Project\App; class Console extends \PHPixie\DefaultBundle\Console { protected $classMap = array( 'messages' => 'Project\App\Console\Messages', 'stats' => 'Project\App\Console\Stats' ); }
, :
# ./console Available commands: app:messages Print latest messages app:stats Display statistics # ....
# ./console help app:messages app:messages [ --userId=VALUE ] [ LIMIT ] Print latest messages Options: userId Only print messages of this user Arguments: LIMIT Maximum number of messages to display, default is 5
# ./console help app:stats app:stats Display statistics
:
# ./console app:messages 2 Simplicity is the ultimate sophistication. -- Leonardo da Vinci by Trixie on 7 Dec 2016, 16:40 Simplicity is prerequisite for reliability. -- Edsger W. Dijkstra by Trixie on 7 Dec 2016, 15:05
# ./console app:stats Total messages: 14 Pixie: 3 Trixie: 11
( 8)
9.
, .
, /assets/parameters.php
, .
:
. PHP
if
switch
.
, , . , , .
:)