【发布时间】: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