Tengo una aplicación laravel que se implementa en mi servidor.

Estructura de archivo

server
│

└───blog-app
│    │   app
│    │   bootstrap 
│    │   ......
│
└───public_html
    │    blog
    │     │─── index.php
    │

Así es como se ve mi estructura. Hasta ahora todo parecía funcionar bien, sin embargo, ahora estaba tratando de hacer una llamada AJAX a la función de mi controlador, pero no funciona como debería.

Déjame explicarte con un ejemplo,

$.ajax({
     type:'POST',
     url:'{{route('blog.prefetchResults')}}',
     data:'_token = <?php echo csrf_token() ?>',
     success:function(data){
              $("#msg").html(data.msg);
           }
     });

Esta es mi llamada ajax que va a la ruta blog.prefetchResults que lo señala a un controlador que reside en BlogController. Sin embargo, cuando miro en la consola del navegador veo este tipo de error:

http://mysubdomain.com/blog/prefetchBlogController@prefetchResults 500 (Error interno del servidor)

Lo que puedo inferir de este error es que no me permite acceder a esos directorios cuando se realiza una solicitud del lado del cliente, esto me hace hacer una pregunta muy simple: ¿cómo se supone que debo hacer una solicitud AJAX usando laravel si puedo? t hacerlo de esta manera?

Actualización (ejemplo):

Error al cargar el recurso: el servidor respondió con un estado de 500 (Error interno del servidor)

test.blade.php

@extends('main')
<p>
This is an ajxax test
</p>
<button class="butt">
    click me
</button>
<script>
    $().ready(function(){
        $('butt').on('click',function(){
                $.ajax({
                 type:'GET',
                 url:'{{route('blog.test')}}',
                 success:function(data){
                          $("p").html("somthing");
                       }
                 });
        })
    });
</script>

Web.php

//Test controller
Route::get('blog/test'.'BlogController@test')->name('blog.test');

BlogController

 public function test(){
       return view('test.test')->withMessage('changed');
    }

Estructura de archivo

Estructura de archivo

 server
    │

    └───blog-app //Not accessible through client side languages 
    │    │   app->Http->Controllers/BlogController.php
    │    │   resources->views->test->test.blade.php
    │    │  routes->web.php->route defined here
    │
    └───public_html(www folder)// accessible to the client (www.mydomain.com)
        │    blog
        │     │─── index.php
        │

@Alejandro Responder

  • corrigió los problemas anteriores.
  • Perdón por app->Http->BlogController.php, es app->Http->Controllers/BlogController.php.

Nota:

  • El directorio public_html es el directorio raíz, que es el punto raíz de mi mydomain.com.

  • Por lo tanto, las otras carpetas como blog-app no son accesibles para los usuarios normales, solo se puede acceder a ellas desde los idiomas del lado del servidor.

Archivo de registro

[2017-01-08 19:23:01] local.ERROR: exception 'ErrorException' with message 
'Trying to get property of non-object' in 
/home/mydomainuser/blogapp/storage/framework/views/af6b0045a9d30a80c19dd552032d46b39ad1cc99.php:1



Next exception 'ErrorException' with message 
'Trying to get property of non-object (View: /home/foodq7y4/blogapp/resources/views/blog/single.blade.php)' in 
/home/mydomainuser/blogapp/storage/framework/views/af6b0045a9d30a80c19dd552032d46b39ad1cc99.php:1

.htaccess

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>

Single.blade.php

 @extends('main')

@section('title', '| Blog')

@section('content')


    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <h1>Blog</h1>
        </div>
    </div>

    @foreach ($posts as $post)
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <h2>{{ ucwords($post->title) }}</h2>
            <h5>Published: {{ date('M j, Y', strtotime($post->created_at)) }}</h5>

            <p>{{ substr(strip_tags($post->body), 0, 250) }}{{ strlen(strip_tags($post->body)) > 250 ? '...' : "" }}</p>

            <a href="{{ route('blog.single', $post->slug) }}" class="btn btn-sm btn-primary">Read More</a>
            <hr>
        </div>
    </div>
    @endforeach

    <div class="row">
        <div class="col-md-12">
            <div class="text-center">
                {!! $posts->links() !!}
            </div>
        </div>
    </div>


