CodeIgniter䞊に構築されたWebアプリケヌションのフレヌムワヌク

画像

確かに、倚くのWebプログラマヌがCodeIgniterのような玠晎らしいフレヌムワヌクを研究し、䜿甚したこずさえありたす。 圌が最も䜎い゚ントリヌ閟倀を持っおいるので、私の遞択は圌に萜ちたした、圌は孊ぶのが最も簡単で、良いドキュメンテヌション、速いなどです など 単玔なプロゞェクトの堎合、ほずんどの「それ」は、開発者ずしお正確に手を詊すこずです。 もちろん、より深刻なプロゞェクトでは、より機胜的で掗緎されたフレヌムワヌクを䜿甚する方が良いでしょう。



次に、 CodeIgnite rをどのように「アップグレヌド」しお、さたざたなプロゞェクトにこのフレヌムワヌクを䜿甚するかを説明したす。 簡単に蚀えば、ドキュメントの基本的な機胜ず䟋は非垞に単玔ですが、実際にはすべおがはるかに耇雑です。 それでは、始めたしょう。



読む前に、公匏のCodeIgniterドキュメントを読むこずを匷くお勧めしたす。 この蚘事では、少なくずもメむントピックず「 テンプレヌトパヌサヌクラス 」トピックを読み、これらの䟋を完了しおいるこずを前提ずしおいたす。

基本構成で最初に非垞に䞍䟿なのは、モゞュヌルを1぀のフォルダヌに結合するこずなく、コントロヌラヌ、モデル、およびマッピングを異なるフォルダヌに分離するこずです。 ぀たり たずえば、 ニュヌスを衚瀺する「 ニュヌス 」モゞュヌルを䜜成する堎合、モゞュヌルはコントロヌラヌ、モデル、ビュヌの 3぀の異なるフォルダヌに忍び蟌みたす 。 そしお、どのコントロヌラヌがどのモデルに属し、どの「ビュヌ」に属しおいるかは、すぐにはわかりたせん。 これは、そのようなモゞュヌルが1぀ある堎合に適しおいたす。 そしお、10を超える堎合、制埡が非垞に困難になりたす。



はい、ドキュメント内にあるように、フォルダヌコントロヌラヌ、モデル、ビュヌ内にサブフォルダヌ ニュヌス、メニュヌ、コメントなど を䜜成し、そこにコントロヌラヌ、モデル、ビュヌをドロップできたすが、ただ䞍䟿なようです。

modulesフォルダヌがあればもっず䟿利で、その䞭にNewsモゞュヌル、぀たり フォルダヌ、その䞭には既に3぀のフォルダヌカりンタヌ、モデル、ビュヌがありたす。 この機胜は、 CodeIgniterのHMVC拡匵機胜によっお提䟛されたす。 このリンクからむンストヌル手順をダりンロヌドしお読んでください 。



この拡匵機胜により、このモゞュヌルのみに関連する各モゞュヌル内にモデル、コントロヌラヌ、ビュヌを配眮できたす。 モデル、カりンタヌ、たたはビュヌのフォルダヌ内のこれらのモゞュヌル内にサブフォルダヌを䜜成するこずもできたす。これは、倚くのファむルがある倧芏暡なモゞュヌルに非垞に䟿利です。



さらに、これにより、異なるモゞュヌルから耇数のコントロヌラヌたたはモデルをロヌドし、䟿利な構造を構築できたすたたは、1぀のモデルから別のモゞュヌルのコントロヌラヌを起動するなど。

もちろん、私はこれで新しいものを発芋したせんでした。 したがっお、次に進みたす。

ベヌスCIでは、URLは次のように解析されたす。

example.com/ クラス/関数/ ID



぀たり 最初のセグメントは呌び出されたコントロヌラヌクラス、2番目はその䞭の関数、3番目は関数に枡されるパラメヌタヌ4番目ず5番目の堎合がありたすです。 正盎なずころ、䞭芏暡のプロゞェクトであっおも、これは非垞に䞍䟿なので、URLを凊理するための独自のロゞックを構築するこずにしたした。 これを行うには、application / configフォルダヌ内のroutes.phpファむルを線集しお曞き蟌みたす。

$route['default_controller'] = "main"; $route[':any'] = "main";
      
      





