🍓

ユーザー表示部分

2024/01/12に公開

データの管理は出来るようにしたから外部のユーザーの閲覧部分を作る
ユーザーは投稿とコメントを見られる、記事に対してコメントを出来る
まずここから作る

bin/cake bake controller Posts
bin/cake bake template Posts
bin/cake bake controller Comments
bin/cake bake template Comments
PostsController.php
    /**
     * View method
     *
     * @param string|null $id Post id.
     * @return \Cake\Http\Response|null|void Renders view
     * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
     */
    public function view($id = null)
    {
        $post = $this->Posts->get($id, [
            'contain' => ['Categories', 'Tags', 'Comments'],
        ]);
	
	// Commentsテーブルから空のエンティティを作成。
	// フォームからデータを受けるために必要。
        $comment = $this->Posts->Comments->newEmptyEntity();

        if ($this->request->is('post') && $this->request->getData('comment')) {
            $commentData = $this->request->getData('comment');
            $commentData['post_id'] = $id;
            $comment = $this->Posts->Comments->patchEntity($comment, $commentData);
            if ($this->Posts->Comments->save($comment)) {
                $this->Flash->success('新しいコメントが追加されました。');
                return $this->redirect(['action' => 'view', $id]);
            } else {
                $this->Flash->error('コメントを追加できませんでした。もう一度試してください。');
            }
        }

        $this->set(compact('post'));
    }

コントローラにコメント追加用のメソッドを追記したらテンプレート側にフォームを用意する

view.php
// templates/Posts
<h4><?= __('Related Comments') ?></h4> // コメント部のタイトル
    <!-- コメントフォームの追加 -->
    <?= $this->Form->create(null, ['url' => ['action' => 'view', $post->id]]) ?>
    <?= $this->Form->control('comment.name', ['label' => '名前']); ?>
    <?= $this->Form->control('comment.body', ['label' => 'コメント']); ?>
    <?= $this->Form->button('コメントを追加'); ?>
    <?= $this->Form->end(); ?>
<?php if (!empty($post->comments)) : ?> // ↓からコメント群

ユーザーには投稿やコメントを編集させない為その辺りを消してあげればブログとしては完成する
記事を編集できるのは自分だけの予定だった為usersテーブルは作っていなかったがユーザー認証用に作った方が良かった

bin/cake bake migration CreateUsers id:primary_key name:string password:string
bin/cake migrations migrate
# モデル、コントローラ、ビューを作る
bin/cake bake model Users
bin/cake bake controller Users --prefix admin
bin/cake bake template Users --prefix admin

そしたらプラグインを入れる

composer require cakephp/authentication

Userモデルを編集してパスワードをハッシュ化できるようにする

User.php
// Entity/User.php
                                                                                                      37,5          Bot
<?php
declare(strict_types=1);

namespace App\Model\Entity;

use Cake\ORM\Entity;
// useを追加
use Cake\Auth\DefaultPasswordHasher;

/**
 * User Entity
 *
 * @property int $id
 * @property string $name
 * @property string $password
 */
class User extends Entity
{
    /**
     * Fields that can be mass assigned using newEntity() or patchEntity().
     *
     * Note that when '*' is set to true, this allows all unspecified fields to
     * be mass assigned. For security purposes, it is advised to set '*' to false
     * (or remove it), and explicitly make individual fields accessible as needed.
     *
     * @var array<string, bool>
     */
    protected $_accessible = [
        'name' => true,
        'password' => true,
    ];

    /**
     * Fields that are excluded from JSON versions of the entity.
     *
     * @var array<string>
     */
    protected $_hidden = [
        'password',
    ];
    
    //メソッドを追加
    protected function _setPassword($password)
    {
        if (strlen($password) > 0) {
            return (new DefaultPasswordHasher)->hash($password);
        }
    }
}

〜/admin/users/addからレコードを追加するとパスワードがハッシュ化される
あとはチュートリアルに則って追記していくだけ
https://book.cakephp.org/5/ja/tutorials-and-examples/blog-auth-example/auth.html#id4
ここまでやって思ったが認証が必要なページは自身で設定できるのだから管理側とユーザー側でコントローラもビューも分ける必要なかった

どうすれば何ができるかを知るのは大事だからってことで。

Discussion