<?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>Composer  |  takeHo（たけほ）のへなちょこ台帳</title>
	<atom:link href="https://blog.takeho.com/tag/composer/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.takeho.com</link>
	<description>いわゆる自由帳ってところです。</description>
	<lastBuildDate>Tue, 09 Dec 2025 01:24:12 +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>Composer  |  takeHo（たけほ）のへなちょこ台帳</title>
	<link>https://blog.takeho.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>DockerでYii2開発環境を最短構築！初心者でもできるMySQL・phpMyAdmin・Mailpit連携ガイド</title>
		<link>https://blog.takeho.com/build-your-yii2-development-environment-with-docker-in-no-time-a-beginners-guide-to-integrating-mysql-phpmyadmin-and-mailpit/</link>
					<comments>https://blog.takeho.com/build-your-yii2-development-environment-with-docker-in-no-time-a-beginners-guide-to-integrating-mysql-phpmyadmin-and-mailpit/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Fri, 12 Sep 2025 11:24:00 +0000</pubDate>
				<category><![CDATA[Yii2]]></category>
		<category><![CDATA[ウェブ・開発]]></category>
		<category><![CDATA[Composer]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Mailpit]]></category>
		<category><![CDATA[MySQL]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=1275</guid>

					<description><![CDATA[本記事では、Windows環境で Yii2（Basicテンプレート） を用いたPHPアプリ開発用に、MySQL、phpMyAdmin、そしてテスト用SMTPサーバ Mailpit（メール受信UI付き）を Docker で [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>本記事では、Windows環境で <strong>Yii2（Basicテンプレート）</strong> を用いたPHPアプリ開発用に、<strong>MySQL</strong>、<strong>phpMyAdmin</strong>、そしてテスト用SMTPサーバ <strong>Mailpit</strong>（メール受信UI付き）を <strong>Docker</strong> で一気に構築する手順を解説します。プロジェクトのルートは次のパスに固定します。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>ルート</td><td><code>C:\Work\Workspace\Docker\example.com</code></td></tr><tr><td>フレームワーク本体</td><td><code>C:\Work\Workspace\Docker\example.com\htdocs</code></td></tr><tr><td>ドキュメントルート</td><td> <code>C:\Work\Workspace\Docker\example.com\htdocs\web</code></td></tr><tr><td>Webアクセス</td><td><a href="http://localhost:8080"> http://localhost:8080</a></td></tr><tr><td>phpMyAdmin</td><td><a href="http://localhost:8081">http://localhost:8081</a></td></tr></tbody></table></figure>



<p>この記事は <strong>「そのままコピペで動く」</strong> を重視しています。</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></li><li><a href="#toc2" tabindex="0">docker-compose.yml の作成</a></li><li><a href="#toc3" tabindex="0">PHP（php-fpm）用 Dockerfile と設定</a></li><li><a href="#toc4" tabindex="0">Nginx の設定</a></li><li><a href="#toc5" tabindex="0">php.ini の最低限の調整</a></li><li><a href="#toc6" tabindex="0">コンテナの起動と初期化</a></li><li><a href="#toc7" tabindex="0">Yii2 のインストール（コンテナ内でComposer実行）</a></li><li><a href="#toc8" tabindex="0">DB接続設定（.env と Yii2設定）</a></li><li><a href="#toc9" tabindex="0">Mailpit（メール送信テスト）設定</a></li><li><a href="#toc10" tabindex="0">動作確認（Web・DB・Mail）</a></li><li><a href="#toc11" tabindex="0">トラブルシューティング</a><ol><ol><li><a href="#toc12" tabindex="0">ポート競合</a></li><li><a href="#toc13" tabindex="0">MySQLへ接続できない</a></li><li><a href="#toc14" tabindex="0">Windows で権限由来の書き込みエラー</a></li><li><a href="#toc15" tabindex="0">ファイルの改行コード</a></li><li><a href="#toc16" tabindex="0">古いコンテナやイメージの削除でエラー</a></li><li><a href="#toc17" tabindex="0">Composerが遅い/タイムアウト</a></li></ol></li></ol></li><li><a href="#toc18" tabindex="0">よく使うコマンド集</a></li><li><a href="#toc19" tabindex="0">あとがき</a><ol><ol><ol><li><a href="#toc20" tabindex="0">引用元</a></li></ol></li></ol></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">事前準備とディレクトリ構成</span></h2>



<p>以下のフォルダを作成します。</p>



<pre class="wp-block-code"><code>C:\Work\Workspace\Docker\example.com\
├─ htdocs\ ← Yii2のアプリ本体が入る（後で自動生成）
├─ docker\
│ ├─ php\
│ │ ├─ Dockerfile
│ │ └─ php.ini
│ └─ nginx\
│ └─ default.conf
└─ docker-compose.yml</code></pre>



<h2 class="wp-block-heading"><span id="toc2">docker-compose.yml の作成</span></h2>



<p><strong>ファイル:</strong> <code>C:\Work\Workspace\Docker\example.com\docker-compose.yml</code></p>



<pre class="wp-block-code"><code>services:
  nginx:
    image: nginx:1.27-alpine
    container_name: example_nginx
    ports:
      - "8080:80" # Web → http://localhost:8080
    volumes:
      - ./htdocs:/var/www/html
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on:
      - php
    networks:
      - appnet

  php:
    build:
      context: ./docker/php
      dockerfile: Dockerfile
    container_name: example_php
    volumes:
      - ./htdocs:/var/www/html
    environment:
      PHP_MEMORY_LIMIT: 512M
      PHP_MAX_EXECUTION_TIME: 120
    networks:
      - appnet
  db:
    image: mysql:8.0
    container_name: example_db
    command: &#91;"mysqld", "--default-authentication-plugin=mysql_native_password", "--character-set-server=utf8mb4", "--collation-server=utf8mb4_0900_ai_ci"]
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: example
      MYSQL_USER: app
      MYSQL_PASSWORD: apppass
      TZ: Asia/Tokyo
    ports:
      - "3307:3306" # ローカルMySQLと衝突回避したい場合は3307→3306
    volumes:
      - dbdata:/var/lib/mysql
    networks:
      - appnet

  phpmyadmin:
    image: phpmyadmin:5-apache
    container_name: example_pma
    environment:
      PMA_HOST: db
      PMA_USER: root
      PMA_PASSWORD: root
    ports:
      - "8081:80" # phpMyAdmin → http://localhost:8081
    depends_on:
      - db
    networks:
      - appnet

  mailpit:
    image: axllent/mailpit:latest
    container_name: example_mailpit
    ports:
      - "1025:1025" # SMTP (アプリからの送信先)
      - "8025:8025" # Web UI → http://localhost:8025
    networks:
      - appnet

volumes:
  dbdata:

networks:
  appnet:
    driver: bridge</code></pre>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box not-nested-style cocoon-block-tab-caption-box"><div class="tab-caption-box-label block-box-label box-label"><span class="tab-caption-box-label-text block-box-label-text box-label-text">補足</span></div><div class="tab-caption-box-content block-box-content box-content">
<p>既存でMySQLがWindowsに入っている場合、<code>ports</code> を <code>"3307:3306"</code> のように <strong>ホスト側を3307</strong> にすると衝突しません。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc3">PHP（php-fpm）用 Dockerfile と設定</span></h2>



<p><strong>ファイル:</strong> <code>C:\Work\Workspace\Docker\example.com\docker\php\Dockerfile</code></p>



<pre class="wp-block-code"><code>FROM php:8.3-fpm-alpine

# 必要拡張の導入
RUN apk add --no-cache \
    git zip unzip icu-dev oniguruma-dev libpng-dev libjpeg-turbo-dev libwebp-dev libzip-dev autoconf build-base \
 &amp;&amp; docker-php-ext-configure gd --with-jpeg --with-webp \
 &amp;&amp; docker-php-ext-install -j$(nproc) pdo_mysql intl mbstring gd zip exif bcmath opcache

# Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

WORKDIR /var/www/html</code></pre>



<h2 class="wp-block-heading"><span id="toc4">Nginx の設定</span></h2>



<p><strong>ファイル:</strong> <code>C:\Work\Workspace\Docker\example.com\docker\nginx\default.conf</code></p>



<pre class="wp-block-code"><code>server {
  listen 80;
  server_name example.com localhost;

  root /var/www/html/web;
  index index.php index.html;

  location / {
    try_files $uri $uri/ /index.php?$args;
  }

  location ~ \.php$ {
    include       fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass php:9000;
    fastcgi_buffers 16 16k;
    fastcgi_buffer_size 32k;
  }

  location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff2?|ttf)$ {
    expires 7d;
    add_header Cache-Control "public";
  }
}</code></pre>



<h2 class="wp-block-heading"><span id="toc5">php.ini の最低限の調整</span></h2>



<p><strong>ファイル:</strong> <code>C:\Work\Workspace\Docker\example.com\docker\php\php.ini</code></p>



<pre class="wp-block-code"><code>memory_limit = ${PHP_MEMORY_LIMIT}
max_execution_time = ${PHP_MAX_EXECUTION_TIME}
upload_max_filesize = 32M
post_max_size = 32M
date.timezone = Asia/Tokyo</code></pre>



<h2 class="wp-block-heading"><span id="toc6">コンテナの起動と初期化</span></h2>



<p><strong>PowerShell</strong> で次を実行します。</p>



<pre class="wp-block-code"><code>cd C:\Work\Workspace\Docker\example.com
# 初回ビルド＆起動
docker compose up -d --build

# 状態確認
docker compose ps</code></pre>



<ul class="wp-block-list">
<li><code>http://localhost:8080</code> → Nginx（Yii2はまだ未導入なので404/エラー想定）</li>



<li><code>http://localhost:8081</code> → phpMyAdmin（<code>root</code> / <code>root</code>、サーバ: <code>db</code> でログイン可）</li>



<li><code>http://localhost:8025</code> → Mailpit（受信ボックスUI）</li>
</ul>



<h2 class="wp-block-heading"><span id="toc7">Yii2 のインストール（コンテナ内でComposer実行）</span></h2>



<p><code>htdocs</code> に Yii2 Basic を展開します。</p>



<pre class="wp-block-code"><code># PHPコンテナに入る
docker compose exec php sh

# コンテナ内で実行（/var/www/html）
composer create-project yiisoft/yii2-app-basic .
exit</code></pre>



<p>作成後、Windows側では <code>C:\Work\Workspace\Docker\example.com\htdocs</code> にファイルが展開されます。Nginx の <code>root</code> は <code>/web</code> 配下なので、<code>web/index.php</code> が入口になります。</p>



<h2 class="wp-block-heading"><span id="toc8">DB接続設定（.env と Yii2設定）</span></h2>



<p>Yii2 Basic はデフォルトで <code>.env</code> はありませんが、設定を分けたい場合は導入も可能です。ここではシンプルに <code>config/db.php</code> を直接編集します。</p>



<p><strong>ファイル:</strong> <code>htdocs\config\db.php</code></p>



<pre class="wp-block-code"><code>&lt;?php
return &#91;
  'class' => 'yii\db\Connection',
  'dsn' => 'mysql:host=db;port=3306;dbname=example',
  'username' => 'app',
  'password' => 'apppass',
  'charset' => 'utf8mb4',
  'attributes' => &#91;
    PDO::ATTR_EMULATE_PREPARES => false,
    PDO::ATTR_STRINGIFY_FETCHES => false,
  ],
];</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><code>host</code> は <code><strong>db</strong></code>（docker-compose のサービス名）を指定します。ホストOSから直接接続する場合は <code>localhost:3307</code> です。</p>
</blockquote>



<p>初期テーブルを作る例として、マイグレーションを1本作ってみます（任意）。</p>



<pre class="wp-block-code"><code># PHPコンテナに入る
docker compose exec php sh

# マイグレーション作成
php yii migrate/create create_post_table

# 生成されたファイル(例: migrations/mYYYYMMDD_HHMMSS_create_post_table.php)を編集
exit</code></pre>



<p>サンプル（生成ファイルを編集）</p>



<pre class="wp-block-code"><code>public function safeUp()
{
  $this->createTable('{{%post}}', &#91;
    'id' => $this->primaryKey(),
    'title' => $this->string()->notNull(),
    'body' => $this->text(),
    'created_at' => $this->dateTime()->defaultExpression('CURRENT_TIMESTAMP'),
  ]);
}


