0

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

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

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

网址:

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

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

商店是嵌套控制器的基础

IE:

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

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

这就是我的自动取款机:

文件:应用程序/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

<?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();
    }

}

文件:应用程序/控制器/商店/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-condition)模仿这个功能是一个干净的解决方案吗?还是有更好的方法?

无论如何:

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

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

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

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

4

1 回答 1

0

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

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

//开始.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 回答