0

更新:別のアプローチを使用して同じ結果を達成できる場合は、教えてください。

プロジェクトのビルド中に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の問題はグーグルを使用して簡単に解決できたため、これは初めてのことです。

時間を割いてこれを読んでくれた人に感謝し、正しい方向に私を送ってください!

4

1 に答える 1

0

わかりました、最終的な解決策、あなたが私に尋ねると、これはきれいにはほど遠いですが、少なくとも私がチェックした限りではうまくいくようです.

また、代替案があるかどうかもわかりませんが、応答と時間のプレッシャーが不足しているため、これで行くことにし、指を交差させておくことにしました:(。

//start.php

IoC::register('controller: shop', function($id, $controllerName){
    //controller name is the name of the controller located in the shops map
    $class = "Shops_" . ucfirst($controllerName) . "_Controller";
    include(path('app') . 'controllers/shops/' . strtolower($controllerName) . '.php');
    return new $class($id);
});

//routes.php

Route::any("shops/(:any)/(:any?)/(:any?)/(:all?)", function($id, $controller = "index", $action = "index", $params = ""){
    if($controller === "index")
        $controller = "home";
    $params = explode('/', $params);
    $controller = IoC::resolve("controller: shop", array($id, $controller));
    $http_verb = Request::method();
        /**
         * Need to return this, and i now need to manually return every response in every action in every shop controller
         */
    return call_user_func_array(array($controller, $http_verb . '_' . $action), $params);
});

与えられた例

class Shops_Home_Controller extends Shop_Controller 
{

    public function get_index(){
        /**
         * this works when doing things the usual way, but will not return any output 
         * when working with nested dependency injection
         */
        $this->layout->nest('content', 'shops.index');
    }

    public function get_test(){
        /**
         * this needs to return layout object if it is to work with the nested dependency injection
         */
        $this->layout->nest('content', 'shops.index');
    }

}
于 2013-04-09T06:53:41.343 に答える