public function safeDown()
{
  $this->dropTable('{{%post}}');
}</code></pre>



<pre class="wp-block-code"><code># もう一度入って実行
docker compose exec php sh
php yii migrate --interactive=0
exit</code></pre>



<h2 class="wp-block-heading"><span id="toc9">Mailpit（メール送信テスト）設定</span></h2>



<p>開発中のメールは <strong>本当に送らない</strong> のが安全です。Mailpit に流してUIで確認しましょう。</p>



<p><strong>ファイル:</strong> <code>htdocs\config\web.php</code>（<code>components</code> に <code>mailer</code> を追記）</p>



<pre class="wp-block-code"><code>'components' => &#91;
  // ... 既存設定 ...
  'mailer' => &#91;
    'class' => 'yii\swiftmailer\Mailer',
    'useFileTransport' => false, // falseでSMTPへ送信
    'transport' => &#91;
      'class' => 'Swift_SmtpTransport',
      'host' => 'mailpit',
      'port' => 1025,
      'encryption' => null,
    ],
  ],
],</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>もし Yii2 を <code>yiisoft/mailer</code> に置き換える場合は適宜設定を読み替えてください（SwiftMailerは非推奨化済みですが、Yii2 Basic既定の形のままでもMailpit連携は可能です）。</p>
</blockquote>



