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>
      
      






All Articles