Cakephp-controllers
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は、次の出力を提供します。
モデルの読み込み
CakePHPでは、* loadModel()*メソッドを使用してモデルをロードできます。 以下は、loadModel()メソッドの構文です。
構文
Cake\Controller\Controller::loadModel(string $modelClass, string $type)
上記の関数には2つの引数があります-
- 最初の引数はモデルクラスの名前です。
- 2番目の引数は、ロードするリポジトリのタイプです。
例
コントローラーにArticlesモデルをロードする場合、コントローラーのアクションに次の行を記述することでロードできます。
$this->loadModel('Articles');