バックグラウンド:
CodeIgniterにHMVCプラグインを使用していますが、この質問は一般的にMVCで発生する可能性があります。
質問:
$routes
特定のコントローラー/モジュールを呼び出すためにURLレイアウトを一致させるために使用する必要がありますか、それとも__remap()
URLシリーズの次の「モジュール」を呼び出すために各コントローラーで関数を作成する必要がありますか?
これらの方法のいずれかを正常に実装できますが、明確な勝者は実際には見当たりません。ある方法を別の方法よりも使用する理由を探しています(両方の組み合わせがより適切でない限り)。
また、構文に関するヘルプは探していません。以下に小さなエラーがある場合は、無視してかまいません。MVC(HMVC)のベストプラクティスを自分のサイトに適用する方法を探しています。
訪問者が遭遇する可能性のあるURL:
私のアプリケーションで次のURLが見つかる可能性があると仮定します。
Main Site:
http://www.example.com
Individual Static Pages:
.../staticPage1
.../staticPage2
Profession Sections:
.../profession1
.../profession2
Users Section (Unique to each profession):
.../profession#/users
.../users/id
.../users/dashboard
.../users/edit
.../users/preferences
Events Section (Unique to each profession):
.../profession#/events
.../events/id
.../events/dates
.../events/location
.../events/create
Search Page (Unique to each profession):
.../profession#/search
前述のURLセグメントに対応するコントローラー:
および対応するコントローラー:
- サイト
- ページ
- 職業(特定の職業番号として拡張)
- ユーザー
- イベント
- 探す
コントローラのCodeIgniterディレクトリレイアウト:
それぞれが独自のモジュールとして機能し、そのように保存されます。
/applications
/modules
/site/
/pages/
/professions/
/users/
/events/
/search/
各モジュールには、、、models
およびviews
サブcontrollers
ディレクトリがあります。
$ routersの例:
これをすべて達成するためにルーターを使用する場合は、ファイルroutes
で定義した次のものを使用します。config
//Defaults
$route['default_controller'] = 'site';
$route['404_override'] = '';
//Users
$route['(?i)([a-z0-9_-]+)/users'] = 'users';
$route['(?i)([a-z0-9_-]+)/users/(:num)(/(:any))?'] = 'users/dashboard/$2';
$route['(?i)([a-z0-9_-]+)/users/(:any)'] = 'users/$2';
//Specific Sections
$route['(?i)([a-z0-9_-]+)/search'] = 'search/eventSearch';
//Events
$route['(?i)([a-z0-9_-]+)/events'] = 'events';
$route['(?i)([a-z0-9_-]+)/events/(:num)(/(:any))?'] = 'events/getById/$2';
$route['(?i)([a-z0-9_-]+)/events/(:any)'] = 'events/getByCategory/$2';
//Profession1
$route['(?i)profession1'] = 'profession1';
$route['(?i)profession1(/(:any)?)'] = 'profession1/$2';
//Profession2
$route['(?i)profession2'] = 'profession2';
$route['(?i)profession2(/(:any)?)'] = 'profession2/$2';
//Pages
$route['(?i)(:any)'] = "pages/index/$1";
職業の例__remap()
__remap()
それが最善のアプローチであることが判明した場合、私は各コントローラーで使用できる機能を開発しました。Professions
これは、コントローラー用のそのような関数の1つのサンプルです。
public function _remap( $method )
{
if( isset( $this->uri->segment(3) ) )
{
$method2 = $this->uri->segment(3);
} else {
$method2 = 'index';
}
if ($method == 'users')
{
$method2 = $this->uri->segment(3);
$this->load->module('users');
$this->users->$method2();
}
elseif ($method == 'events')
{
$method2 = $this->uri->segment(3);
$this->load->module('events');
$this->events->$method2();
}
elseif ($method == 'search')
{
$this->load->module('search');
$this->search->$method2();
}
else
{
$this->$method();
}
}
結論:
この問題を解決するために必要な追加情報がある場合は、お知らせください。提供します。