Cakephp-controllers

提供:Dev Guides
移動先:案内検索

CakePHP-コントローラー

名前が示すように、コントローラーがアプリケーションを制御します。 モデルとビューの間の橋のように機能します。 コントローラーは要求データを処理し、正しいモデルが呼び出され、正しい応答またはビューがレンダリングされるようにします。 コントローラのクラスのメソッドは*アクション*と呼ばれます。 各コントローラーは命名規則に従います。 コントローラークラス名は複数形、キャメルケース、コントローラー- PostsController で終わります。

AppController

*AppConttroller* クラスは、すべてのアプリケーションのコントローラーの親クラスです。 このクラスは、CakePHPの *Controller* クラスを拡張します。 AppControllerは *src/Controller/AppController.php* で定義されています。 ファイルには次のコードが含まれています。
<?php
   namespace App\Controller;
   use Cake\Controller\Controller;
   use Cake\Event\Event;

   class AppController extends Controller{
      public function initialize(){
         parent::initialize();
         $this->loadComponent('RequestHandler');
         $this->loadComponent('Flash');
      }
      public function beforeRender(Event $event){
         if (!array_key_exists('_serialize', $this->viewVars) &&
            in_array($this->response->type(), ['application/json', application/xml'])) {
            $this->set('_serialize', true);
         }
      }
   }
*AppController* を使用して、アプリケーションのすべてのコントローラーで使用されるコンポーネントをロードできます。 AppControllerで作成された属性とメソッドは、それを拡張するすべてのコントローラーで使用できます。 * initialize()*メソッドは、コンポーネントをロードするためにコントローラーのコンストラクターの最後に呼び出されます。

コントローラの動作

コントローラクラスのメソッドは、アクションと呼ばれます。 アクションは、リクエストを行うブラウザ/ユーザーに適切な応答を送信する責任があります。 ビューは、アクションの名前、つまりコントローラーのメソッドの名前によってレンダリングされます。

class RecipesController extends AppController{
   public function view($id){
     //Action logic goes here.
   }
   public function share($customerId, $recipeId){
     //Action logic goes here.
   }
   public function search($query){
     //Action logic goes here.
   }
}

上記の例でわかるように、 RecipesController には3つのアクション(* View、Share、、 *Search )があります。

リダイレクト

ユーザーを同じコントローラーの別のアクションにリダイレクトするには、setAction()メソッドを使用できます。 以下は、setAction()メソッドの構文です-

構文

Cake\Controller\Controller::setAction($action, $args...)

次のコードは、ユーザーを同じコントローラーのインデックスアクションにリダイレクトします。

$this->setAction('index');

次の例は、上記の方法の使用法を示しています。

次のプログラムに示すように、 config/routes.php ファイルに変更を加えます。

*config/routes.php*
<?php
   use Cake\Core\Plugin;
   use Cake\Routing\RouteBuilder;
   use Cake\Routing\Router;

   Router::defaultRouteClass('DashedRoute');
   Router::scope('/', function (RouteBuilder $routes) {
      $routes->connect('/redirectcontroller',['
         controller'=>'Redirects','action'=>'action1']);

      $routes->connect('/redirectcontroller2',['
         controller'=>'Redirects','action'=>'action2']);

      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();

src/Controller/RedirectsController.phpに RedirectsController.php ファイルを作成します。 次のコードをコントローラーファイルにコピーします。

*src/Controller/RedirectsController.php*
<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\ORM\TableRegistry;
   use Cake\Datasource\ConnectionManager;

   class RedirectsController extends AppController{
      public function action1(){
      }
      public function action2(){
         echo "redirecting from action2";
         $this->setAction('action1');
      }
   }
?>
*src/Template* に *Redirects* ディレクトリを作成し、そのディレクトリの下に *action* *。ctp *という* *View* *ファイルを作成します。 そのファイルに次のコードをコピーします。
*src/Template/Redirects/action1.ctp*
This is an example of how to redirect within controller.

次のURLにアクセスして、上記の例を実行します。

*http://localhost:85/CakePHP/redirect-controller*

出力

実行すると、次の出力が表示されます。

リダイレクト

次に、次のURLにアクセスします- http://localhost:85/CakePHP/redirect-controller2

上記のURLは、次の出力を提供します。

Action2のリダイレクト

モデルの読み込み

CakePHPでは、* loadModel()*メソッドを使用してモデルをロードできます。 以下は、loadModel()メソッドの構文です。

構文

Cake\Controller\Controller::loadModel(string $modelClass, string $type)

上記の関数には2つの引数があります-

  • 最初の引数はモデルクラスの名前です。
  • 2番目の引数は、ロードするリポジトリのタイプです。

コントローラーにArticlesモデルをロードする場合、コントローラーのアクションに次の行を記述することでロードできます。

$this->loadModel('Articles');