<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>掲示板  |  takeHo（たけほ）のへなちょこ台帳</title>
	<atom:link href="https://blog.takeho.com/tag/%E6%8E%B2%E7%A4%BA%E6%9D%BF/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.takeho.com</link>
	<description>いわゆる自由帳ってところです。</description>
	<lastBuildDate>Tue, 25 Feb 2025 04:09:27 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6</generator>

<image>
	<url>https://blog.takeho.com/wp-content/uploads/2024/08/icon-150x150.png</url>
	<title>掲示板  |  takeHo（たけほ）のへなちょこ台帳</title>
	<link>https://blog.takeho.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>PHP5に慣れ親しんだエンジニアが掲示板をSymfony４で作成してみる</title>
		<link>https://blog.takeho.com/an-engineer-familiar-with-php5-creates-a-bulletin-board-using-symfony-4/</link>
					<comments>https://blog.takeho.com/an-engineer-familiar-with-php5-creates-a-bulletin-board-using-symfony-4/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Sun, 23 Feb 2025 01:05:00 +0000</pubDate>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Composer]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[掲示板]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=666</guid>

					<description><![CDATA[Symfony4はPHP5時代と比べるとモダンな機能やベストプラクティスが多数導入されています。ここでは、ユーザ認証（ログイン・登録）、管理者権限、アクセス制限、データベースの活用といった要素を取り入れた掲示板（BBS） [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Symfony4はPHP5時代と比べるとモダンな機能やベストプラクティスが多数導入されています。ここでは、ユーザ認証（ログイン・登録）、管理者権限、アクセス制限、データベースの活用といった要素を取り入れた掲示板（BBS）を段階的に実装してSymony4を習得していきます。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2"><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">１．必要な環境の準備</a><ol><ol><ol><li><a href="#toc2" tabindex="0">Linuxサーバの前提</a></li><li><a href="#toc3" tabindex="0">ドメイン設定</a></li></ol></li></ol></li></ol></li><li><a href="#toc4" tabindex="0">２．Apacheによるドメイン設定</a></li><li><a href="#toc5" tabindex="0">３．Symfony4プロジェクトの作成と配置</a><ol><li><a href="#toc6" tabindex="0">１．プロジェクトディレクトリの作成</a></li><li><a href="#toc7" tabindex="0">２．Symfony4プロジェクトのインストール</a></li></ol></li><li><a href="#toc8" tabindex="0">４．データベース設定とエンティティ作成</a><ol><li><a href="#toc9" tabindex="0">4.1. データベース接続情報の設定</a></li><li><a href="#toc10" tabindex="0">4.2. ユーザエンティティの作成</a></li><li><a href="#toc11" tabindex="0">4.3. 掲示板投稿（Post）エンティティの作成</a></li><li><a href="#toc12" tabindex="0">4.4. マイグレーションの実行</a></li></ol></li><li><a href="#toc13" tabindex="0">５．ユーザ認証と管理者機能の実装</a><ol><li><a href="#toc14" tabindex="0">5.1. ログイン・登録フォームの作成</a></li><li><a href="#toc15" tabindex="0">5.2. security.yaml の設定</a></li><li><a href="#toc16" tabindex="0">5.3. 管理者権限の付与</a></li></ol></li><li><a href="#toc17" tabindex="0">６．掲示板機能（BBS）の実装</a><ol><li><a href="#toc18" tabindex="0">6.1. コントローラー作成</a></li><li><a href="#toc19" tabindex="0">6.2. Twigテンプレート作成</a></li></ol></li><li><a href="#toc20" tabindex="0">７．アクセス制限とセキュリティ対策</a><ol><ol><ol><li><a href="#toc21" tabindex="0">アクセス制限</a></li><li><a href="#toc22" tabindex="0">セキュリティ対策</a></li></ol></li></ol></li></ol></li><li><a href="#toc23" tabindex="0">８．パーミッション設定と本番環境向け最適化</a><ol><li><a href="#toc24" tabindex="0">8.1. ディレクトリのパーミッション設定</a><ol><li><a href="#toc25" tabindex="0">8.2. 本番環境向け設定の調整</a></li></ol></li></ol></li><li><a href="#toc26" tabindex="0">９．テストと動作確認</a><ol><li><a href="#toc27" tabindex="0">ローカルでの動作確認</a></li><li><a href="#toc28" tabindex="0">本番サーバでの確認</a></li><li><a href="#toc29" tabindex="0">トラブルシューティング</a></li></ol></li><li><a href="#toc30" tabindex="0">１０．まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">１．必要な環境の準備</span></h2>



<h5 class="wp-block-heading"><span id="toc2">Linuxサーバの前提</span></h5>



<ul class="wp-block-list">
<li><strong>OS</strong><br>Ubuntu、CentOS、Debianなど</li>



<li><strong>PHP</strong><br>Symfony4はPHP 7.1以上が必要です<br>※ <code>php -v</code> コマンドでバージョンを確認してください</li>



<li><strong>Composer</strong><br>PHPパッケージ管理ツール</li>



<li>Webサーバ<br>ApacheまたはNginx（ここではApacheの例を示します</li>



<li></li>
</ul>



<h5 class="wp-block-heading"><span id="toc3">ドメイン設定</span></h5>



<ul class="wp-block-list">
<li>DNSで「www.example.com」が対象サーバのIPを指していることを確認してください<br></li>
</ul>



<h2 class="wp-block-heading"><span id="toc4">２．Apacheによるドメイン設定</span></h2>



<p>ApacheでのVirtualHost設定例（/etc/apache2/sites-available/example.com.conf）</p>



<pre class="wp-block-code"><code>&lt;VirtualHost *:80>
    ServerName www.example.com
    DocumentRoot /var/www/example.com/public

    &lt;Directory /var/www/example.com/public>
        AllowOverride All
        Require all granted
    &lt;/Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
&lt;/VirtualHost></code></pre>



<p>設定後、以下のコマンドで有効化と再起動を行います</p>



<pre class="wp-block-code"><code>sudo a2ensite example.com
sudo a2enmod rewrite
sudo systemctl reload apache2</code></pre>



<h2 class="wp-block-heading"><span id="toc5">３．Symfony4プロジェクトの作成と配置</span></h2>



<h3 class="wp-block-heading"><span id="toc6">１．プロジェクトディレクトリの作成</span></h3>



<p>Webサーバのドキュメントルート（例：<code>/var/www/example.com</code>）に移動し、ディレクトリを作成</p>



<pre class="wp-block-code"><code>sudo mkdir -p /var/www/example.com
cd /var/www/example.com
sudo chown $(whoami):$(whoami) .</code></pre>



<h3 class="wp-block-heading"><span id="toc7">２．Symfony4プロジェクトのインストール</span></h3>



<p>Composerを使ってSymfony4プロジェクトを作成します。今回はDoctrineやセキュリティ機能が含まれるスターターキットを利用</p>



<pre class="wp-block-code"><code>composer create-project symfony/website-skeleton board_project</code></pre>



<p>※ プロジェクトディレクトリ（例：<code>board_project</code>）内に<code>public</code>フォルダが作成されます。<br>※ ApacheのDocumentRootは、この<code>public</code>フォルダを指定してください（もしくはVirtualHost設定でパスを調整）。</p>



<h2 class="wp-block-heading"><span id="toc8">４．データベース設定とエンティティ作成</span></h2>



<p>掲示板の情報（ユーザ情報、投稿内容など）をデータベースに保存します。ここではMySQLを例にしています。</p>



<h3 class="wp-block-heading"><span id="toc9">4.1. データベース接続情報の設定</span></h3>



<p>プロジェクトルートの <code>.env</code> ファイルを編集し、<code>DATABASE_URL</code> を設定してください。</p>



<pre class="wp-block-code"><code>DATABASE_URL=mysql://db_user:db_password@127.0.0.1:3306/db_name</code></pre>



<h3 class="wp-block-heading"><span id="toc10">4.2. ユーザエンティティの作成</span></h3>



<p>Symfony MakerBundleを利用してユーザエンティティを作成します。<br></p>



<pre class="wp-block-code"><code>php bin/console make:user</code></pre>



<p>プロンプトに従い、エンティティ名（例：<code>User</code>）や識別子（メールアドレスまたはユーザ名）、パスワードフィールド、既定のロール（通常ユーザには <code>ROLE_USER</code>、管理者には <code>ROLE_ADMIN</code>）を設定します。</p>



<h3 class="wp-block-heading"><span id="toc11">4.3. 掲示板投稿（Post）エンティティの作成</span></h3>



<p>投稿情報を保存するためのエンティティを作成します。</p>



<pre class="wp-block-code"><code>php bin/console make:entity Post</code></pre>



<p>以下のフィールドを追加すると良いでしょう：</p>



<ul class="wp-block-list">
<li><code>title</code> : string</li>



<li><code>content</code> : text</li>



<li><code>createdAt</code> : datetime</li>



<li><code>user</code> : ManyToOne（Userエンティティとの関連付け、投稿者情報）</li>
</ul>



<h3 class="wp-block-heading"><span id="toc12">4.4. マイグレーションの実行</span></h3>



<p>エンティティ作成後、マイグレーションを作成してデータベースに反映させます</p>



<pre class="wp-block-code"><code>php bin/console make:migration
php bin/console doctrine:migrations:migrate</code></pre>



<h2 class="wp-block-heading"><span id="toc13">５．ユーザ認証と管理者機能の実装</span></h2>



<p>Symfonyのセキュリティコンポーネントを利用して、ログイン・登録機能、アクセス制限を実装します。</p>



<h3 class="wp-block-heading"><span id="toc14">5.1. ログイン・登録フォームの作成</span></h3>



<p>Symfony MakerBundleを使用して、ログインフォーム認証を生成します</p>



<pre class="wp-block-code"><code>php bin/console make:auth</code></pre>



<p>また、ユーザ登録フォームも作成する場合は</p>



<pre class="wp-block-code"><code>php bin/console make:registration-form</code></pre>



<p>生成されたコントローラーやフォームクラスを適宜編集し、パスワードエンコーディングやCSRF保護の設定を確認してください。</p>



<h3 class="wp-block-heading"><span id="toc15">5.2. security.yaml の設定</span></h3>



<p>プロジェクトの <code>config/packages/security.yaml</code> を以下のように設定します。必要に応じてプロバイダやファイアウォールの設定を調整してください。</p>



<pre class="wp-block-code"><code>security:
    encoders:
        App\Entity\User:
            algorithm: bcrypt

    providers:
        app_user_provider:
            entity:
                class: App\Entity\User
                property: email

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            anonymous: true
            lazy: true
            provider: app_user_provider
            form_login:
                login_path: login
                check_path: login
                default_target_path: /
            logout:
                path: logout

    access_control:
        # 管理者エリアへのアクセスはROLE_ADMINに制限
        - { path: ^/admin, roles: ROLE_ADMIN }
        # 投稿作成・編集はログインユーザに制限
        - { path: ^/post/new, roles: ROLE_USER }
        - { path: ^/post/edit, roles: ROLE_USER }</code></pre>



<h3 class="wp-block-heading"><span id="toc16">5.3. 管理者権限の付与</span></h3>



<p>ユーザ登録時や管理画面で、管理者ユーザには <code>ROLE_ADMIN</code> を割り当てます。管理エリア用のコントローラー（例：<code>AdminDashboardController</code>）はルートを <code>/admin</code> で始め、上記の access_control により管理者以外はアクセスできないようにします。</p>



<h2 class="wp-block-heading"><span id="toc17">６．掲示板機能（BBS）の実装</span></h2>



<p>掲示板の基本機能として、投稿の一覧表示、投稿詳細、投稿作成、編集、削除などの機能を実装します。</p>



<h3 class="wp-block-heading"><span id="toc18">6.1. コントローラー作成</span></h3>



<p>例として、<code>BoardController</code> を作成し、以下のようなアクションを実装します。</p>



<pre class="wp-block-code"><code>&lt;?php
// src/Controller/BoardController.php
namespace App\Controller;

use App\Entity\Post;
use App\Repository\PostRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class BoardController extends AbstractController
{
    /**
     * @Route("/", name="board_index")
     */
    public function index(PostRepository $postRepository): Response
    {
        $posts = $postRepository->findBy(&#91;], &#91;'createdAt' => 'DESC']);
        return $this->render('board/index.html.twig', &#91;
            'posts' => $posts,
        ]);
    }

    /**
     * @Route("/post/{id}", name="board_view", requirements={"id"="\d+"})
     */
    public function view(Post $post): Response
    {
        return $this->render('board/view.html.twig', &#91;
            'post' => $post,
        ]);
    }

    /**
     * @Route("/post/new", name="board_new")
     */
    public function new(Request $request): Response
    {
        // ログインユーザのみ投稿可能
        $this->denyAccessUnlessGranted('ROLE_USER');

        $post = new Post();
        // フォーム作成、リクエストのハンドリング（例：Symfony Formコンポーネントを利用）
        // ※ ここでは簡易例として、フォーム処理の詳細は省略

        // 保存処理
        // $entityManager = $this->getDoctrine()->getManager();
        // $post->setCreatedAt(new \DateTime());
        // $post->setUser($this->getUser());
        // $entityManager->persist($post);
        // $entityManager->flush();

        return $this->render('board/new.html.twig', &#91;
            'post' => $post,
            // 'form' => $form->createView(),
        ]);
    }

    // 編集・削除アクションも必要に応じて実装
}</code></pre>



<h3 class="wp-block-heading"><span id="toc19">6.2. Twigテンプレート作成</span></h3>



<p><code>templates/board/</code> 配下に各ビュー用テンプレートを作成します。</p>



<p>例：<code>index.html.twig</code>（投稿一覧表示）</p>



<pre class="wp-block-code"><code>{% extends 'base.html.twig' %}

{% block title %}掲示板{% endblock %}

{% block body %}
    &lt;h1>掲示板投稿一覧&lt;/h1>
    {% for post in posts %}
        &lt;div class="post">
            &lt;h2>&lt;a href="{{ path('board_view', {id: post.id}) }}">{{ post.title }}&lt;/a>&lt;/h2>
            &lt;p>{{ post.content|raw }}&lt;/p>
            &lt;small>投稿者: {{ post.user.email }} ・ 投稿日: {{ post.createdAt|date('Y-m-d H:i') }}&lt;/small>
        &lt;/div>
        &lt;hr>
    {% else %}
        &lt;p>まだ投稿がありません。&lt;/p>
    {% endfor %}
    {% if is_granted('ROLE_USER') %}
        &lt;a href="{{ path('board_new') }}">新規投稿&lt;/a>
    {% else %}
        &lt;p>&lt;a href="{{ path('login') }}">ログイン&lt;/a>して投稿しましょう。&lt;/p>
    {% endif %}
{% endblock %}</code></pre>



<p>※ 各テンプレートは必要に応じてデザインやレイアウトを調整してください。</p>



<h2 class="wp-block-heading"><span id="toc20">７．アクセス制限とセキュリティ対策</span></h2>



<h5 class="wp-block-heading"><span id="toc21">アクセス制限</span></h5>



<ul class="wp-block-list">
<li><code>/admin</code> 以下のルートは <code>ROLE_ADMIN</code> のみアクセス可能とし、<code>security.yaml</code> の <code>access_control</code> で管理</li>



<li>投稿作成編集はログインユーザ（<code>ROLE_USER</code>）に限定するため、コントローラー内で <code>denyAccessUnlessGranted()</code> を利用</li>
</ul>



<h5 class="wp-block-heading"><span id="toc22">セキュリティ対策</span></h5>



<ul class="wp-block-list">
<li>フォームにCSRF保護を設定</li>



<li>ユーザ入力のバリデーションとサニタイズを実施</li>



<li>パスワードはエンコーダー（例：bcrypt）で暗号化</li>
</ul>



<h2 class="wp-block-heading"><span id="toc23">８．パーミッション設定と本番環境向け最適化</span></h2>



<h3 class="wp-block-heading"><span id="toc24">8.1. ディレクトリのパーミッション設定</span></h3>



<p>Symfonyはキャッシュやログを書き込むため、Apache（例：ユーザ www-data）が書き込めるようACLを設定します。</p>



<pre class="wp-block-code"><code>sudo setfacl -R -m u:www-data:rwX -m u:$(whoami):rwX var
sudo setfacl -dR -m u:www-data:rwX -m u:$(whoami):rwX var</code></pre>



<h4 class="wp-block-heading"><span id="toc25">8.2. 本番環境向け設定の調整</span></h4>



<p><code>.env</code> で環境変数を設定（例：<code>APP_ENV=prod</code>, <code>APP_DEBUG=0</code>）</p>



<p>キャッシュのウォームアップ</p>



<pre class="wp-block-code"><code>php bin/console cache:warmup --env=prod</code></pre>



<h2 class="wp-block-heading"><span id="toc26">９．テストと動作確認</span></h2>



<h3 class="wp-block-heading"><span id="toc27">ローカルでの動作確認</span></h3>



<p>ビルトインサーバを使ってローカルテスト</p>



<pre class="wp-block-code"><code>php bin/console server:run</code></pre>



<p>ブラウザで <code>http://127.0.0.1:8000</code> にアクセスし、投稿一覧やログイン・登録、投稿作成など各機能を確認してください。</p>



<h3 class="wp-block-heading"><span id="toc28">本番サーバでの確認</span></h3>



<p>DNS設定が完了していることを確認した上で、<code>http://www.example.com</code> へアクセスし、各機能が正しく動作するかテストします。</p>



<h3 class="wp-block-heading"><span id="toc29">トラブルシューティング</span></h3>



<p>エラーが発生した場合は、<code>var/log/</code> 内のログファイル（例：<code>prod.log</code> や <code>dev.log</code>）を確認し、エラーメッセージに基づいて対処してください。</p>



<h2 class="wp-block-heading"><span id="toc30">１０．まとめ</span></h2>



<p>今回のマニュアルでは、Symfony4を用いた掲示板アプリケーションの作成手順を、以下の要素を中心に解説しました</p>



<ul class="wp-block-list">
<li><strong>ユーザ認証・登録</strong><br>ログインフォームの生成とユーザエンティティ作成</li>



<li><strong>管理者権限</strong><br><code>ROLE_ADMIN</code> による管理エリアの制限</li>



<li><strong>アクセス制限</strong><br>各アクションへのアクセスをセキュリティコンポーネントで制御</li>



<li><strong>データベース連携</strong><br>Doctrineを利用したユーザ・投稿エンティティの管理</li>



<li><strong>掲示板機能</strong><br>投稿の一覧表示、詳細表示、投稿作成・編集機能の実装</li>
</ul>



<p>PHP5時代と比べ、Symfony4は構造化された設計や豊富なコンポーネントにより、拡張性・保守性に優れたアプリケーション開発が可能です。まずは本マニュアルの手順に沿って基本機能を実装し、そこからさらにカスタマイズや機能追加に挑戦してみてください。</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/an-engineer-familiar-with-php5-creates-a-bulletin-board-using-symfony-4/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
