【问题标题】:(Laravel) How to use 2 controllers in 1 route?(Laravel)如何在 1 条路线中使用 2 个控制器?
【发布时间】:2014-11-23 09:06:38
【问题描述】:

如何在 1 个路由中使用 2 个控制器?

这里的目标是创建多个页面,每个页面都有 1 个职业(例如:会计师),然后将它们链接到提供会计课程的学校。

示例页面包括:
1. 会计师职业信息(我在这里使用“职业”控制器)
2. 提供会计课程的学校(我在这里使用单独的“学校”控制器)。

Route::get('/accountants-career', 'CareerController@accountants');
Route::get('/accountants-career', 'SchoolsController@kaplan');

使用上面的代码将覆盖控制器中的 1 个。

有没有办法解决这个问题?

【问题讨论】:

    标签: php laravel laravel-4 laravel-routing


    【解决方案1】:

    你不能这样做,因为这不是一件好事,而且 Laravel 不会让你有相同的路由来执行两个不同的控制器操作,除非你使用不同的 HTTP 方法(POST、GET.. .)。 Controller 是一个 HTTP 请求处理程序,而不是一个服务类,所以你可能需要稍微改变你的设计,这是一种方法:

    如果您将在一页中显示所有数据,请创建一个路由器:

    Route::get('/career', 'CareerController@index');
    

    创建一个瘦控制器,仅用于获取信息并传递给您的视图:

    use View;
    
    class CareerController extends Controller {
    
        private $repository;
    
        public function __construct(DataRepository $repository)
        {
            $this->repository = $repository;
        }
    
        public function index(DataRepository $repository)
        {
            return View::make('career.index')->with('data', $this-repository->getData());
        }
    
    }
    

    并创建一个DataRepository类,负责知道在需要那种数据的情况下该怎么做:

    class DataRepository {
    
        public getData()
        {
            $data = array();
    
            $data['accountant'] = Accountant::all();
    
            $data['schools'] = School::all();
    
            return $data;
        }
    
    }
    

    请注意,此存储库会自动注入到您的控制器中,Laravel 会为您完成。

    【讨论】:

    • 我见过的最好的依赖注入示例之一。
    【解决方案2】:

    是否有特定原因需要使用相同的路由名称? 目前,当 laravel 处理它们时,您无法将路由区分开来。

    为什么不这样;

    Route::get('/accountants/career', 'CareerController@accountants');
    Route::get('/accountants/schools', 'SchoolsController@kaplan');
    

    如果您有多个职业选择相同的控制器和基于其价值的方法,您也可以这样做。 这使您可以单独调用每个已批准的值,而不必为每个值设置单独的路由和控制器方法。

    Route::get('/{careerName}/career', 'CareerController@all');
    Route::get('/{careerName}/schools', 'SchoolsController@kaplan');
    

    【讨论】:

    • 这里的目标是在 1 个页面中使用 2 个控制器。这里的原因是我们希望将 {career} 和 {schools} 放在 1 页以下。将它们分成 2 个不同的页面将无法达到目的。
    猜你喜欢
    • 2021-09-14
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 2018-11-26
    • 2015-01-23
    • 1970-01-01
    相关资源
    最近更新 更多