更新:別のアプローチを使用して同じ結果を達成できる場合は、教えてください。
プロジェクトのビルド中にlaravel 3を使用/学習しています。ページ コンテンツをコーディングする前に、すべてを計画どおりに展開できるかどうかを確認しています。このプロジェクトは、使用する技術が大幅に古くなっているかなり巨大なアプリを実際に書き直したものだからです。
私はこの最後の部分で苦労しています。これは、おそらくプロジェクトをセットアップするために直面する最も困難な課題です。
URL:
site.com/shops/__identifier__/controller/action/params
上記は、私が atm をコーディングしようとしている uri です。_identifier_の部分がモデルになるはずです(雄弁ベース)
ショップは、ネストされたコントローラーのベースです
すなわち:
controllers/
- shops/
- home.php
- contact.php
- products.php
- etc ....
既存の各ウリショップ/識別子は、それ自体が実際のサイトです。(もちろん別のドメインがありますが) ネストされたすべてのショップ コントローラーに、どのショップで作業しているかを知らせたいと思います。実際、識別子は、正しいレイアウトのロード、正しい画像のレンダリング、連絡先の詳細などに使用されます...私が読んだことから、IoC機能を使用してショップの依存関係を注入する必要があります-コントローラーのコンストラクターにモデル化します。
これは私が持っているものです:
ファイル: application/start.php
/**
* Register IoC container for my nested shop controllers
*/
IoC::register('controller: shop', function($controller, $identifier)
{
//also tried using same line without the \\
$class = '\\Shops_' . ucfirst($controller) . '_Controller';
return new $class($identifier);
});
ファイル: application/routes.php
/**
* Register all shop routes
*/
Route::any('/shops/(:any)/(:any?)/(:any?)', function($identifier, $controller = "home", $method = "index", $params = array()){
if($controller === "index")
$controller = "home";
$controller = IoC::resolve('controller: shop', array($controller, $identifier));
return $controller;
});
application/libraries/controllers/shop.php にあるshop base-controller
<?php
namespace Controllers;
use Base_Controller;
/**
* Shop controller
*/
class Shop extends Base_Controller
{
public function __construct($identifier){
/**
* @todo: load the shop model using the identifier
* possibly move this after the parent::__construct()
*/
parent::__construct();
}
}
ファイル: applications/controllers/shops/home.php
<?php
/**
* @heads up: Shop_Controller is aliased in application/config/application.php
*/
class Shops_Home_Controller extends Shop_Controller
{
public function get_index(){
return ('test');
}
}
問題:
- これらのネストされたショップコントローラーのルートを定義するとき。リクエストを解決するためにlaravelが使用するコントローラーを返すだけですか、それともルート定義のコールバック関数で自分でアクションをトリガーしますか?
- コントローラーは自動ロードされません (上記の実装を試すとき)、まだ私はそれらのコントローラーに正しい規則を使用しています (何かが欠けていない限り:-) )。これはIoCを使用しているためだと思いますが、これをきれいに実装するにはどうすればよいですか、それとも私の間違いは何ですか?
- 正しいアクションをトリガーするにはどうすればよいですか? ネストされたコントローラーも RESTFUL コントローラーであるため、予想どおり、対応する HTTP 動詞アクションをトリガーする必要があります。
- 物事を可能な限りクリーンに保つための追加の質問: IoC 機能を使用しない場合、'index' はデフォルトでホーム コントローラーになります。この機能を模倣する私のソリューション (routes.php の if-condition) はクリーンなものですか? または、より良いアプローチがありますか?
ぜひ:
私のアプローチがかなり外れている場合は、教えてください。私はlaravelの初心者であり、使用している最初のフレームワークであるため、フレームワーク全般の初心者です。
また、私の質問が十分に説明されていない場合はお詫び申し上げますので、お気軽に追加情報をお尋ねください。
この問題をグーグルで検索するために最善を尽くしましたが、他のすべてのlaravelの問題はグーグルを使用して簡単に解決できたため、これは初めてのことです。
時間を割いてこれを読んでくれた人に感謝し、正しい方向に私を送ってください!