(cakephp)コンポネントでコントローラーを強化

コンポネントとは?

複数のコントローラーの間でロジックを共有する仕組み。コントローラーにコンポーネントを組み込むと、コントローラーに記述を増やすことなく複雑な機能を実現できる。

?コアコンポネント

- ACL(機能へのアクセス権の管理を設定ファイルやデータベースをもとに行う)   allow()、deny()、 check()  
- Auth(ユーザの認証を行う)                                                                          login()、logout()、isAuthrized()、password()  
- Cookie(Cookieの制御を行う)                                                                      write()、read()、delete()、destory()  
- Email(メールの送信を行う)                                                                         send()  
- RequestHandler(AJaxリクエストや、モバイルからのアクセスを検出する)      isXml(),isMobile()  
- Security(セキュリティ対策を行う)                    cipher()、hash()  
- Session(セッションへの情報の読み書きを扱う)               write()、read()、check()  

コンポネントの使い方

1. Authコンポーネント(認証機能を実現)

BASIC認証やログイン画面を使った認証を、コントローラー単位やアプリケーション全体に設定できる。
ログイン後の挙動や、パスワードをどのように暗号化してデータベースに格納するかなどの細かいカスタマイズが行える。

*認証の設定

<?php  

App::uses('Controller', 'Controller');  
class Appcontroller extends Controller{
   public $components = ['Auth', 'Session'];
} 

*ログイン処理を実装した例

<?php  

class UsersController extends AppController{
   public function login(){
       if($this->request->is('post')){
         if($this->Auth->login()){
            return $this->redirect($this->Auth->redirect());
         } else {
            $this->Session->setFlash(
               'Username or password is incorrect'
            );
         } 
       }
   }
   public function logout() {
      $this->Auth->logout();
      return $this->redirect('/');
   }
}

※ログイン画面のビュー例

<!-- app/View/Users/login.ctp -->
<?php
echo $this->Form->create('User');
echo $this->Form->input('User.username');
echo $this->Form->input('User.password');
echo $this->Form->end('login');
?>  

2.Paginationコンポーネント(大量のデータを自動的にページ分けする)

項目によるソートの指定や一度に表示する件数を変更するなどの機能も提供する強力な機能

<?php  

class PostsController extends AppController {
      public $paginate = [
            'limit' => 3,
            'order' => [
                  'Post.created' => 'DESC',
             ],
             'conditions' => [
                   'Post.id <' => 300
             ]
      ];

      public functoin getlist() {
            //Postモデルのデータを取得  
            $data = $this->paginate('Post', [
                   'Post.id not' => null
             ]);
             $this ->set('data', $data);
       }
} 

<!-- app/View/Posts/getlist.ctp -->  
<table>
<tr>
    <th><?php echo $this->Paginator->sort('id','記事id')></th>
    <th><?php echo $this->Paginator->sort('name','タイトル')></th>
    <th><?php echo $this->Paginator->sort('body','本文')></th>  
</tr>
<?php foreach ($data as $row): ?>
<tr>
    <td><?php echo h($row['Post']['id']); ?></td>
    <td><?php echo h($row['Post']['name']); ?></td>
    <td><?php echo h($row['Post']['body']); ?></td>
</tr>
<?php endforeach; ?>
</table>
<?php echo $this->Paginator->counter(); ?><br />
<?php echo $this->Paginator->prev('前へ'); ?><br />
<?php echo $this->Paginator->number(); ?><br />
<?php echo $this->Paginator->next('次へ'); ?><br />  

コンポネントの自作