【问题标题】:Routing nested controllers using IoC for dependency injection in laravel 3在 laravel 3 中使用 IoC 路由嵌套控制器进行依赖注入
【发布时间】:2013-03-28 00:42:13
【问题描述】:

更新:如果我可以使用不同的方法达到相同的结果,请赐教。

我在构建项目时正在使用/学习 laravel 3。在对任何页面内容进行编码之前,我正在验证我是否可以按计划部署所有内容,因为这个项目是对一个相当大的应用程序的实际重写,它使用的技术已经严重过时。

我在最后一部分苦苦挣扎,这很可能是我在设置项目时将面临的最艰巨的挑战。

网址:

site.com/shops/__identifier__/controller/action/params

以上是我正在尝试对 atm 进行编码的 uri。 _identifier_ 部分应该成为模型(基于 eloquent)

商店是嵌套控制器的基础

即:

controllers/
  - shops/
      - home.php
      - contact.php
      - products.php
      - etc ....

每个现有的 uri 商店/标识符 本身就是一个真实的站点。 (虽然它有不同的域offcourse) 我希望我所有的嵌套商店控制器都知道他们正在与哪个商店合作。事实上,标识符将用于加载正确的布局、渲染正确的图像、联系方式等...... 根据我的阅读,我需要使用 IoC 功能将 shop-model 的依赖项注入到控制器的构造函数中。

这是我的自动取款机:

文件: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;
});

shop base-controller 位于 application/libraries/controllers/shop.php

<?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,我该如何干净利落地实现它或者我的错误是什么?
  • 如何触发正确的动作?正如预期的那样,它应该会触发相应的 HTTP 动词操作,因为我的嵌套控制器也是 RESTFUL 控制器。
  • 额外的问题,以保持尽可能干净:不使用 IoC 功能时,“索引”默认为家庭控制器。我的解决方案(routes.php 中的 if 条件)模仿这个功能是一个干净的解决方案吗?还是有更好的方法?

无论如何:

  • 如果我的方法有问题,请告诉我,我是 laravel 的新手,它是我使用的第一个框架,所以我一般是框架的新手。

  • 如果我的问题没有得到很好的解释,我也很抱歉,请随时询问更多信息。

  • 我尽力在谷歌上搜索这个问题,但找不到类似的东西,这是第一次,因为我所有其他 laravel 问题都可以使用谷歌轻松解决。

我非常感谢花时间阅读本文的任何人,甚至更好地向我发送正确的方向!

【问题讨论】:

    标签: dependency-injection routing controller inversion-of-control laravel-3


    【解决方案1】:

    好的,最终解决方案,如果您问我,这远非干净,但它似乎有效,至少就我检查过的而言。

    我也不确定是否有替代方案,但由于缺乏响应和时间压力,我决定继续这样做并保持手指交叉:(。

    //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');
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      • 2019-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多