<p>テスト送信例（コントローラやコンソールから）</p>



<pre class="wp-block-code"><code>Yii::$app->mailer->compose()
         ->setFrom('no-reply@example.com')
         ->setTo('test@example.com')
         ->setSubject('Mailpit送信テスト')
         ->setTextBody('これはテスト本文です')
         ->send();</code></pre>



<p><code>http://localhost:8025</code> を開くと、受信メールが一覧表示されます。</p>



<h2 class="wp-block-heading"><span id="toc10">動作確認（Web・DB・Mail）</span></h2>



<ol class="wp-block-list">
<li><strong>Web</strong><br><code>http://localhost:8080</code> にアクセスして Yii2 のトップが表示されること。</li>



<li><strong>DB</strong><br><code>http://localhost:8081</code> → phpMyAdmin に <code>root/root</code> でログイン。<code>example</code> データベースに <code>post</code> テーブルができていること。</li>



<li><strong>Mail</strong><br>サンプルコードを実行し、<code>http://localhost:8025</code> の受信箱にメールが入ること。</li>
</ol>



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



<h4 class="wp-block-heading"><span id="toc12">ポート競合</span></h4>



<p><code>8080</code>/<code>8081</code>/<code>8025</code>/<code>1025</code>/<code>3307</code> が使用中 → <code>docker-compose.yml</code> の <code>ports</code> 左側（ホスト側）を変更。</p>



<h4 class="wp-block-heading"><span id="toc13">MySQLへ接続できない</span></h4>



<ul class="wp-block-list">
<li><code>host</code> は <code><strong>db</strong></code>（Docker内部）か、ホスト接続では <code>localhost:3307</code> を指定。</li>



<li>初回起動直後はDBの立ち上がり待ちが必要。数秒待って再試行。</li>
</ul>



<h4 class="wp-block-heading"><span id="toc14">Windows で権限由来の書き込みエラー</span></h4>



<p><code>htdocs/runtime</code> と <code>htdocs/web/assets</code> の書き込み権限が必要。コンテナ側で <code>chmod -R 777 runtime web/assets</code>（開発用途限定）。</p>



<h4 class="wp-block-heading"><span id="toc15">ファイルの改行コード</span></h4>



<p>Nginxやシェル用ファイルは <strong>LF</strong> を推奨。VS Codeで <code>LF</code> へ変換。</p>



<h4 class="wp-block-heading"><span id="toc16">古いコンテナやイメージの削除でエラー</span></h4>



<p>例: <code>Error response from daemon: conflict: unable to delete ... image is being used by stopped container ...</code></p>



<pre class="wp-block-code"><code>docker ps -a # 停止中を含め一覧
docker rm &lt;CONTAINER_ID> # 停止中コンテナを削除
docker rmi &lt;IMAGE_ID> # 参照がなくなったらイメージ削除
# 一括停止・削除（このプロジェクト内）
docker compose down -v # コンテナ・ネットワーク・ボリューム削除
docker system prune -f # 不要なリソース掃除</code></pre>



<h4 class="wp-block-heading"><span id="toc17">Composerが遅い/タイムアウト</span></h4>



<p>一時的に <code>-vvv</code> で状況確認。社内プロキシ下では環境変数の設定を。</p>



<h2 class="wp-block-heading"><span id="toc18">よく使うコマンド集</span></h2>



<pre class="wp-block-code"><code># 起動・ビルド
cd C:\Work\Workspace\Docker\example.com
docker compose up -d --build

# 停止
docker compose down

# 停止＋ボリュームごと削除（DB初期化したいとき）
docker compose down -v

