目次
symfony フォームとページ実装スキル、symfony フォームスキル
ホームページ バックエンド開発 PHPチュートリアル symfony フォームとページの実装スキル、symfony フォームスキル_PHP チュートリアル

symfony フォームとページの実装スキル、symfony フォームスキル_PHP チュートリアル

Jul 13, 2016 am 10:09 AM
symfony ページ

symfony フォームとページ実装スキル、symfony フォームスキル

この記事の例では、symfony のフォームとページの実装テクニックについて説明します。皆さんの参考に共有してください。詳細は以下の通りです

Symfony の開発は非常にシンプルですが、機能の数はまだ不足しています。次に、askeek サイトとユーザーの間で何らかの対話を行います。リンク以外の HTML インタラクションの基礎はフォームです。

ここでの目標は、ユーザーがログインして、ホームページ上の質問リストを参照できるようにすることです。これにより開発が迅速になり、以前のコンテンツを思い出すことができます。

ログインフォーム

テストデータにはユーザーが含まれていますが、プログラムにはそれを検証する方法がありません。次に、プログラムのすべてのページにログイン フォームを追加します。グローバル レイアウト ファイル askeet/apps/frontend/templates/layout.php を開き、about への接続の前に次のコード行を追加します。

コードをコピーします コードは次のとおりです:
  • 現在のレイアウトでは、これらのリンクが Web デバッグ ツールバーの直後に配置されます。これらのリンクを表示するには、「Sf」アイコンをクリックしてデバッグ ツールバーを折りたたみます。

    次に、ユーザーモジュールを作成する必要があります。質問モジュールは翌日に生成されました。今回は symfony にモジュール フレームワークの作成を依頼しただけで、コードは自分たちで書きます。

    コードをコピーします コードは次のとおりです:
    $ symfony init-modulefrontend user

    このフレームワークには、デフォルトのインデックスアクションとindexSuccess.phpテンプレートが含まれています。必要ないので削除してください。

    ユーザー/ログインアクションの作成

    コードをコピーします コードは次のとおりです:
    user/actions/action.class.php ファイルに、次のログイン アクションを追加します:

    パブリック関数executeLogin()
    {
    $this->getRequest()->setAttribute('referer', $this->getRequest()->getReferer());

    sfView::SUCCESS;
    を返します }

    このアクションにより、リファラーがリクエスト属性に保存されます。この属性は、モジュールで使用するために非表示領域に保存できるため、ログイン成功後にフォームの意図したアクションを元のリファラーにリダイレクトできます。

    ステートメント return sfView::SUCCESS は、アクションの実行結果を loginSuccess.php モジュールに渡します。このステートメントは、return ステートメントを含まないアクションに実装されます。そのため、アクションのデフォルト モジュールは actionnameSuccess.php と呼ばれます。

    アクションについてさらに作業を始める前に、モジュールを見てみましょう。

    loginSuccess.phpモジュールを作成する

    Web 上での人間とコンピューターのやり取りの多くはフォームを使用しており、Symfony はフォーム ヘルパーのコレクションを提供することでフォームの作成と管理を組織化します。

    askeet/apps/frontend/modules/user/templates/ ディレクトリに、次の loginSuccess.php モジュールを作成します。

    コードをコピーします コードは次のとおりです:

    <フィールドセット>



    get('ニックネーム')) ?>









    getAttribute('referer')) ?>



    このモジュールはフォームヘルパーを初めて使用するものです。これらの Symfony 関数は、フォームタグを自動的に作成するのに役立ちます。 form_tag() はタグを開き、デフォルトのアクションとして POST を使用し、引数として渡されたアクションを指します。 input_tag() ヘルパーは タグを生成し、渡された最初の引数に基づいて id 属性を自動的に追加します。デフォルト値は 2 番目の引数から取得されます。フォームヘルパーとそれが生成する HTML コードの詳細については、Symfony ブックの関連する章を参照してください。

    ここでの本質は、フォームが送信されたときにこのアクションが呼び出されるということです。それでは、戻ってこのアクションを見てみましょう。

    フォームの送信を処理する

    先ほど書いたログインアクションを次のコードに置き換えます:

    コードをコピーします コードは次のとおりです:
    public functionexecuteLogin()
    {
    if ($this->getRequest()->getMethod() != sfRequest::POST)
    {
    // フォームを表示します
    $this->getRequest()->setAttribute('referer', $this->getRequest()->getReferer());
    }
    それ以外
    {
    // フォーム送信を処理します
    $nickname = $this->getRequestParameter('nickname');

    $c = 新しい基準();
    $c->add(UserPeer::NICKNAME, $nickname);
    $user = UserPeer::doSelectOne($c);

    // ニックネームは存在しますか?
    ($user) の場合
    {
    // パスワードは大丈夫ですか?
    もし(本当なら)
    {
    $this->getUser()->setAuthenticated(true);
    $this->getUser()->addCredential('subscriber');

    $this->getUser()->setAttribute('subscriber_id', $user->getId(), 'subscriber');
    $this->getUser()->setAttribute('nickname', $user->getNickname(), 'subscriber');

    // 最後のページにリダイレクトします
    return $this->redirect($this->getRequestParameter('referer', '@homepage'));
    }
    }
    }
    }

    ログインアクションを使用すると、ログインフォームの表示と処理を同時に行うことができます。したがって、彼は自分が呼ばれる環境を知らなければなりません。アクションが POST モードで呼び出されない場合 (リンクによって要求されたため): これは、まさに上で説明した状況です。 POST モードで要求された場合、このアクションはフォームによって呼び出され、それに応じて処理されます。

    このアクションは、リクエスト パラメーターからニックネーム フィールドの値を取得し、User テーブルをクエリして、このユーザーがデータベースに存在するかどうかを確認します。

    将来的には、パスワード制御によりユーザーに資格情報が割り当てられるようになります。ただし、このアクションで実行されるのは、ユーザーの ID 属性とニックネーム属性をセッション属性に保存することだけです。最後に、アクションはフォーム内に隠されている元のリファラー フィールドにリダイレクトされ、リクエスト パラメーターとして渡されます。このフィールドが空の場合は、デフォルト値が使用されます。

    ここで、この例の 2 種類の属性セットの違いに注意する必要があります。リクエスト属性 ($this->getRequest()->setAttribute()) はテンプレート用に保存され、回答は参照者に送信され、忘れられます。セッション属性 ($this->getUser()->setAttribute()) はユーザー セッションの存続期間全体にわたって保存され、将来他のアクションによってアクセスできます。プロパティについてさらに詳しく知りたい場合は、Symfony ブックの「パラメータ セーバー」セクションを参照してください。

    権限を割り当てる

    ユーザーがaskeek Webサイトにログインできるのは良いことですが、ユーザーはただ楽しむためにログインしているわけではありません。新しい質問を投稿したり、特定の質問に関心を示したり、コメントを評価したりするには、ログインする必要があります。他のアクションは、ログインしていないユーザーにも公開されます。

    ユーザーを認証済みとして設定するには、sfUser オブジェクトの ->setAuthenticated() メソッドを呼び出す必要があります。このオブジェクトは、構成を通じてアクセスを制限するための証明書メカニズム (->addCredential()) も提供します。これについては、Symfony ブックの「ユーザー証明書」セクションで詳しく説明されています。

    これが次の 2 行の目的です:

    コードをコピーします コードは次のとおりです:
    $this->getContext()->getUser()->setAuthenticated(true);
    $this->getContext()->getUser()->addCredential('subscriber');

    ニックネームが認識されると、ユーザーデータがセッション属性に保存されるだけでなく、Web サイトの制限された部分へのアクセス権もユーザーに割り当てられます。明日は、プログラムへのアクセスを認証されたユーザーに制限する方法について説明します。

    ユーザー/ログアウトアクションを追加

    ->setAttribute() メソッドに関する最後のヒントが 1 つあります。最後のパラメーター (上記の例ではサブスクライバー) は、属性が保存される名前空間を定義します。名前空間を使用すると、別の名前空間に存在する名前を属性に割り当てることができるだけでなく、そのような属性をすべて 1 つのコマンドで素早く削除することもできます:

    コードをコピーします コードは次のとおりです:
    public functionexecuteLogout()
    {
    $this->getUser()->setAuthenticated(false);
    $this->getUser()->clearCredentials();

    $this->getUser()->getAttributeHolder()->removeNamespace('subscriber');

    $this->redirect('@homepage');
    }

    名前空間を使用すると、これらの属性を 1 つずつ削除する手間が省けます。これは 1 行のステートメントだけです。

    レイアウトを更新しました

    現在のレイアウトでは、ユーザーがログインしている場合でも「ログイン」リンクが表示されます。これを修正しましょう。 askeet/apps/frontend/templates/layout.php ファイルで、今日のガイドの冒頭で変更したコードを変更します。

    コードをコピー コードは次のとおりです:
    isAuthenticated()): ?>

  • getAttribute('nickname', '', 'subscriber').' profile', 'user/profile') ?>



  • いよいよテストです。プログラムの任意のページを表示し、「ログイン」リンクをクリックし、使用可能なニックネーム (「匿名」など) を入力して確認します。ウィンドウの上部にある「ログイン」が「サインアウト」に変わったら、これまでの操作はすべて正しいことになります。最後に、ログアウトして「ログイン」リンクが再度表示されるかどうかを確認してください。

    質問組織

    何千人もの Symfony 愛好家が askeet の Web サイトにアクセスするにつれて、ホームページにはますます多くの質問が表示されます。リクエスト速度の低下を避けるためには、質問リストのランダムな閲覧が解決すべき問題となる。

    Symfony は、この目的のためにオブジェクト sfPropelPager を提供します。データのリクエストがカプセル化されるため、現在のページに表示されているレコードのみがクエリされます。たとえば、ページあたり 10 個の質問のみでページが初期化されている場合、データへのリクエストは 10 個の結果のみに制限され、オフセットはページ内で一致するように設定されます。

    質問/リストのアクションを変更する

    前の演習では、質問モジュールの表示アクションを見ました:

    コードをコピーします コードは次のとおりです:
    public functionexecuteList()
    {
    $this->questions = QuestionPeer::doSelect(new Criteria());
    }

    配列を渡す代わりに sfPropelPager をテンプレートに渡すようにこのアクションを変更します。同時に、興味のある量に応じて質問を並べ替えます:

    コードをコピーします コードは次のとおりです:
    public functionexecuteList()
    {
    $pager = new sfPropelPager('質問', 2);
    $c = 新しい基準();
    $c->addDescendingOrderByColumn(QuestionPeer::INTERESTED_USERS);
    $pager->setCriteria($c);
    $pager->setPage($this->getRequestParameter('page', 1));
    $pager->setPeerMethod('doSelectJoinUser');
    $pager->init();

    $this->question_pager = $pager;
    }

    sfPropelPager オブジェクトの初期化は、それに含まれるオブジェクト クラスと、ページ上に配置できるオブジェクトの最大数 (この例では 2) を示します。 -> setPage() メソッドは、リクエスト パラメータを使用して現在のページを設定します。たとえば、このページ パラメータの値が 2 の場合、sfPropelPager は 3 から 5 までの結果を返します。ページ リクエスト パラメータの値が 1 に変更されると、ページはデフォルトで 1 から 2 までの結果を返します。 sfPropelPager オブジェクトとそのメソッドについて詳しくは、Symfony ブックの Pages の章を参照してください。

    デフォルトパラメータを使用する

    使用する設定ファイルに定数を入れることをお勧めします。たとえば、ページごとの結果の数 (この例では 2) は、カスタム プログラム構成のパラメーターに置き換えることができます。上記の sfPropelPager 行を次のコードで変更します:

    コードをコピーします コードは次のとおりです:
    ...
    $pager = 新しい sfPropelPager('質問', sfConfig::get('app_pager_homepage_max'));

    ここでの pager キーワードは名前空間として使用されているため、パラメーター名に表示されます。カスタム設定とカスタムパラメータルールの命名について詳しくは、Symfony ブックの「設定」セクションを参照してください。

    listSuccess.php テンプレートを変更する

    listSuccess.php テンプレートに、次のコード行を追加します。

    コードをコピーします コードは次のとおりです:


    に置き換えました

    コードをコピー コードは次のとおりです:
    getResults() as $question): ?>

    このようにして、ページには、ページに保存されている結果のリストが表示されます。

    ページビューを追加

    このテンプレートで行う必要があることがもう 1 つあります。それはページビューです。ここで、テンプレートは最初の 2 つの質問を表示するだけですが、次のページへの機能と前のページに戻る機能を追加する必要があります。これらの機能の追加を完了するには、テンプレートの後に次のコードを追加する必要があります:

    コードをコピーします コードは次のとおりです:

    haveToPaginate()): ?>

    getPreviousPage()) ?>

    getLinks() as $page): ?>
    getPage(), $page, 'question/list?page='.$page) ?>
    getCurrentMaxLink()) '-' : '' ?>


    ', 'question/list?page='.$question_pager->getNextPage()) ?>
    getLastPage()) ?>

    このコードは、sfPropelPager オブジェクトのさまざまなメソッドと ->haveToPaginate() を使用します。この関数は、要求された結果の数がページ サイズを超えた場合にのみ true を返します。 ()、->getLastPage() はすべて明示的な意味を持っています。->getLinks() 関数はページ番号の配列を提供し、->getCurrentMaxLink() 関数は最後のページ番号を返します。

    この例では、Symfony リンク ヘルパーも示しています。 link_to_unless() は、最初の引数としてのテストが false の場合は通常の link_to() を出力します。そうでない場合は、非リンク テキストを出力し、単純な < ;span>パッケージ化を使用します。

    このページはテストしましたか?テストする必要があります。この修正は自分の目で確認するまでは完了しません。テストするには、3 日目に作成したテスト データ ファイルを開き、表示されるページ ビューにいくつかの質問を追加します。インポート データ バッチ ファイルを再実行し、ホームページを再度リクエストします。

    サブページのルーティングルールを追加する

    デフォルトでは、ページのルールは次のとおりです:

    http://askeet/frontend_dev.php/question/list/page/XX

    ここで、ルーティング ルールを使用して、これらのページを使用して理解を容易にします:

    http://askeet/frontend_dev.php/index/XX

    apps/frontend/config/routing.yml ファイルを開き、次の内容を先頭に追加します:

    コードをコピーします コードは次のとおりです:
    人気の質問:
    URL: /index/:page
    param: { モジュール: 質問、アクション: リスト }

    さらに、ログイン ページにルーティング ルールを追加します:

    コードをコピーします コードは次のとおりです:
    ログイン:
    URL: /ログイン
    パラメータ: { モジュール: ユーザー、アクション: ログイン }

    リファクタリング

    モデル

    質問/リスト アクションはモデルに関連するコードを実行します。そのため、このコードをモジュールに移動する必要があります。次のコードを使用して、質問/リスト アクションを置き換えます:

    コードをコピーします コードは次のとおりです:
    public functionexecuteList()
    {
    $this->question_pager = QuestionPeer::getHomepagePager($this->getRequestParameter('page', 1)); }
    そして、次のメソッドを lib/model の QuestionPeer.php クラスに追加します。


    コードをコピーします コードは次のとおりです:
    public static function getHomepagePager($page)
    {
    $pager = 新しい sfPropelPager('質問', sfConfig::get('app_pager_homepage_max'));
    $c = 新しい基準();
    $c->addDescendingOrderByColumn(self::INTERESTED_USERS);
    $pager->setCriteria($c);
    $pager->setPage($page);
    $pager->setPeerMethod('doSelectJoinUser');
    $pager->init();

    $pager を返します;
    }
    同じ考え方が、昨日書いた質問/表示アクションにも当てはまります。削除されたタイトルによって質問を取得するための Propel オブジェクトの使用は、このモジュールに属する必要があります。したがって、次のコードを使用して質問/表示アクション コードを変更します。


    コードをコピーします コードは次のとおりです:
    public functionexecuteShow()
    {
    $this->question = QuestionPeer::getQuestionFromTitle($this->getRequestParameter('stripped_title'));

    $this->forward404Unless($this->質問);
    }
    次のコードをQuestionPeer.phpファイルに追加します:


    コードをコピーします コードは次のとおりです:
    public static function getQuestionFromTitle($title)
    {
    $c = 新しい基準();
    $c->add(QuestionPeer::STRIPPED_TITLE, $title);

    self::doSelectOne($c) を返します
    }
    テンプレート

    question/templates/listSuccess.phpに示されている質問リストは、将来いくつかの場所で使用される予定です。そこで、問題リストを表示するテンプレート コードを _list.php フラグメントに配置し、listSuccess.php の内容を次の単純なコードに置き換えます。


    コードをコピーします コードは次のとおりです:

    人気の質問

    $question_pager)) ?>

    この記事で説明した内容が皆さんの symfony フレームワーク プログラミングに役立つことを願っています。

    http://www.bkjia.com/PHPjc/947922.html

    本当http://www.bkjia.com/PHPjc/947922.html技術記事 symfony のフォームとページの実装スキル、symfony フォームのスキル この記事では、symfony のフォームとページの実装スキルを例とともに説明します。参考のためにみんなで共有してください。詳細は次のとおりです: symfony の開発は非常に簡単です...
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

    AIヘンタイを無料で生成します。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    SublimeText3 中国語版

    SublimeText3 中国語版

    中国語版、とても使いやすい

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

    神レベルのコード編集ソフト(SublimeText3)

    Wordでページをコピーする方法 Wordでページをコピーする方法 Feb 20, 2024 am 10:09 AM

    Microsoft Word でページをコピーし、書式設定をそのまま維持したいですか? Word でページを複製すると、特定の文書レイアウトまたは形式のコピーを複数作成する場合に時間の節約に役立つため、これは賢明なアイデアです。このガイドでは、テンプレートを作成する場合でも、文書内の特定のページをコピーする場合でも、Word でページをコピーする手順を段階的に説明します。これらの簡単な手順は、最初から始めなくてもページを簡単に再作成できるように設計されています。 Microsoft Word でページをコピーする必要があるのですか? Word でページをコピーすることが非常に有益である理由はいくつかあります。 特定のレイアウトまたは形式の文書をコピーしたい場合。ページ全体を最初から再作成するのとは異なります

    Web ページをすばやく更新するにはどうすればよいですか? Web ページをすばやく更新するにはどうすればよいですか? Feb 18, 2024 pm 01:14 PM

    ネットワークを日常的に使用する中でページの更新は頻繁に行われますが、Web ページにアクセスすると、Web ページが読み込まれない、表示が異常になるなどの問題が発生することがあります。現時点では、通常、問題を解決するためにページを更新することを選択しますが、ページを素早く更新するにはどうすればよいでしょうか?ページ更新のショートカット キーについて説明します。ページ更新ショートカットキーは、キーボード操作で現在のWebページを素早く更新する方法です。オペレーティング システムやブラウザが異なると、ページを更新するためのショートカット キーが異なる場合があります。以下では一般的な W を使用します。

    iPhone のスタンバイ モードをカスタマイズおよび編集する方法: iOS 17 の新機能 iPhone のスタンバイ モードをカスタマイズおよび編集する方法: iOS 17 の新機能 Sep 21, 2023 pm 04:01 PM

    スタンバイは iOS 17 アップデートの新機能で、携帯電話がアイドル状態のときにすぐに情報にアクセスするための新しく強化された方法を提供します。 StandBy を使用すると、時間を確認したり、今後のイベントを表示したり、カレンダーを参照したり、現在地の天気予報の最新情報を入手したりすることができます。起動すると、充電中に横向きに設定すると、iPhone が直感的にスタンバイ モードに入ります。この機能は、ベッドサイドテーブルなどのワイヤレス充電ポイント、または日常業務中に iPhone の充電から離れているときに最適です。スタンバイ中に表示されるさまざまなウィジェットをスワイプすることで、さまざまなアプリのさまざまな情報にアクセスできます。ただし、好みや頻繁に必要な情報に基づいて、これらのウィジェットを変更したり、一部を削除したりすることもできます。それでは、詳しく見ていきましょう

    3 秒でページジャンプを実装する方法: PHP プログラミングガイド 3 秒でページジャンプを実装する方法: PHP プログラミングガイド Mar 25, 2024 am 10:42 AM

    タイトル: 3秒でできるページジャンプの実装方法: PHPプログラミングガイド Web開発においてページジャンプは一般的な操作ですが、通常はHTMLやJavaScriptのメソッド内のメタタグを使ってページにジャンプします。ただし、特定のケースでは、サーバー側でページ ジャンプを実行する必要があります。この記事では、PHPプログラミングを使用して、3秒以内に指定したページに自動でジャンプする機能を実装する方法と、具体的なコード例を紹介します。 PHP を使用したページジャンプの基本原理 PHP は一種の

    LaravelページでCSSが正しく表示されない場合の対処方法 LaravelページでCSSが正しく表示されない場合の対処方法 Mar 10, 2024 am 11:33 AM

    「CSS を正しく表示できない Laravel ページを処理する方法、特定のコード例が必要」 Laravel フレームワークを使用して Web アプリケーションを開発する場合、ページで CSS スタイルを正しく表示できず、ページのレンダリングが異常になるという問題が発生することがあります。スタイル。ユーザー エクスペリエンスに影響します。この記事では、Laravel ページで CSS が正しく表示されない場合に対処するいくつかの方法を紹介し、開発者がこの一般的な問題を解決するのに役立つ具体的なコード例を示します。 1. ファイルパスを確認する まずCSSファイルのパスを確認します。

    iPhoneのホーム画面ページを並べ替え、無効化、削除する方法 iPhoneのホーム画面ページを並べ替え、無効化、削除する方法 Nov 29, 2023 am 08:22 AM

    iOS では、Apple は iPhone の個々のホーム画面ページを無効にすることを許可しています。ホーム画面のページを無効にするだけでなく、ホーム画面のページの順序を並べ替えたり、ページを直接削除したりすることもできます。仕組みは次のとおりです。ホーム画面のページを並べ替える方法 ホーム画面でスペースをタッチしたままにして、ジッター モードに入ります。ホーム画面ページを表す点の列をタップします。表示されるホーム画面のグリッドで、ページをタッチしてドラッグし、他のページとの相対的な位置を再配置します。ドラッグに応じて他のものも動きます。新しい配置に満足したら、画面の右上隅にある「完了」をタップし、もう一度「完了」をタップしてディザモードを終了します。ホーム画面ページを無効化または削除する方法 ホーム画面でスペースを押したままにして、ディザ モードに入ります。タップしてホーム画面を表示します

    PHP で Symfony フレームワークを使用する方法 PHP で Symfony フレームワークを使用する方法 Jun 27, 2023 am 11:16 AM

    Symfony は、PHP 言語をベースとした高性能で再利用可能な Web アプリケーション フレームワークです。高品質の Web アプリケーションとサービスを構築するために使用され、開発プロセスを簡素化するための複数の機能とツールが提供されます。 Symfony の目標は、Web 開発をより使いやすく、再利用可能で、効率的にすることであり、ソフトウェア エンジニアリングのベスト プラクティスに準拠したオープンソース フレームワークです。 PHP 開発者にとって、Symfony フレームワークは、豊富で強力な柔軟性を提供するため、非常に良い選択です。

    PHP フレームワーク Symfony を使用して効率的な CRM システムを開発する PHP フレームワーク Symfony を使用して効率的な CRM システムを開発する Jun 27, 2023 pm 04:17 PM

    情報技術の急速な発展に伴い、企業管理システムの普及が進んでいます。その中でも、顧客関係管理システム (CRM) は非常に人気のある企業管理システムです。今日企業が直面している最大の課題の 1 つは、顧客関係を効果的に管理する方法です。効率的な CRM システムの開発は、企業の発展の中核的なタスクとなっています。この記事では、PHP フレームワーク Symfony をその豊富な機能とドキュメントと組み合わせて使用​​して、効率的な CRM システムを開発する方法を紹介します。 1. Symfony フレームワークを理解する Symfony は

    See all articles