@endsection
1
BOTJr. 5 ene. 2017 a las 01:18

4 respuestas

La mejor respuesta

¿Has intentado acceder a la URL directamente con tu navegador? Dado que está recibiendo "500 (Error interno del servidor)", comenzaría inspeccionando los registros del servidor. Algunas cosas, sin embargo:

  • Deberías llamar a la clase de elemento: $('.butt'), pero supongo que lo tienes.

  • No necesita pasar el token csrf para una solicitud GET. A menos que desee hacer alguna validación / autorización propia. Para solicitudes POST, Laravel verificará el token. Puede enviarlo en los encabezados HTTP con una opción ajax headers: {'X-CSRF-TOKEN': '{{ csrf_token() }}'}.

  • Si desea enviar los datos como una cadena simple, elimine los espacios: data:'_token=<?php echo csrf_token() ?>', de lo contrario, el campo se configurará como _token_.

  • Sin embargo, creo que es mejor establecer los datos de la solicitud como un objeto JS: {'_token': '{{ csrf_token() }}'}

  • Dijiste que tu estructura de archivos tiene app->Http->BlogController.php. Por defecto, Laravel espera que los controladores estén en el directorio app/Http/Controllers.

  • Parece que el controlador devuelve una cadena html, por lo que data.msg probablemente devuelve undefined. En cambio, data es la cadena html.

Intente arreglar estas cosas, luego comente o edite con seguimiento.


Actualizar: De los registros del servidor descubrimos que el problema estaba en views/blog/single.blade.php. Ya descubriste que era $posts->links y aparentemente las publicaciones no eran un objeto.

3
alepeino 11 ene. 2017 a las 12:26

Cuando haga solicitudes AJAX, recuerde siempre devolver respuestas JSON usando el método response()->json() en lugar de usar vistas como en su ejemplo de método BlogController test().

Además, implemente algo como LogViewer en su panel de administración (si tiene alguno) para ver el archivo de registro ( s) y lee los errores que ocurren. Configurar Bugsnag tampoco es una mala idea.

0
Ruffles 8 ene. 2017 a las 13:40

Su Javascript

Enviar solicitudes HTTP a las rutas reales en lugar de las rutas nombradas funcionó para mí.

$().ready(function(){
    $('.butt').on('click',function(){
            $.ajax({
               method: 'GET',
               dataType:'json',
               url:'/blog/test',
               success: function(data){
                  console.log(typeof(data)) // see Object {}
               }
            });
    })
});

BlogController

Se debe generar una respuesta JSON para las solicitudes AJAX.

public function test(){
   return response()
        ->json(['type' => 'Test', 'message' => 'It works!']);
}

Protección CSRF

Muchas opciones aquí. Mi favorito personal:

<meta name="csrf-token" content="{{ csrf_token() }}">
0
joshuamabina 9 ene. 2017 a las 23:03

En la aplicación, esto funciona muy bien. Cambia tu código así:

1.Ver parte

<p id="response"></p>
        <button class="butt">
            click me
        </button>
        <script>
            $(document).ready(function(){
                $('.butt').on('click',function(){
                    $.ajax({
                        dataType:'HTML',
                        type:'GET',
                        url:'{{route('blog.test')}}',
                        success:function(data){
                            $("#response").html(data);
                        }
                    });
                })
            });
        </script>

2.parte del controlador

    public function test()
    {
        return \View::make('test.test')->withMessage('changed');
        //or  return view()->withMessage('changed');
    }

Y para la función de abrir la consola, haga clic en la red después de eso, cuando haga clic en el botón, le mostrará un enlace rojo si hay un error

  1. Haga clic en ese enlace.
  2. En la lista de pestañas en la parte superior de la consola, encuentre la vista previa (y se le mostrará el error del lado del servidor).

Buena suerte

0
joshuamabina 9 ene. 2017 a las 23:54