# ログ参照
docker compose logs -f nginx
docker compose logs -f php
docker compose logs -f db

# コンテナに入る
docker compose exec php sh

# 権限（開発用）
docker compose exec php sh -c "chmod -R 777 runtime web/assets"</code></pre>



<h2 class="wp-block-heading"><span id="toc19">あとがき</span></h2>



<p>ここまでで、<strong>Windows + Docker</strong> 上に <strong>Yii2 + MySQL + phpMyAdmin + Mailpit</strong> の開発環境が整いました。実運用では Mailpit の代わりに本番SMTPを使いますが、開発段階では誤送信防止のため <strong>Mailpit固定</strong> を強くおすすめします。また、MySQLのパスワードや公開ポートは本番用に必ず見直してください。必要に応じて <strong>SSL</strong> や <strong>Xdebug</strong> の導入、<strong>Nginxのキャッシュ/セキュリティヘッダ</strong> の調整などを行うと、より快適で安全な環境になります。</p>



<div class="wp-block-cocoon-blocks-blank-box-1 blank-box block-box">
<h5 class="wp-block-heading"><span id="toc20">引用元</span></h5>



<ul class="wp-block-list">
<li>Yii Framework 公式ドキュメント（Yii2 Basicテンプレート）<br><a rel="noopener" href="https://www.yiiframework.com/doc/guide/2.0/ja" target="_blank">https://www.yiiframework.com/doc/guide/2.0/ja</a></li>



<li>Docker 公式ドキュメント<br><a rel="noopener" href="https://docs.docker.com/" target="_blank">https://docs.docker.com/</a></li>



<li>Docker Compose 公式ドキュメント<br><a rel="noopener" href="https://docs.docker.com/compose/" target="_blank">https://docs.docker.com/compose/</a></li>



<li>MySQL 公式ドキュメント<br><a rel="noopener" href="https://dev.mysql.com/doc/" target="_blank">https://dev.mysql.com/doc/</a></li>



<li>phpMyAdmin 公式サイト<br><a rel="noopener" href="https://www.phpmyadmin.net/" target="_blank">https://www.phpmyadmin.net/</a></li>



<li>Mailpit（開発用SMTP &amp; Web UIツール）公式リポジトリ<br><a rel="noopener" href="https://github.com/axllent/mailpit" target="_blank">https://github.com/axllent/mailpit</a></li>



<li>Nginx 公式ドキュメント<br><a href="https://nginx.org/en/docs/">https://nginx.org/en/docs/</a></li>



<li>PHP 公式マニュアル（Docker Hub版）<br><a rel="noopener" href="https://hub.docker.com/_/php" target="_blank">https://hub.docker.com/_/php</a></li>



<li>Composer 公式サイト<br><a rel="noopener" href="https://getcomposer.org/" target="_blank">https://getcomposer.org/</a></li>
</ul>
</div>



<p></p>



