2014-06-19 2 views
0

Je veux obtenir les résultats suivants:Laravel 4 liste et itinéraire détail

appareils> Contrôleur périphériques @

périphériques/{id}> Contrôleur périphériques de @

Est-ce possible avec Laravel? J'essaie de mapper une boîte domotique avec une application android ImperiHome, et ils s'attendent à ce que j'aie le même chemin pour la liste des appareils et pour toute action de l'appareil.

Jusqu'à présent, j'ai essayé ceci:

Route::get('devices/{deviceId}/action/{actionName}/{actionParam?}', '[email protected]'); 
Route::get('devices', '[email protected]'); 

Mais je ne peux pas récupérer l'argument lorsque j'appelle les dispositifs/url id

+0

Cela devrait fonctionner, comment essayez-vous de récupérer l'argument? Essayez d'inverser l'ordre des deux routes, quand j'ai fait quelque chose de similaire dans le passé, la route qui prend les arguments est toujours après la route qui ne le fait pas. – Jeemusu

+0

Ok, j'ai trouvé un moyen de le faire fonctionner, le problème était que je ne pouvais pas rediriger les deux routes vers la même méthode, donc j'ai simplement utilisé 2 méthodes (périphériques & device) – kitensei

+0

Vous pouvez rediriger plus d'un itinéraire vers une seule méthode. Si vous développez votre question, quelqu'un pourrait peut-être vous aider. Expliquer ce qui se passe lorsque vous tentez d'accéder à la route avec un ID serait un bon début, de même que l'envoi de votre méthode 'devices'. – Jeemusu

Répondre

0

Ok, donc pour résoudre l'erreur standard stricte php Je viens Splitted les routes à deux modes comme suit:

routes.php

Route::get('devices/{deviceId}/action/{actionName}/{actionParam?}', '[email protected]'); 
Route::get('devices', '[email protected]'); 
Route::get('rooms', '[email protected]'); 
//Route::get('action_ret', '[email protected]_ret'); 
Route::get('system', '[email protected]'); 
Route::get('/', '[email protected]'); 

DomoticzController.php

/** 
* Call for an action on the device identified by $deviceId. 
* @return string Json formated action status. 
*/ 
public function device($deviceId, $actionName, $actionParam = null) 
{ 
    $client = $this->getClient(); 
    $request = $client->getClient()->createRequest('GET', get_url("json.htm?type=command&param={$actionName}&idx={$deviceId}}&switchcmd=$actionParam")); 
    $response = $request->send(); 
    $input = $response->json(); 

    // convert to app format 
    $output = array('success' => ('OK' === $input['status'] ? true : false), 'errormsg' => ('ERR' === $input['status'] ? 'An error occured' : '')); 

    return Response::json($output); 
} 

/** 
* Retrieve the list of the available devices. 
* @return string Json formatted devices list. 
*/ 
public function devices() 
{ 
    $client = $this->getClient(); 
    $request = $client->getClient()->createRequest('GET', get_url('json.htm?type=devices&used=true')); 
    $response = $request->send(); 
    $input = $response->json(); 

    // convert to app format 
    $output = new stdClass(); 
    $output->devices = array(); 

    foreach ($input['result'] as $device) { 
     $output->devices[] = array (
      'id' => $device['idx'], 
      'name' => $device['Name'], 
      'type' => 'DevSwitch', 
      'room' => null, 
      'params' => array(), 
      ); 
    } 

    return Response::json($output); 
} 

peut-être il y a une meilleure façon de résoudre ce problème, je serais heureux de l'entendre.

0

Si vous laissez les deux routes utiliser la même action de contrôleur, vous devez rendre les paramètres facultatifs dans le contrôleur, je pense.

Essayez ceci public function device($deviceId = null, $actionName = null, $actionParam = null) et voyez si vous obtenez toujours l'erreur PHP stricte.

Vous ne pouvez pas rediriger une route sans paramètres vers une action du contrôleur qui attend des paramètres. Vous pouvez, en revanche, faire en sorte qu'une route avec des paramètres soit redirigée vers une action du contrôleur avec des paramètres optionnels (cela ne signifie pas que vos paramètres de route doivent être optionnels).

+0

oui c'est ça Je pensais, mais j'ai plutôt 2 méthodes car la 2ème doit avoir les 2 premiers arguments, et avec votre exemple je pourrais facilement l'appeler sans aucun argument – kitensei