これは、いずれの堎合でも、メむンコントロヌラヌが読み蟌たれ、 index関数が起動されるこずを瀺しおいたす。 次に、 application / controllersフォルダヌにファむルを䜜成し、「 main.php 」ず呌びたす。 HMVC拡匵機胜をむンストヌルしたこずを忘れないでください。コントロヌラヌはCI_Controllerからではなく、 MX_Controllerから継承したす。 このコントロヌラヌがメむンコントロヌラヌになり、すべおがコントロヌラヌを通過したす。 同時に、非垞にシンプルで、制埡を他のモゞュヌルに単玔に転送したす。 これは、 index関数が私にずっおどのように芋えるかです

 function index() { session_start(); //   ,   CI  $this->check_lang(); //     $this->check_module(); //     $this->tp->load_tpl($this->tp->tpl); //       $this->tp->print_page(); //        }
      
      





tpクラスの最埌の2行はただ倉曎されおいたせん。 Basic CIはPHPセッションを䜿甚したせんが、代わりにCookieにデヌタを保存したすCookieで動䜜したすが、セッションラむブラリを呌び出すこずで新芏参入者を混乱に陥れたす。 それにもかかわらず、私はネむティブのPHPセッションを䜿甚するこずにしたしたが、Cookieを扱うためにCIが提䟛する機胜を完党に攟棄したせんでした私はこれずそれの䞡方を䜿甚したす。



そのため、私が最初に行うこずは、蚀語をチェックするこずです私のプロゞェクトは倚くの堎合倚蚀語です。

  function check_lang() { if ($s=$this->uri->segment(1)) { switch ($s) { case 'ru': define('LANG','ru'); break; case 'en': define('LANG','en'); $this->config->set_item('language', 'english'); break; default: show_404('page'); } } else { define('LANG','ru'); } }
      
      





URLの最初のセグメントが蚀語を担圓するこずがわかりたす。 ファむルapplication / config / config.phpで以䞋を指定したす。

 $config['language'] = 'russian';
      
      





コントロヌラヌから構成蚀語を倉曎するには、これを䜿甚したす

 $this->config->set_item('language', 'english');
      
      





倚蚀語を䜿甚しおいない堎合は、これをスキップしおください。



check_module関数は、URLの2番目のセグメントたたは倚蚀語を䜿甚しない堎合は最初のセグメントが有効なモゞュヌルであるかどうかを確認する必芁がありたす。 たずえば、次のように、コンストラクタで蚱可されるモゞュヌルを事前に芏定したす。

  function __construct() { $this->modules=array('auth','cabinet','ads','root'); //   }
      
      





次に、関数でチェックしたす

  function check_module() { if ($m=$this->uri->segment(2)) { if (in_array($m,$this->modules)) { $this->common->load_module($m); $this->tp->tpl=$this->$m->tpl; } else { show_404('page'); } } else { $this->load_main_page(); //    ,     } }
      
      





したがっお、2番目のセグメントが空の堎合、メむンペヌゞがロヌドされたす。 URLに有効なモゞュヌルがある堎合、ロヌドされ、そうでない堎合は404にスロヌされたす。次に、 application / modelsフォルダヌに2぀のtp.phpおよびcommon.php モデルを䜜成したす。 /autoload.php 

 $autoload['model'] = array('tp','common');
      
      





「 tp 」では、非垞に匱いネむティブの機胜を拡匵しお、単玔なテンプレヌト゚ンゞンの操䜜のための機胜を説明したす。 「 common 」には、頻繁に䜿甚される他のすべおの関数を蚘述したす。

したがっお、 $ this-> common-> load_module$ mは$ mモゞュヌルURLの2番目のセグメントずその䞭のindex関数をロヌドしたす。 ここではすべおが簡単です

  function load_module($module) { if (is_dir('application/modules/'.$module)) // ,    { $this->load->module($module); $this->$module->index(); } }
      
      





URLからロヌドされる各モゞュヌルは、ペヌゞ党䜓に䜕らかのテンプレヌトを䜿甚する必芁がありたす。たずえば、

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>{page_title}</title> <link rel="stylesheet" type="text/css" href="{SITEURL}/css/main.css"> </head> <body> <div class="page"> {HEADER} <div class="content"> <div class="page_title"> {title_of_page} </div> <div class="needwidth"> <div class="rightside"> {LOOKED_ADS} </div> <div class="sam_kontent"> {MSG} {CONTENT} </div> <div class="clear"></div> </div> </div> {FOOTER} </div> </body> </html>
      
      





ペヌゞ党䜓のメむンテンプレヌトは、 application / views / templatesフォルダヌに䜜成されたす テンプレヌトフォルダヌは手動で䜜成されたす。 異なるモゞュヌルで同じテンプレヌトを䜿甚できたす。

モゞュヌルコントロヌラフレヌムワヌク自䜓は次のようになりたす。

 class News extends MX_Controller { private $mname; public $tpl; function __construct() { $this->tpl='p_default.tpl'; //   $this->mname=strtolower(get_class());//   } public function index() { //    ,    .. $this->tp->parse('CONTENT', $this->mname.'/'.$this->mname.'.tpl'); } }
      
      





モゞュヌルNews では、コントロヌラヌ、モデル、ビュヌの 3぀のフォルダヌを䜜成したす 。 controllersフォルダヌで、 news.phpファむルを䜜成し、䞊蚘のコヌドをそこに蚘述したす。 index関数では、ロゞックを構築したす。 たずえば、ニュヌスモゞュヌルのモデルフォルダヌにあるnews_model.phpモデルをロヌドしたす。 すでにモデルで、デヌタベヌスを操䜜するための関数たたはこのモゞュヌルに関連する他の耇雑な関数に぀いお説明したす。



最終的に、ニュヌスモゞュヌルから取埗した結果党䜓がCONTENTラベルに曞き蟌たれ、テンプレヌト内でこの結果に眮き換えられたす。 これがどのように起こるかを理解するには、「テンプレヌト」のロゞックをどのように構築したかを䌝える必芁がありたす。

ベヌスパヌサヌの機胜を拡匵し、それを「人間の圢」にしたした。 基本的なものがどのように機胜するかわからない堎合は、たずそれをうたく凊理したす。



したがっお、 tpモデルを怜蚎しおください。



ここには2぀のパブリック倉数がありたす- $ D 、 $ tplです。 $ Dは、最終的にテンプレヌトの{LABEL}圢匏のすべおのラベルを$ this-> D ['LABEL']の内容でモゞュヌルで眮き換えたグロヌバル配列です。 $ tplはペヌゞ党䜓のメむンメむンテンプレヌトで、URLから各モゞュヌルに登録され、メむンメむンコントロヌラヌに枡されたす。ここで、 $ this-> tp-> load_tplが呌び出されたす$ this-> tp-> tpl 。



䞊蚘のparse関数を芋おきたした。 この関数には2぀のパラメヌタヌを枡す必芁がありたす。最初のパラメヌタヌは結果が保存されるラベルhtmlピヌス、2番目のパラメヌタヌはビュヌフォルダヌにあるhtmlピヌスです。 ただし、 parseは、このhtmlにラベルが存圚するかどうかを確認し、必芁に応じおそれらを解決したす。

  function parse($label, $tpl) { $TPL=$this->load->view($tpl, FALSE, TRUE); $pattern = '/{[A-Za-z0-9_]+}/'; //      preg_match_all($pattern, $TPL, $MODULES); //     foreach ($MODULES[0] as $MODULE) { $module=substr($MODULE,1,-1); if (!isset($this->D[$module])) $this->D[$module]=$this->lang->line($module); //    ,    langs } if (isset($this->D[$label])) { $this->D[$label].=$this->parser->parse($tpl, $this->D, TRUE); } else { $this->D[$label]=$this->parser->parse($tpl, $this->D, TRUE); } }
      
      





これらすべおから、 たずえば 、viewsフォルダヌ内のニュヌスモゞュヌル内にnews.tplファむルを䜜成し、そこに最も単玔なhtmlを曞き蟌む堎合、

 <h1>  !</h1>
      
      





次に、 example.com / ru/ newsを実行し、 main.phpメむンコントロヌラヌを起動したす 。これにより、コントロヌルがニュヌスモゞュヌルに転送され、 p_default.tplテンプレヌトが 䞊蚘のコヌドから ロヌドされたす。



次に、 ニュヌスモゞュヌルコントロヌラヌは{CONTENT}をアプリケヌション/モゞュヌル/ニュヌス/ビュヌ/news.tplファむルのコンテンツに眮き換え 、 p_default.tplテンプレヌトのコンテンツを衚瀺したす 。

しかし...これはただ理論的です。関数$ this-> tp-> load_tpl$ this-> tp-> tplおよび$ this-> tp-> print_pageに぀いお説明しおいないためです。



load_tpl関数は、パラメヌタずしおテンプレヌトを取りたす。これはメむンのテンプレヌトです。 ペヌゞテンプレヌト党䜓 ビュヌ/テンプレヌトフォルダ内。 次に、このテンプレヌトは、モゞュヌルたたは単なる倉数タむトルや著䜜暩などである他のラベルをチェックしたす。

倧文字のラベルず数字のラベルはモゞュヌルで、小文字のラベルは単玔な倉数です。 ラベルの眮換が芋぀からない堎合、単玔に䞊曞き削陀されたす。 コヌド自䜓は次のずおりです。

  function load_tpl($tpl_name) { $TPL=$this->load->view('templates/'.$tpl_name, FALSE, TRUE); $pattern = '/{[A-Z0-9_]+}/'; $pattern2 = '/{[a-z_]+}/'; preg_match_all($pattern, $TPL, $MODULES); //   preg_match_all($pattern2, $TPL, $VALUES); //   foreach ($MODULES[0] as $MODULE) { $module=substr($MODULE,1,-1); if (!isset($this->D[$module])) { $this->D[$module]=''; $this->common->load_module(strtolower($module)); } } foreach ($VALUES[0] as $VALUE) { $value=substr($VALUE,1,-1); if (!isset($this->D[$value])) { $this->D[$value]=''; } } $this->D['TPL']=$tpl_name; }
      
      





メむンコントロヌラヌmainの最埌で、 print_page関数が実行され、画面に詳现なテンプレヌトが衚瀺されたす。

  function print_page() { $this->parser->parse('templates/'.$this->D['TPL'], $this->D); }
      
      







䞊蚘のすべおにおいお、私は可胜な限り単玔化しようずしたした。 実際、私にずっおはすべおがはるかに耇雑で拡匵されおいたすが、あなたは自分でそれを行うこずができたすこれでも最埌たで読んでいないかもしれないからです。 「 tp 」モデルには、テンプレヌト゚ンゞン甚のあらゆる皮類の関数がただありたす。たずえば、

  function clear($label) { $this->D[$label]=''; } function kill($label) { unset($this->D[$label]); } function assign($label, $value='') { if (is_array($label)) { foreach ($label as $l=>$v) { $this->D[$l]=$v; } } else $this->D[$label]=$value; }
      
      





ロゞックを理解するのは簡単です。 たずえば、 $ this-> tp-> assign 'page_title'、 'Home page'を䜿甚するず、テンプレヌトの{page_title}を「Home page」に眮き換えるこずができたす。



テンプレヌトの䞭には、最新のニュヌスやメニュヌなど、䜕かを衚瀺できるモゞュヌルもありたす。 テンプレヌトでは、{MENU}や{HEADER}などの括匧内に挿入されたす。 parse関数は、そのようなラベルに遭遇するず、このラベルがモゞュヌルであるかどうかを確認し、そうであれば、このモゞュヌルが生成するもので眮き換えたす。 このようなモゞュヌルもモゞュヌルフォルダヌ内にあり、独自のMVCを持っおいたす。

たずえば、 ヘッダヌモゞュヌルのメむンコントロヌラヌは次のようになりたす。

 class Header extends MX_Controller { public $mname, $tag; function __construct() { $this->mname=strtolower(get_class());//   $this->tag=strtoupper($this->mname); // «»   } public function index() { $this->load->model($this->mname.'/'.$this->mname.'_model'); $model=$this->mname.'_model'; $this->$model->index($this->mname); $this->tp->parse($this->tag, $this->mname.'/'.$this->mname.'.tpl'); } }
      
      





最埌の関数$ this-> tp-> parse$ this-> tag、$ this-> mname。 '/'。$ This-> mname。 '。Tpl'は、{HEADER}をモゞュヌル/ヘッダヌ/ビュヌファむルの内容に眮き換えたす/header.tpl



モゞュヌルは垞に最初に動䜜し、URLからロヌドされ、メむンのモゞュヌルであるこずに泚意する必芁がありたす。その埌、テンプレヌトがロヌドされ、その䞭のすべおのモゞュヌルでparseが動䜜したす。

明確にするために、䞊蚘のすべおが写真に描かれおいたす。







私は原始的なグラフィックスをおaびしたす。私はただプログラマヌであり、デザむナヌではありたせん。



これをすべお手䜜業で曞くのが面倒な堎合は、CodeIgniterを少し修正しおダりンロヌドし、さらに掘り䞋げるこずができたす䞋のリンク。 私は自分の機胜、モゞュヌル、モデル、その他すべおを具䜓的に切り取り、蚘事に蚘茉されおいるものだけに限定し、他のすべおに気を取られないように自分で機胜を拡匵しようずしおいたす。



もちろん、远加するこずはただたくさんありたしたが、この蚘事は非垞に長いものでした。



専門家の批刀を聞いおうれしいです。



私の修正されたCodeIgniterはここからダりンロヌドできたす 。



2011幎10月15日曎新

github.comに登録し、リポゞトリに远加したした。 私はすべおを正しくしたず思いたす。 リンクはこちらですhttps://github.com/IbrahimKZ/codeigniter



All Articles