如何从视图中调用控制器 - Laravel

时间:2014-03-03 16:21:07

标签: laravel

我有一个列出时间表的视图。

在该视图上,每个时间表都有一个可交付的字段......我有一个DeliverableController,它有一个动作“DropdownList”,它调用模型并获取可交付成果列表并将它们推送到可交付的视图(它只是创建一个下拉框)。

当我遍历我的时间表时,我想得到DeliverableController / DropdownList的响应,并把它放在我的可交付字段应该在时间表上。

  • A)是否有办法从视图中获取控制器的响应
  • B)有没有办法从控制器方法中获取控制器的响应,以便我可以将结果推送到视图?

到目前为止我的代码是:

DeliverableController:

class DeliverableController extends BaseController {   
    private $deliverableRepository;

    function __Construct( IDeliverableRepository $deliverableRepo )
    {
        $this->deliverableRepository = $deliverableRepo;
    }

    ...

    public /*  */ function DropdownList()
    {        
        $deliverables = $this->deliverableRepository->Deliverables(); 
        return View::make( 'Deliverable/_DropdownList', array( "Model" => $deliverables ) );
    }
}

Deliverables / _DropdownList查看:

<?php
    foreach( $Model as $item )
    {
?>
    <select name="">
        <option value = "<?php echo $item->ID; ?>"><?php echo $item->Title; ?></option>
    </select>    
<?php
    }
?>

时间表控制器:

class TimesheetController extends BaseController {      
    private $timesheetRepository;

    function __Construct( ITimesheetRepository $timesheetRepo )
    {
        $this->timesheetRepository = $timesheetRepo;
    }

    ...

    // [HttpGET]
    public /*  */ function GetCreate()
    {       
        return View::make( 'Timesheet/Create' );
    }   

    // [HttpPOST]
    public /*  */ function PostCreate()
    { 
        // To do
    }    
}

时间表/创建

@extends( 'layout' )

@section( 'Styles' )
    <link href="<?php echo Request::root(); ?>/Styles/Timesheet.css" rel="stylesheet">
@stop

@section( 'Title' )
    Create timesheets
@stop

@section( 'Content' )

<form role="form">
    <table id="TimesheetTable" class="table">
        <thead>
            <tr>
                <th>Project/Deliverable</th>
                ...                
            </tr>
        </thead>
        <tfoot>
            <tr>
                <td></td>
                ...
            </tr>
        </tfoot>
        <tbody>
            <?php
                for( $a = 0; $a < 18; $a++ )
                {
            ?>
                    <tr id='row<?php echo $a; ?>'>
                        <td><?php /* Get response from DeliverableController/DropdownList */ ?></td>...                    
                    </tr>
            <?php
                }
            ?>
        </tbody>
    </table>
@stop

@section( 'Scripts' )
    <script src="<?php echo Request::root(); ?>/Scripts/Timesheet.js"></script>
@stop

请注意来自DeliverableController / DropdownList的 / * Get响应* /

3 个答案:

答案 0 :(得分:9)

如果您想从视图中调用控制器,则可以使用IOC容器

    App::make(//ControllerName)->//methodName(//parameters);

示例:

    App::make("UserController")->displayUsers(array('page_id' => 55));

答案 1 :(得分:1)

这远非理想,但控制器是一个类,任何其他类,所以你可能能够:

with(new UsersController)->doWhatever();

但是如果你需要做类似的事情看起来你的控制器并没有真正遵循一些设计模式而且它们可能有太多的责任,只是为了争取一些:

1 - 控制器不应该对您的业务逻辑了解多少。控制器应该收到一个请求,将它们发送给模型(或存储库)处理过的数据,并将这些数据提供给视图,或者只是将用户重定向到另一个路径。

2 - 控制器不应该由路由器本身以外的任何其他代码调用。

3 - 视图不应该知道您的类和处理事物,它们应该从控制器接收数据(已经处理过)并显示它们。

4 - 一个人应该负责做一个人的单一责任原则。如果您从视图中调用控制器,则您的视图负责显示和处理,并且您的控制器负责正常类(或模型或存储库)以及控制器。

正如你所说的那样,这份名单可以继续......

Laravel开发人员基本上会告诉你的事情:

1 - 创建一个几乎不执行任何操作的控制器:

class WhateverController extends Controller {

    private $repository;

    public function __construct(RepositoryInterface $repository)
    {
        $this->repository = $repository;
    }

    public function whatever()
    {
        $data = $this->repository->processData(Input::all());

        return View::make('your.view')->with(compact($data));
    }

}

2 - 您需要做的一切就是在您的视图中为您的视图生成数据。您可以在存储库中实例化(或注入)其他类来执行您需要执行的操作:

class Repository implements RepositoryInterface {

    public function processData($input)
    {
        $dataProcessor = new DataProcessor;

        return $dataProcessor->process($data);
    }

}

答案 2 :(得分:0)

我认为最好创建Class Aliases

打开app/config/app.php

在数组aliases

上添加字段

示例:

UserSession => App\Libraries\UserSession

您只需在视图中调用

即可

示例:

UserSession::getData()