<p></p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/build-your-yii2-development-environment-with-docker-in-no-time-a-beginners-guide-to-integrating-mysql-phpmyadmin-and-mailpit/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<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-4"><label class="toc-title" for="toc-checkbox-4">目次</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>
		<item>
		<title>CodeIgniter3の環境を整える</title>
		<link>https://blog.takeho.com/qqohbx58gvay17fg1915s5b5z137q331/</link>
					<comments>https://blog.takeho.com/qqohbx58gvay17fg1915s5b5z137q331/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Sun, 01 Sep 2024 04:11:00 +0000</pubDate>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Composer]]></category>
		<category><![CDATA[インストール]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=304</guid>

					<description><![CDATA[CodeIgniter3は、4に比べcomposerやミドルウェア、名前空間に対応しておりませんが軽量で扱いやすく少ないリソースで高速に動作するフレームワークとして現在も人気があります。 ここではLinux環境へCode [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>CodeIgniter3は、4に比べcomposerやミドルウェア、名前空間に対応しておりませんが軽量で扱いやすく少ないリソースで高速に動作するフレームワークとして現在も人気があります。</p>



<p>ここではLinux環境へCodeIgniter3のフレームワークをセットアップする方法について説明します。</p>



<div class="wp-block-cocoon-blocks-caption-box-1 caption-box block-box not-nested-style cocoon-block-caption-box"><div class="caption-box-label block-box-label box-label"><span class="caption-box-label-text block-box-label-text box-label-text">補足</span></div><div class="caption-box-content block-box-content box-content">
<p>既にウェブサーバ・MｙSQLサーバのインストールやドキュメントルートが設定済である事を前提とします。</p>
</div></div>



<p>またドキュメントルートは</p>



<pre class="wp-block-code"><code>/var/www/html/codeigniter3/public</code></pre>



<p>とし、ホスト名はwww.example.comとします。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6"><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">フレームワークの取得・設置</a></li><li><a href="#toc2" tabindex="0">ファイル構造の変更</a><ol><li><a href="#toc3" tabindex="0">ディレクトリの作成・ファイルの移動</a></li><li><a href="#toc4" tabindex="0">ディレクトリ設定の変更</a></li></ol></li><li><a href="#toc5" tabindex="0">設定ファイルの変更</a></li><li><a href="#toc6" tabindex="0">データベースの設定</a></li><li><a href="#toc7" tabindex="0">綺麗なURLにする</a></li><li><a href="#toc8" tabindex="0">ライブラリ・ヘルパーの自動読み込み</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">フレームワークの取得・設置</span></h2>



<p>サーバへターミナル等でログイン後、次のコマンドでディレクトリ移動します。</p>



<pre class="wp-block-code"><code># cd /var/www/html/</code></pre>



<p>　次のダウンロードサイトからCodeIgniter v3.2.0-dev (Current version)のリンクURLを取得します。</p>





<a rel="noopener" href="https://codeigniter.jp/user_guide/3/installation/downloads.html" title="CodeIgniter &#12398;&#12480;&#12454;&#12531;&#12525;&#12540;&#12489; &mdash; CodeIgniter 3.2.0-dev &#12489;&#12461;&#12517;&#12513;&#12531;&#12488;" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fcodeigniter.jp%2Fuser_guide%2F3%2Finstallation%2Fdownloads.html?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">CodeIgniter &#12398;&#12480;&#12454;&#12531;&#12525;&#12540;&#12489; &mdash; CodeIgniter 3.2.0-dev &#12489;&#12461;&#12517;&#12513;&#12531;&#12488;</div><div class="blogcard-snippet external-blogcard-snippet"></div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://codeigniter.jp/user_guide/3/installation/downloads.html" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">codeigniter.jp</div></div></div></div></a>




<p>次のようにURLを指定してコマンドを実行します。</p>



<pre class="wp-block-code"><code># wget https://codeload.github.com/bcit-ci/CodeIgniter/zip/develop</code></pre>



<p>コマンド実行後developというファイルが取得されますが、このファイル名では何のファイルが不明なので次のように名前変更します。</p>



<pre class="wp-block-code"><code># mv develop develop.zip</code></pre>



<p>次にこのファイルを解凍します。</p>



<pre class="wp-block-code"><code># unzip develop.zip</code></pre>



<p>解凍後、<strong>CodeIgniter-develop</strong>のファイルの存在が確認できますが更に次のコマンドで名前変更します。</p>



<pre class="wp-block-code"><code># mv CodeIgniter-develop codeigniter3</code></pre>



<h2 class="wp-block-heading"><span id="toc2">ファイル構造の変更</span></h2>



<p>Codeigniter3内のファイル構造は次の通りです。</p>



<pre class="wp-block-preformatted">/var/www/html<br>└ codeigniter3<br>　├application(ディレクトリ)<br>　├build-release.sh<br>　├composer.json<br>　├contributing.md<br>　├DCO.txt<br>　├.editorconfig<br>　├.github(ディレクトリ)<br>　├.gitignore<br>　├index.php<br>　├license.txt<br>　├readme.rst<br>　├system(ディレクトリ)<br>　└tests(ディレクトリ)</pre>



<p>上記構造のうちドキュメントルートに設置する予定のindex.phpを起点とするとsystemディレクトリとapplicationディレクトリは公開する必要のないディレクトリになりキー情報やこの後設定するデータベースの接続情報など、外部に漏れてはいけない状況がドキュメントルート配下に配置環境の為、セキュアではありません。</p>



<p>尚、systemディレクトリやapplicationディレクトリ内のファイルは全て</p>



<pre class="wp-block-code"><code>&lt;?php
defined('BASEPATH') OR exit('No direct script access allowed');</code></pre>



<p>のように定数によるアクセス制限を掛けている為、直接アクセスする事はできない意味では安全ですが、これはPHPが正常に動作した場合に限り安全というには根本的な対策にはなっていません。</p>



<p>この対策としてsystemディレクトリとapplicationディレクトリをドキュメントルート配下でなない上位ディレクトリへ設置するように変更します。</p>



<h3 class="wp-block-heading"><span id="toc3">ディレクトリの作成・ファイルの移動</span></h3>



<pre class="wp-block-code"><code># mkdir public</code></pre>



<p><strong>public</strong>ディレクトリを作成します。</p>



<pre class="wp-block-code"><code>mv index.php ./public/</code></pre>



<p><strong>index.php</strong>を<strong>public</strong>ディレクトリ内へ移動します。</p>



<h3 class="wp-block-heading"><span id="toc4">ディレクトリ設定の変更</span></h3>



<p><strong>index.php</strong>を次のように変更します。</p>



<pre class="wp-block-code"><code>        // 93行目付近
	$system_path = '../system'; 

        // 110行目付近
	$application_folder = '../application';</code></pre>



<p>上記の更新にてドキュメントルート配下からその上位ディレクトリへの変更が完了となります。</p>



<h2 class="wp-block-heading"><span id="toc5">設定ファイルの変更</span></h2>



<p>ホスト名の指定など次のファイルを編集します。</p>



<pre class="wp-block-code"><code>application/config/config.php</code></pre>



<p>設定内容は次のようにキー名と値の構成になります。</p>



<pre class="wp-block-code"><code>$config&#91;キー名] = '値’</code></pre>



<p>次の表は初期設定の際に必要となる主要な設定情報の一覧になります。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>キー名</td><td>内容</td><td>設定値・例</td><td>説明</td></tr><tr><td>base_url</td><td>ベースURL</td><td>http://www.example.com/</td><td>インデックス名を省いたアクセスURLを記載します。</td></tr><tr><td>index_page</td><td>インデックス名</td><td>index.php<br>※表記させない場合は値は指定しない</td><td>インデックスページへのアクセス名（ベースURLは除く）</td></tr><tr><td>url_suffix</td><td>サフィックス</td><td>.html</td><td>URLの最後に付加する固定文字列</td></tr><tr><td>language</td><td>言語</td><td>japanese</td><td>言語名を指定</td></tr><tr><td>charset</td><td>文字コード</td><td>utf-8</td><td>出力するリソースの文字コード</td></tr><tr><td>composer_autoload</td><td>リソースのオートロード</td><td>TRUE / FALSE</td><td>composerパッケージの自動用読み込み</td></tr><tr><td>log_threshold</td><td>ログ出力設定</td><td>1～４</td><td>0：ロギングを無効にする、エラーロギングをオフにする<br>1：エラーメッセージ(PHPエラーを含む)<br>2：デバッグメッセージ<br>3：情報メッセージ<br>4：すべてのメッセージ</td></tr><tr><td>encryption_key</td><td>暗号キー</td><td>一意なる複雑な文字列</td><td>セッションやセキュリティクラスで使用する暗号・複合で使用するキー</td></tr><tr><td>sess_driver</td><td>セッションドライバ</td><td>files / database / redis / memcached</td><td>セッションの保存方法</td></tr><tr><td>csrf_protection</td><td>CSRF 保護</td><td>TRUE / FALSE</td><td>CSRFの脆弱性対策機能の有効・無効</td></tr></tbody></table></figure>



<h2 class="wp-block-heading"><span id="toc6">データベースの設定</span></h2>



<p>以下のファイルを編集しデータベース<strong>MySQL</strong>の接続情報を設定します。</p>



<pre class="wp-block-code"><code>application/config/database.php</code></pre>



<pre class="wp-block-code"><code>$db&#91;'default'] = array(
	'dsn'	=> '',
	'hostname' => 'ホスト名',
	'username' => 'DBユーザー名',
	'password' => 'パスワード',
	'database' => 'データ',
	'dbdriver' => 'mysqli',
	'dbprefix' => '',
	'pconnect' => FALSE,
	'db_debug' => (ENVIRONMENT !== 'production'),
	'cache_on' => FALSE,
	'cachedir' => '',
	'char_set' => 'utf8',
	'dbcollat' => 'utf8_general_ci',
	'swap_pre' => '',
	'encrypt' => FALSE,
	'compress' => FALSE,
	'stricton' => FALSE,
	'failover' => array(),
	'save_queries' => TRUE
);</code></pre>



<h2 class="wp-block-heading"><span id="toc7">綺麗なURLにする</span></h2>



<p>例えば複数の会員情報の一覧から特定の会員IDが5番のプロフィール詳細ページは一般的に次のようになります。</p>



<pre class="wp-block-code"><code>http:&#47;&#47;www.example.com/index.php/profile/view/id/5</code></pre>



<p>上記URLでは<strong>index.php</strong>のインデックスファイルの後にパラメータがスラッシュ区切りで構成される為、綺麗ではないので<strong>index.php</strong>を削除して綺麗にURLにする為、次のファイルを作成・編集します。</p>



<pre class="wp-block-code"><code>public/.htaccess</code></pre>



<pre class="wp-block-code"><code>RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 &#91;L]</code></pre>



<h2 class="wp-block-heading"><span id="toc8">ライブラリ・ヘルパーの自動読み込み</span></h2>



<p>常に使用するライブラリや頻繁に使用するヘルパーなどは自動読み込み設定する事でコントローラー内で都度読み込み宣言を記載する手間を省く事ができます。</p>



<p>次のファイルを編集します。</p>



<pre class="wp-block-code"><code>application/config/autoload.php</code></pre>



<pre class="wp-block-code"><code>// ライブラリ自動読み込み
$autoload&#91;'libraries'] = &#91;
  'database',
  'session',
];

// ヘルパー自動読み込み
$autoload&#91;'helper'] = &#91;
  'url',
  'form',
];</code></pre>



<p>これで環境の用意はひとまず完了です。</p>



<p>これ以外に必要な情報は別途ドキュメントを参照して編集してください。</p>





<a rel="noopener" href="https://codeigniter.jp/user_guide/3" title="CodeIgniter &#12518;&#12540;&#12470;&#12460;&#12452;&#12489; &mdash; CodeIgniter 3.2.0-dev &#12489;&#12461;&#12517;&#12513;&#12531;&#12488;" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fcodeigniter.jp%2Fuser_guide%2F3?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">CodeIgniter &#12518;&#12540;&#12470;&#12460;&#12452;&#12489; &mdash; CodeIgniter 3.2.0-dev &#12489;&#12461;&#12517;&#12513;&#12531;&#12488;</div><div class="blogcard-snippet external-blogcard-snippet"></div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://codeigniter.jp/user_guide/3" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">codeigniter.jp</div></div></div></div></a>

]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/qqohbx58gvay17fg1915s5b5z137q331/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>CI4でソーシャルメディアログインを実装する</title>
		<link>https://blog.takeho.com/6yrfjcpbn2uicg2g9mlolhi84qccjt3w/</link>
					<comments>https://blog.takeho.com/6yrfjcpbn2uicg2g9mlolhi84qccjt3w/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Fri, 26 Jul 2024 04:59:55 +0000</pubDate>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Composer]]></category>
		<category><![CDATA[Social]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=86</guid>

					<description><![CDATA[Codeigniter4でfacebookやtwitterなどのソーシャルメディアログイン機能を実装する方法について説明します。 ソーシャルメディアログイン機能の実装にはHybridauthのライブラリを使用します。 H [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Codeigniter4でfacebookやtwitterなどのソーシャルメディアログイン機能を実装する方法について説明します。</p>



<p>ソーシャルメディアログイン機能の実装にはHybridauthのライブラリを使用します。</p>



<h3 class="wp-block-heading"><span id="toc1">Hybridauthライブラリのインストール</span></h3>



<p>次のコマンドを実行してHybridauthライブラリをインストールします。</p>



<pre class="wp-block-code"><code># composer require hybridauth/hybridauth</code></pre>



<h3 class="wp-block-heading"><span id="toc2">設定ファイルの作成</span></h3>



<p>Configディレクトリ内にProvider.phpを以下の内容で作成します。</p>



<pre class="wp-block-code"><code>&lt;?php
 
namespace App\Config;

use CodeIgniter\Config\BaseConfig;

class Provider extends BaseConfig
{
  public $configure = &#91;
    // callback
    'callback' => 'https://www.example.com/auth/authenticate',
    'providers' => &#91;
      // facebook.
      'Facebook' => &#91;
        'enabled' => true,
        'keys' => &#91;
          'id' => '&lt;アプリID>',
          'secret' => '&lt;秘密キー>',
        ],
      ],
      // twitter
      'Twitter' => &#91;
        'enabled' => true,
        'keys' => &#91;
          'key' => '&lt;キー>',
          'secret' => '&lt;秘密キー>',
        ],
      ],
    ],
  ];
}</code></pre>



