Kohana 3.0-あなたの人生を楽にします

フレームワークは優れており、素晴らしいです。将来のアプリケーションのアーキテクチャについて考える時間を大幅に節約できる機会ですが、フレームワークはフレームワークです。 また、たとえば、この記事で説明するKohana 3.0では、このフレームワークをある程度ドープする必要があります。
それでは、これから何をするかを一歩ずつ見ていきましょう。

それでは始めましょう...

すでにいくつかの簡単な手順を実行していることを前提としています。イメージ内に.htaccessファイルを作成し、example.htaccessの肖像を作成して、作業ディレクトリへの必要なパスを設定します。 Kohana :: initメソッドの初期化パラメータを変更しました(また、作業ディレクトリへのパスを設定し、(好みに合わせて) 'index_file' => FALSEを設定します;その後の作業に必要なモジュールを接続しました...
ここで、デフォルトルートがインストールされているbootstrap.phpの終わりを見てみましょう。通常、アプリケーションにはルートがいくつありますか? 十? 二十? 私のKo3.0での最後のアプリケーションには約30がありましたが、Dofigaは一般に、ここに保存するために、実際にはbootstrap.phpに保存されているデータと混合されています。 ウェイアウト? それらをすべて別のファイルに取り出して含めます。 これを言ってみましょう:
routes.phpという名前のアプリケーションフォルダーに新しいファイルを作成し、そこにRoute :: set( 'default')全体を転送します...そしてbootstrap.phpの以前の場所でrequire_once APPPATH.'routes.php 'と書くだけです;
ここで、コントローラクラス(Kohana_Controllerのクラス)には、コントローラの「ボディ」の前後にそれぞれ実行される素晴らしいメソッド()およびafter()があることを思い出してください。 ここで、ほとんどのアプリケーションでは、少なくとも管理ログイン用に認証モジュール(auth)を接続することに注意してください。 なぜこれをしているのですか?
そして、ベースのKohana_Controllerを再定義し、そこで(可能性のある)ユーザーとの作業を始めましょう。
<?php class Controller extends Kohana_Controller { /** * @var auth property with instance of "Auth" module */ public $auth = NULL; /** * @var user property with object of user */ public $user = FALSE; public function before() { parent::before(); $this->auth = Auth::instance(); $this->user = $this->auth->get_user(); } public function after() { parent::after(); } } 

そして、controller.phpという名前でapplication / classesフォルダーにこの内容を保存します
それでは、将来どのコントローラーのどの場所でも絶対に必要なものを考えてみましょう。 リダイレクト! でも2つ! 実際には-メインのリダイレクトとリダイレクトへのリダイレクト。 必要な状況については説明しませんが、リダイレクトの必要性に同意した場合にのみ、それらについてさらに読みます。
ホームへのリダイレクトとは、パラメータなしでデフォルトルートに対応するアドレスにユーザーをリダイレクトすることを意味します。 リダイレクトを戻すとは、リファラーラインからアドレスにリダイレクトすることを意味します。 そうでない場合は、上記のリダイレクトを使用してメインへのリダイレクトを行います。 また、2種類のリダイレクトを使用できます(これまでのところ、私にとっては役に立たなかったが、機会は有用であると思われる)-現在のリクエストのリダイレクト(HMVCなど)とメインリクエストのリダイレクト。 デフォルトでは、メインリクエストをリダイレクトします。 実際には、上記の以下の実装を提案します(before()メソッドの後に同じアプリケーション/クラス/controller.phpですべてを記述します):
  public function go_home($current_request_only = FALSE) { $url = Route::url('default', NULL, TRUE); $this->go($url, $current_request_only); } public function go_back($current_request_only = FALSE) { Validate::url(Request::$referrer) OR $this->go_home($current_request_only); $this->go(Request::$referrer, $current_request_only); } private function go($url, $current_request_only) { $request = ($current_request_only) ? $this->request : Request::instance(); $request->redirect($url); } 

少しの方法を説明します:
go_home()メソッドで、デフォルトのルートURLを取得し、go()メソッドを呼び出します
go_back()メソッドで、Request :: $ referrerからURLの有効性を確認し、テストに合格しない場合、実行が中断されるgo_home()メソッドを実行します
go()メソッドで、リダイレクトするリクエストを決定します(デフォルトでは、Request :: instance()がメインリクエストですが、$ this->リクエストも可能です)

さまざまなクエリ(HMVC /シンプル)について説明しているので、Requestクラスのわずかな省略を排除しましょう。 省略されているのは、Kohana 3.0とは異なり、Kohana 3.1とは異なり、リクエストの所有権を判別する方法がなく、Request :: $ is_ajaxのみです。
ファイルapplication / classes / request.phpを作成して書き込みます:
 class Request extends Kohana_Request { public function is_initial() { return $this === Request::instance(); } } 

Request :: current()はメインリクエスト(シングルトーン)のインスタンスを返すため、現在のRequestオブジェクトが$ thisであるかどうかを確認するだけで十分です。 この方法は、将来的に役立ちます。
次に、単純なコントローラーの拡張機能があります。これは、一部のアクションを実行するだけでなく、Viewでも機能するコントローラーです。 それをController_Frontと呼びましょう(KohanaはController_Templateという名前で似たようなものをリモートで提供しています-好みの問題ですが、名前に依存するものはありません-残りのコントローラーを継承するクラスだけです)。
Controller_Frontは、ビュー全体を「ラッパー」と「コンテンツ」に分解します。 ラッパーは、プロジェクトのすべてのページの標準的なマークアップ特性です。Doctype、スタイルの接続、すべてのページにあるべきすべてすべてがあります。 コンテンツは特定のコントローラーの結果です。 Controller_Frontから少し注意をそらして、すぐに作成して、実際に何を話しているのかを理解しましょう。
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <meta name="author" content="Roman Chvanikoff" /> <title><?php echo $title; ?></title> </head> <body> <?php echo $content; ?> </body> </html> 

ここに、コントローラーの作業の結果として取得されたコンテンツ($コンテンツ)が埋め込まれる、このようなラッパーがあります。
これをアプリケーション/ビュー/index.phpとして保存します
では、Kohanaのデフォルトルートであるwelcome / indexのコンテンツビューを作成しましょう。
 <h1>Welcome!</h1> 

それをアプリケーション/ビュー/ようこそ/index.phpとして保存します
実際、この記事の行では、何らかの理由で以前はうまくいかなかったかどうか、ラッパーとは何か、コンテンツとは何かをすでに理解しているはずです。
しかし、Controller_Frontに戻ります。 ラッパーの名前がコントローラーで再定義されていない場合は、デフォルトですべてをインデックスラッパーにレンダリングしましょう(アプリケーションのロジックがわからない)。
 class Controller_Front extends Controller { /** * @var layout wrapper of content for final output */ public $layout = 'index'; /** * @var content controller-generated output */ public $content; /** * @var errors all logic errors (including Validate errors) should be stored here */ public $errors; /** * @var post Validate object of _POST */ public $post; /** * @var view_path define what folder should be used to generate Views * values: * NULL - View::path will be generated as name of called controller * FALSE - View::path will not affect views generation * string - View::path will have value of the view_path property */ public $view_path = NULL; public function before() { parent::before(); $this->layout = View::factory($this->layout); $this->layout->set_global('user', $this->user); $this->post = Validate::factory($_POST); // Doubts? Look at view_path property definition if (is_null($this->view_path)) { View::$view_path = $this->request->controller; } elseif ($this->view_path) { View::$view_path = $this->view_path; } } public function after() { /** * Clear View "environment" */ View::$view_path = NULL; if ( ! Validate::not_empty($this->errors)) { $this->errors = NULL; } else { // $this->errors should be an array to pass it as argument to View. is_array($this->errors) OR $this->errors = array($this->errors); // $this->errors is a View now $this->errors = View::factory('errors', array('errors' => $this->errors)); } // $this->content can be a simple string or something like that so we check if it is a View file if ($this->content instanceof View) { // Append post-data $this->content->post = $this->post; // Append errors $this->content->errors = $this->errors; } // If request is initial - return layout with attached content if ($this->request->is_initial() AND ! Request::$is_ajax) { // Append content to layout $this->layout->content = $this->content; // Set response $this->request->response = $this->layout; } else { // Set response as controller-generated output $this->request->response = $this->content; } parent::after(); } } 

このコントローラーでは、View :: $ view_pathで作業することを除いて、コメントからすべてが明確になっていることを望みます-それは何ですか? これにより、$ this-> content = View :: factory( 'user / edit');のような異なるアクションで同じコントローラー内に行を記述できなくなります。 そして、よりコンパクトな$ this-> content = View :: factory( 'edit');
ところで、View自体を展開しましょう。そうでない場合、これをどのように実装しますか?
 class View extends Kohana_View { /** * @staticvar view_path a directory that will be used to generate views */ public static $view_path = NULL; /** * Sets the view filename. * * $view->set_filename($file); * * @param string view filename * @return View * @throws Kohana_View_Exception */ public function set_filename($file) { $directory = 'views'; if ( ! is_null(View::$view_path)) { $directory .= DIRECTORY_SEPARATOR.View::$view_path; } if (($path = Kohana::find_file($directory, $file)) === FALSE) { throw new Kohana_View_Exception('The requested view :file could not be found in :directory', array( ':file' => $file, ':directory' => $directory, )); } // Store the file path locally $this->_file = $path; return $this; } } 

Controller_Frontからのこの変更されたクラスでの作業がスケジュールされた後、ここで停止する必要はないと思うので、このファイルをapplication / classes / view.phpとして保存し、Controller_Frontをapplication / classes / controller / front.phpおよび "さらに進んでいます。」

ウェルカムコントローラー(アプリケーション/クラス/コントローラー/ welcome.php)を開き、extended ControllerをController_Frontに拡張するように変更し、インデックスメソッドで、文字列$ this-> request-> response = 'hello、world!'; $ this-> content = View :: factory( 'index');

さて、すべてが正しく完了したら、ブラウザを開いてプロジェクトのアドレスに移動し、Views / welcome / index.phpのビューファイルを表示します。

あとがき

この記事は「追加して公開」フォルダーにほぼ1か月間置かれていましたが、ようやくその中の情報を何らかの方法で並べ替え、実際に公開することができました。 あなたがそれを読んで、しばらくの間あなたに理解できないままであったか、私がコードに間違いを犯したか、あなたが記事に従ってすべてをしたが、何もうまくいかなかった場合-コメントをすぐに書いて、私はできるだけ早く答えます。 ;)

PS:いつか「add and publish」フォルダから残りの記事を手に入れると思うので、この記事はほんの始まりに過ぎません。それから、私たちがやることに基づいて簡単なアプリケーションを作成します(コメントに提案を書く)この記事-これにより、作成したばかりのアメニティを評価できます。

UPD:
ビューファイルviews / errors.phpは次のようになります。
 <ul class="errors"> <?php foreach ($errors as $error) : ?> <li><?php echo $error; ?></li> <?php endforeach; ?> </ul> 

Source: https://habr.com/ru/post/J115009/


All Articles