了解Laravel 5中命名空间的严重问题

时间:2015-06-30 06:20:48

标签: laravel namespaces laravel-5

我在理解命名空间时遇到了问题。它只是感觉非常愚蠢,对于我想要包含的每个Facade或帮助器,我需要将它包含在控制器文件中。

所以,说我有我的控制器的这个部分:

<?php namespace App\Http\Controllers;

use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\Auction;
use App\Bid;
use App\BidBuy;
use App\Http;
use Redirect;
use Session;
use Illuminate\Http\Request;
use Omnipay\Omnipay;

class PayPalController extends Controller {

    private $data;

    public function getPayment()
    {
        redirectIfNotLoggedIn();
    }

redirectIfNotLoggedIn();行是我要调用的函数,存储在App / Http / helpers.php中

这是文件:helpers.php

<?php namespace App\Http;

class HelperFunctions {
    // Filter for guest only pages
    public function redirectIfLoggedIn() {
        if (Session::has('steamid')) {
            return Redirect::to('/');
        } else {
            return false;
        }
    }

    // Filter for logged users only pages
    public function redirectIfNotLoggedIn() {
        if (Session::has('steamid')) {
            return true;
        } else {
            return Redirect::to('/');
        }
    }
}

回到我已经包含的控制器:use App\Http;

当我打电话给那个功能时,我得到了这个:

FatalErrorException in PayPalController.php line 20:
Call to undefined function App\Http\Controllers\redirectIfNotLoggedIn()

修改

现在我:HelperFunctions.php位于App/Helpers/HelperFunctions.php

<?php namespace App\Helpers;

use Session;
use Redirect;

// Filter for guest only pages
function redirectIfLoggedIn() {
    if (Session::has('steamid')) {
        return Redirect::to('/');
    } else {
        return false;
    }
}

// Filter for logged users only pages
function redirectIfNotLoggedIn() {
    if (Session::has('steamid')) {
        return true;
    } else {
        return Redirect::to('/');
    }
}

摘录composer.json

"autoload": {
    "classmap": [
        "database"
    ],
    "psr-4": {
        "App\\": "app/"
    },
    "psr-0": {
        "Ignited\\LaravelOmnipay": "src/"
    },
    "files": [
        "app/Helpers/HelperFunctions.php"
    ]
},

这是我的控制者:

<?php namespace App\Http\Controllers;

//use App\Helpers\HelperFunctions;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\Auction;
use App\Bid;
use App\BidBuy;
use Redirect;
use Session;
use Illuminate\Http\Request;
use Omnipay\Omnipay;

class PayPalController extends Controller {

    private $data;

    public function getPayment(\App\Helpers\HelperFunctions $helper)
    {
        $helper->redirectIfNotLoggedIn();
    }

.. rest of the controller code here ..
}

2 个答案:

答案 0 :(得分:0)

不要使用助手。在这样做的过程中,你几乎违反了与OOP相关的所有内容。

相反,请使用Middleware

在您的控制器中,只需要auth中间件:

public function __construct()
{
    $this->middleware("auth");
}

您正在尝试解决已解决的问题。如果在执行路由/控制器方法之前需要执行某些操作,则应使用中间件(Laravel 5替换路由过滤器)。

然而,您可能必须自定义自己的中间件,然后将其添加到app/Http/Kernel.php中的中间件阵列。只需使用php artisan make:middleware CustomAuthMiddleware

答案 1 :(得分:-1)

您可以在控制器中通过方法注入使用HelperFunctions。像这样:

public function getPayment(\App\Http\HelperFunctions $helper)
{
    $helper->redirectIfNotLoggedIn();
}

没有经过测试。