<p>アプリID、キー、秘密キーは各SNSのデベロッパーサイトで発行された値を指定します。</p>



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



<p>Authコントローラーを作成します。</p>



<pre class="wp-block-code"><code>&lt;?php

namespace App\Controllers;

use Hybridauth\Hybridauth;
use Hybridauth\HttpClient;

class Auth extends BaseController
{
  public function index()
  {
    return view('auth');
  } 
  
  public function authenticate($provider = false)
  {
    $userProfile = &#91;];
    $config = new \App\Config\Provider();
    try {
      $auth = new Hybridauth($config->configure);
      $adapter = $auth->authenticate($provider);
      $tokens = $adapter->getAccessToken();
      $userProfile = $adapter->getUserProfile();
      $adapter->disconnect();
      
    } catch (\Exception $e) {
      echo $e->getMessage();
    }

    return view('result', &#91;'userProfile' => $userProfile]);
  }</code></pre>



<h3 class="wp-block-heading"><span id="toc4">ビューの作成</span></h3>



<p>ビューはログインとログイン後の画面を用意します。</p>



<h4 class="wp-block-heading"><span id="toc5">auth.phpの作成</span></h4>



<p>Viewsディレクトリにauth.phpを以下の内容で作成します。</p>



<pre class="wp-block-code"><code>&lt;html>
&lt;head>
&lt;title>ソーシャルメディアログインテスト&lt;/title>

&lt;meta charset="utf-8">
&lt;meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">
&lt;/head>
&lt;body>
&lt;a href="&lt;?php echo base_url('auth/authenticate/Facebook') ?>">Facebookアカウントでログイン&lt;/a>&lt;br>
&lt;a href="&lt;?php echo base_url('auth/authenticate/Twitter') ?>">Twitterアカウントでログイン&lt;/a>
&lt;/body>
&lt;/html></code></pre>



<h4 class="wp-block-heading"><span id="toc6">result.phpの作成</span></h4>



<p>Viewsディレクトリにresult.phpを以下の内容で作成します。</p>



<pre class="wp-block-code"><code>&lt;html>
&lt;head>
&lt;title>ソーシャルメディアログインテスト&lt;/title>

&lt;meta charset="utf-8">
&lt;meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">
&lt;/head>
&lt;body>
&lt;?php var_dump($userProfile) ?>
&lt;/body>
&lt;/html></code></pre>



<h3 class="wp-block-heading"><span id="toc7">動作確認</span></h3>



<p>次のURLへアクセスしてログインできるか確認します。</p>



<pre class="wp-block-code"><code>https:&#47;&#47;www.example.com/auth</code></pre>



<p>正常に動作していればソーシャルメディア上の登録ID、プロフィール名、サブネイル画像URLの表示が確認できます。</p>





<a rel="noopener" href="https://hybridauth.github.io" title="Hybridauth Social Login PHP Library" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fhybridauth.github.io?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Hybridauth Social Login PHP Library</div><div class="blogcard-snippet external-blogcard-snippet"></div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://hybridauth.github.io" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">hybridauth.github.io</div></div></div></div></a>

]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/6yrfjcpbn2uicg2g9mlolhi84qccjt3w/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ComposerでCodeigniter3とIon-Authライブラリを導入する方法</title>
		<link>https://blog.takeho.com/xxn7myyoarcxbmzhq3uzlkxour81aryh/</link>
					<comments>https://blog.takeho.com/xxn7myyoarcxbmzhq3uzlkxour81aryh/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Tue, 23 Jul 2024 08:30:37 +0000</pubDate>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Composer]]></category>
		<category><![CDATA[Ion-Auth]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=81</guid>

					<description><![CDATA[パッケージ管理ツールのComposerを使用してCodeigniter3のインストールした上で認証ライブラリであるIon-Authのセットアップ方法を説明しています。 目次 インストールCodeigniterのインストー [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>パッケージ管理ツールのComposerを使用してCodeigniter3のインストールした上で認証ライブラリであるIon-Authのセットアップ方法を説明しています。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-10"><label class="toc-title" for="toc-checkbox-10">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">インストール</a><ol><li><a href="#toc2" tabindex="0">Codeigniterのインストール</a></li><li><a href="#toc3" tabindex="0">Ion-Authのインストール</a></li></ol></li><li><a href="#toc4" tabindex="0">データベースの設定</a><ol><li><a href="#toc5" tabindex="0">コマンド実行ファイルの作成</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">インストール</span></h2>



<h3 class="wp-block-heading"><span id="toc2">Codeigniterのインストール</span></h3>



<p>次のComposerコマンドでCodeigniter3をインストールします、</p>



<pre class="wp-block-code"><code># composer create-project kenjis/codeigniter-composer-installer ＜インストール先ディレクトリ名＞</code></pre>



<h3 class="wp-block-heading"><span id="toc3">Ion-Authのインストール</span></h3>



<p>次のComposerコマンドでIon-Authをインストールします。</p>



<pre class="wp-block-code"><code># cd ＜インストール先ディレクトリ名＞
# php bin/install.php ion-auth 2</code></pre>



<h2 class="wp-block-heading"><span id="toc4">データベースの設定</span></h2>



<p>データベースのスキーマを管理する機能を追加します。</p>



<h3 class="wp-block-heading"><span id="toc5">コマンド実行ファイルの作成</span></h3>



<p>以下のファイルを/application/controllers/内に設置します。</p>



<pre class="wp-block-code"><code>Migrate.php
&lt;?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Migrate extends CI_Controller {

    function __construct()
    {   
        parent::__construct();
        if(! $this->input->is_cli_request()) {
            show_404();
            exit;
        }   
        $this->load->library('migration');
    }   

    function current()
    {   
        if ($this->migration->current()) {
            log_message('error', 'Migration Success.');
        } else {
            log_message('error', $this->migration->error_string());
        }   
    }   

    function rollback($version)
    {   
        if ($this->migration->version($version)) {
            log_message('error', 'Migration Success.');
        } else {
            log_message('error', $this->migration->error_string());
        }   
    }   

    function latest()
    {   
        if ($this->migration->latest()) {
            log_message('error', 'Migration Success.');
        } else {
            log_message('error', $this->migration->error_string());
        }   
    }

}
マイグレーションの設定
application/config/migration.phpを次のように編集します。

&lt;?
// マイグレーションを有効化
$config&#91;'migration_enabled'] = TRUE;
// シーケンス番号で管理
$config&#91;'migration_type'] = 'sequential';</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/xxn7myyoarcxbmzhq3uzlkxour81aryh/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Yii2のインストール・初期設定方法</title>
		<link>https://blog.takeho.com/y96x9r38o0zq6jvjcvs3znskqu59mymz/</link>
					<comments>https://blog.takeho.com/y96x9r38o0zq6jvjcvs3znskqu59mymz/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Thu, 18 Jul 2024 05:49:55 +0000</pubDate>
				<category><![CDATA[Yii2]]></category>
		<category><![CDATA[Composer]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=47</guid>

					<description><![CDATA[日本国では人気の無いフレームワークYii2 充実したライブラリと機能性の高さの割に大規模なウェブアプリケーションだけでなく小規模なウェブアプリケーションでも開発しやすいようディレクトリの構成変更が簡単にできる便利なフレー [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>日本国では人気の無いフレームワークYii2</p>



<p>充実したライブラリと機能性の高さの割に大規模なウェブアプリケーションだけでなく小規模なウェブアプリケーションでも開発しやすいようディレクトリの構成変更が簡単にできる便利なフレームワークです。</p>



<p>この記事ではYii2のインストールと開発開始までの初期設定方法を説明します。</p>



<h3 class="wp-block-heading"><span id="toc1">Yii2のインストール</span></h3>



<p>次のcomposerコマンドでYii2をインストールします</p>



<pre class="wp-block-code"><code># cd ＜インストールするディレクトリ＞
# composer create-project --prefer-dist yiisoft/yii2-app-basic ＜プロジェクト名＞</code></pre>



<h3 class="wp-block-heading"><span id="toc2">コード生成ツールGiiの許可設定</span></h3>



<p>Yii2にはGUI上で次のファイルを自動生成する機能があります。</p>



<ul class="wp-block-list">
<li><strong>Model Generator</strong><br>このジェネレータは、指定されたデータベーステーブルのActiveRecordクラスを生成します。</li>



<li><strong>CRUD Generator</strong><br>このジェネレータは、指定されたデータモデルのCRUD(作成、読み取り、更新、削除)操作を実装するコントローラとビューを生成します。</li>



<li><strong>Controller Generator</strong><br>このジェネレータは、1つまたは複数のコントローラアクションと対応するビューを持つ新しいコントローラクラスをすばやく生成するのに役立ちます。</li>



<li><strong>Form Generator</strong><br>このジェネレータは、指定されたモデルクラスの入力を収集するフォームを表示するビュースクリプトファイルを生成します。</li>



<li><strong>Module Generator</strong><br>このジェネレータは、Yiiモジュールに必要なスケルトンコードを生成するのに役立ちます。</li>



<li><strong>Extension Generator</strong><br>このジェネレータは、Yii拡張に必要なファイルを生成するのに役立ちます。</li>
</ul>



<p>Giiの使用は開発環境でのみ利用できるようIP制限を掛けて特定のアクセス元IPのみ許可する必要があります。</p>



<pre class="wp-block-code"><code>/config/web.php

    $config&#91;'bootstrap']&#91;] = 'gii';
    $config&#91;'modules']&#91;'gii'] = &#91;
        'class' => 'yii\gii\Module',
        // uncomment the following to add your IP if you are not connecting from localhost.
        'allowedIPs' => &#91;'127.0.0.1', '::1'], // ⇦コメントアウトを外しアクセス元IPを設定
    ];</code></pre>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box not-nested-style cocoon-block-tab-caption-box"><div class="tab-caption-box-label block-box-label box-label"><span class="tab-caption-box-label-text block-box-label-text box-label-text">注意</span></div><div class="tab-caption-box-content block-box-content box-content">
<p>Giiでのコード生成はローカルでの開発環境を前提としています。</p>



<p>別途外部サーバ等でGiiを使用する場合、コード生成先ディレクトリの権限の影響によりファイル生成が失敗しますのでご注意ください。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc3">デバックツールバーの許可設定</span></h3>



<p>デバックツールバーもGiiと同様にアクセス元IPの許可設定をします。</p>



<pre class="wp-block-code"><code>/config/web.php

    $config&#91;'bootstrap']&#91;] = 'debug';
    $config&#91;'modules']&#91;'debug'] = &#91;
        'class' => 'yii\debug\Module',
        // uncomment the following to add your IP if you are not connecting from localhost.
        'allowedIPs' => &#91;'127.0.0.1', '::1'], // ⇦コメントアウトを外しアクセス元IPを設定
    ];</code></pre>



<h3 class="wp-block-heading"><span id="toc4">データベース接続設定</span></h3>



<p>データベースの接続設定をします。</p>



<pre class="wp-block-code"><code>config/db.php

return &#91;
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=＜データベース名＞',
    'username' => '＜ユーザ名＞',
    'password' => '＜パスワード＞',
    'charset' => 'utf8',</code></pre>



<p>以上で完了です。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/y96x9r38o0zq6jvjcvs3znskqu59mymz/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
