更新:如果我可以使用不同的方法达到相同的结果,请赐教。
我在构建项目时正在使用/学习 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 问题都可以使用谷歌轻松解决。
我会感谢任何花时间阅读本文的人,甚至更好地向我发送正确的方向!