【问题标题】:Calling private function from laravel controller从 laravel 控制器调用私有函数
【发布时间】:2014-04-19 16:55:11
【问题描述】:

我正在尝试将一些代码提取到控制器内的私有函数中,以便稍微整理一下,但该函数似乎没有运行。

路线:

Route::resource('posts', 'PostsController');

当我得到以下网址时:

/posts?page=2&posts_per_page=3&published=0

它忽略了 page 和 posts_per_page 变量(即它只返回前 10 个未发布的结果)但是当我在 index 方法中使用此代码时,它起作用了。

public function index()
{

    // set defaults for page number and posts per page
    $page = 1;
    $postsPerPage = 10;
    $published = 1;

    $this->getPagesAndPostsPerPage($page, $postsPerPage);

    // Get published or not
    // Not published = 0
    // Published = 1

    if ( Input::has('published') )
    {
        $published = Input::get('published');
    }

    // return paginated results
    $skip = ($page - 1) * $postsPerPage;
    $posts = Post::where('published', '=', $published)
                        ->orderBy('published_date', 'desc')
                        ->skip($skip)
                        ->take($postsPerPage)
                        ->get();

    return Response::json([
        'data' => $this->transformCollection($posts)
    ], 200);
}

// Get pages and posts per page
private function getPagesAndPostsPerPage($page, $postsPerPage)
{

    // if posts per page and page are defined
    if ( Input::has('posts_per_page') && Input::has('page') )
    {
        // get inputs
        $postsPerPage = Input::get('posts_per_page');
        $page = Input::get('page');
    }

    // else if just page is defined
    elseif ( Input::has('page') ) 
    {
        $page = Input::get('page');
    }
}

谁能看出我做错了什么?

【问题讨论】:

  • 我只能说你假设私有方法的范围泄漏回调用范围。也就是说,您似乎假设在私有方法中设置 $page 会将其设置在索引方法中。它没有 - 您应该返回 $page 的值(如果您只关心一个变量)或在私有方法中设置一些类属性,如 $this->page = $page
  • 你是怎么得到这个网址的?在 routes.php 中发布获取帖子的路由
  • 值得我说的是这不是 Laravel 特有的。在 PHP(以及几乎所有其他具有函数和变量范围的编程语言)中定义的行为是函数内部的变量不会泄漏回其调用函数的范围。
  • 感谢各位的帮助。 @marcanuy,我已经添加了路线。

标签: php laravel laravel-4


【解决方案1】:

你没有从$this->getPagesAndPostsPerPage($page, $postsPerPage);返回任何东西

在函数内部定义的变量是函数特定的,这意味着如果您需要获取函数变量的更新值,则需要来回传递函数变量。要么,要么使用类变量(属性),以便您可以从代码中的任何位置访问更新的值。

你的控制器:

public function index()
{
    // set defaults for page number and posts per page
    $page = 1;
    $postsPerPage = 10;
    $published = 1;

    // Get the return value:
    $pagesAndPostsPerPage = $this->getPagesAndPostsPerPage($page, $postsPerPage);

你的getPagesandPostsPerPage() 函数:

private function getPagesAndPostsPerPage($page, $postsPerPage){
    //Grab pages and posts per page here

    //Create a new array and set the values
    $pagesAndPostsPerPage = array(
        'page' =>$page,
        'postsPerPage'=>$postsPerPage,
    );
    //Return the array
    return $pagesAndPostsPerPage;
}

如果您需要更多解释,请告诉我!我很乐意为您提供进一步的帮助。

编辑:

忘了提一下,如果您不想使用与号 (&) 运算符为函数提供返回值来修改它们,也可以将变量作为对函数的引用传递。

http://php.net/manual/en/language.references.pass.php

例子:

function addOne(&$number)
{
    $number++;

    // Notice no return statement
}

$number = 1;

addOne($number);

echo $number; // Returns 2

【讨论】:

    猜你喜欢
    • 2012-11-20
    • 1970-01-01
    • 2017-07-25
    • 2014-05-06
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    相关资源
    最近更新 更多