2016-03-18 9 views
3

Silexを使用してREST APIを作成しようとしています。それは素晴らしい作業ですが、今私は、セッション変数を使用してユーザーを追跡したいと思っています。私は通常のPHPセッション変数とSessionServiceProviderを使用しようとしました。私の人生の間、セッション変数はページリクエストに対して永続的ではありません。私のテンポラリセッションフォルダを見ると、リクエストごとに新しいセッションが作成されているようです。AngularJSとPHPがリクエストごとに新しいセッションを作成します

私は$ appが初期化されているindex.phpファイルに多くのPHPファイルが含まれていますか?私はそれが何かと関係があるかどうかはわかりませんが、それは後続のコードが何をしているのかを理解するかもしれません。

のindex.php

<?php 

require_once 'vendor/autoload.php'; 

$config['displayErrorDetails'] = true; 

$app = new Silex\Application(); 
$app->register(new Silex\Provider\SessionServiceProvider, array('session.storage.save_path' => dirname(__DIR__) . '/tmp')); 

$app->before(function() use ($app){ 
    $app['session']->start(); 
}); 

require "../apiSource/classes/employees.php"; 
$app->run(); 

employees.php私の角度アプリのポストコールに '{URL} /従業員が/ログイン' セッション変数が設定されている

<?php 
use Symfony\Component\HttpFoundation\JsonResponse as JsonResponse; 
use Symfony\Component\HttpFoundation\Request as Request; 

class Employees 
{ 
    private $database; 

    function __construct() 
    { 
     $this->database = getDB(); 
    } 

    function loginEmployee($loginInfo, $app){ 

     //.... check loginInfo with database of employee ..../// 
     if ($isEmployee) { 

      $app['session']->set('userID', $employee['e_ID']); 
      return array('success' => 'success', 'e_ID' => $employee['e_ID'], 'session' => $app['session']->get('userID')); 
      //SUCCESS 
     } else { 

      return array('message' => 'Error.'); 

     } 

    } 

    function isLoggedIn($app){ 
     $stmt = $this->database->prepare("SELECT e_ID, e_Email FROM Employee WHERE e_ID = ?"); 
     $stmt->execute(array($app['session']->get('userID'))); 
     $employee = $stmt->fetch(PDO::FETCH_ASSOC); 

     if(empty($employee)){ 
      return array('Error' => $employee, 'Session' => $app['session']->get('userID')); 
     } 

     return $employee; 
    } 

    function logout($app){ 

     $app['session']->remove('userID'); 
     return array('success' => 'success'); 

    } 
} 


$app->get('/employees/logout', function() use ($app) { 
    $employees = new Employees(); 
    $results = $employees->logout($app); 

    return new JsonResponse($results); 
}); 

$app->get('/employees/status', function() use ($app) { 

    $employees = new Employees(); 
    $results = $employees->isLoggedIn($app); 

    return new JsonResponse($results); 

}); 

$app->post('/employees/login', function(Request $request) use ($app) { 

    $data = json_decode($request->getContent(), true); 
    $request->request->replace(is_array($data) ? $data : array()); 

    $employee = new Employees(); 
    $results = $employee->loginEmployee($data, $app); 

    return new JsonResponse($results); 
}); 

、それはリターンを行いますセッション['userID']。しかし、その直後に私が '{url}/employees/status'を呼び出してユーザーがログインしているかどうかを確認すると、セッション変数は空になります。セッション変数が保存されているtmpフォルダには、すべてのリクエストに対して作成された新しいファイルがあります。

私は間違っていますか?どんな助けもありがとう。

ありがとうございます!

EDIT

私は何が起こっているかを見るためにここに物事を単純化しようとしています。それは私の角度のあるページの投稿と私の意味を悪いものでなければなりません。

のindex.php

$app->get('/hello', function() use ($app){ 
    session_start(); 
    $num = $_SESSION['idea'] ? $_SESSION['idea'] : 1; 
    $_SESSION['idea'] = $num+1; 
    echoResponse(200, $_SESSION['idea']); 
}); 

私はちょうどそのページを訪問し、リフレッシュを打っておく場合は、私のセッション変数が働いていると、それは常に1で上がっています。したがって、セッション変数は動作しています。

は、しかし、私は私の角度アプリから、このページを呼び出すしようとすると:

$scope.hello = function(){ 
    $http.get('https://viromo.com/cubex/api/hello').then(function(results){ 
    console.log(results); 
    }) 
}; 

結果インクリメントアウトと同じ番号をバック掲示し続けます。なぜこれが起こっているのか分かりません。私はタイトルとタグを更新して、私の質問の目標をよりよく反映させました。

ありがとうございます!

+0

かもしれクッキーは –

+1

あなたはDEVを使用してPHPSESSIDを確認しました。..無効になっています。あなたのブラウザのツール?値はページ間で変化しますか? – mTorres

+1

ミドルウェアから$ app ['session'] - > start()を削除しようとしましたか?このhttp://silex.sensiolabs.org/doc/providers/session.htmlによると、必要ではないようです。 –

答えて

1

私の場合は、リクエストヘッダーにcookieを設定するために、角度で設定が欠落していたためです。

したがって、この documentationから

: 「デフォルトでは、クロスサイトのXMLHttpRequestや呼び出しを取得し、ブラウザは、資格情報を送信しない特定のフラグは、それが呼び出されたときにXMLHttpRequestオブジェクトまたは要求のコンストラクタで設定する必要があります。」あなたのバックエンドをホストするためにApacheを使用している場合、あなたはあなたの「を編集する必要があり

angular.module('app', ['your_dependencies...']) 
.config(function ($httpProvider) { 
    // Enabling the use of cookies in angular 
    $httpProvider.defaults.withCredentials = true; 
}); 

角度では、設定行を追加することによって行われます。以下の行を追加することによって、資格情報の使用を許可htaccessの:

# When using credentials flag, the wildcard '*' does not work, so you need to specify the site URL 
Header always set Access-Control-Allow-Origin http://<your_site_url> 
# Allowing credentials 
Header always set Access-Control-Allow-Credentials true 
関連する問題