Eliminar ‘index.php’ de Laravel 4.1 en Apache 2 con mod_rewrite

Una vez que hayamos instalado Laravel, el acceso a los recursos precisa que las URLs queden como http://localhost/index.php/resource/. Sería más bonito poder quitar ese ‘index.php’, ¿verdad? Laravel incluye un archivo .htaccess en el directorio ‘public’ que sirve para reescribir las URLs internamente y que éstas sean como http://localhost/resource/.

Este archivo ‘.htacces’ contiene lo siguiente:

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

RewriteEngine On

# Redirect Trailing Slashes…
RewriteRule ^(.*)/$ /$1 [L,R=301]

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

Como podemos ver, este archivo habilita el RewriteEngine, pero para ello necesita el módulo mod_rewrite habilitado en Apache. Usaremos el siguiente comando para habilitarlo:

$ sudo a2enmod rewrite
Enabling module rewrite.
To activate the new configuration, you need to run:
service apache2 restart

Es posible que con esto no sea suficiente, ya que la configuración del VirtualHost default contiene una directiva AllowOverride None que impide que .htaccess funcione. Así que tendremos que editar el archivo de configuración del VirtualHost (/etc/apache2/sites-available/default) y cambiar ‘AllowOverride None’ por ‘AllowOverride All’.

Una vez tengamos habilitado el módulo mod_rewrite y configurada la directiva AllowOverride All, reiniciamos Apache:

$ sudo service apache2 restart
* Restarting web server apache2                                                                                                                                                 apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName
… waiting apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName
[ OK ]

Ya podremos navegar por nuestra aplicación web sin tener que usar ‘index.php’.

Anuncios

Instalación de Laravel-4-Generators

En el anterior artículo instalamos Laravel 4.1. Ahora le vamos a añadir el paquete Laravel-4-Generators. La instalación la explican perfectamente en su página, pero la voy a poner aquí por si alguien tiene problemas con el inglés.

Lo primero será editar el archivo composer.json que está en nuestro directorio. En mi caso este archivo se encuentra en:

/var/www/nagvel/composer.json

Buscamos la clave “require” y añadimos detrás otra clave llamada “require-dev”:

“require-dev”: {
“way/generators”: “2.*”
},

Y actualizamos:

/var/www/nagvel$ sudo composer update -dev

Loading composer repositories with package information
Updating dependencies (including require-dev)
– Installing way/generators (2.6)

Downloading: 100%

Writing lock file
Generating autoload files
Generating optimized class loader

Una vez se ha completado la instalación, necesitamos añadir el proveedor de servicio al archivo app/config/app.php. Editamos dicho archivo, buscamos la clave ‘provider’ y añadimos la siguiente línea al final de dicha clave:

‘Way\Generators\GeneratorsServiceProvider’

Si ahora ejecutamos “php artisan” veremos que ahora tendremos más opciones, todas ellas del tipo generate. Os muestro las diferencias:

generate
generate:controller          Generate a controller
generate:migration           Generate a new migration
generate:model               Generate a model
generate:pivot               Generate a pivot table
generate:publish-templates   Copy generator templates for user modification
generate:resource            Generate a new resource
generate:scaffold            Scaffold a new resource (with boilerplate)
generate:seed                Generate a database table seeder
generate:view                Generate a view

A partir de ahora, cuando queramos generar algún controlador, modelo, vista, migración, pivote, recurso… podremos usar el comando:

php artisan generate:xxxxxxx

Instalación de Laravel 4.1 en Debian 7 Wheezy

Hace poco me he iniciado en este framework de desarrollo web basado en PHP. Se llama Laravel y actualmente va por la versión 4.1.18. En este primer artículo voy a explicar cómo instalarlo en Debian 7 Wheezy, aunque debe funcionar igualmente en cualquier versión de Linux. Como requisito hay que tener instalado PHP versión 5.3.7 o superior y la librería MCrypt de PHP.

En primer lugar necesitamos descargarnos composer. Como en mi sistema no tengo instalado curl pero sí tengo php, voy a usar este último para descargar composer, y posteriormente lo moveré al directorio /usr/local/bin para ejecutarlo de forma más fácil.

root@wheezy:/var/www# php -r “readfile(‘https://getcomposer.org/installer');” | php
#!/usr/bin/env php
All settings correct for using Composer
Downloading…

Composer successfully installed to: /var/www/composer.phar
Use it: php composer.phar
root@wheezy:/var/www# mv composer.phar /usr/local/bin/composer

Si os fijáis he usado el usuario root, así que que tened en cuenta el uso de sudo si no sois root, y el archivo descargado se llama composer.phar y lo he renombrado a composer.

Una vez descargado y movido a /usr/local/bin lo ejecutamos para comprobar que funciona:

root@wheezy:/var/www# composer
______
/ ____/___  ____ ___  ____  ____  ________  _____
/ /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
/_/
Composer version 7343198817f365b1676ced0f353808f0e408ff9a 2014-02-07 09:59:35

Usage:
[options] command [arguments]

Options:
–help           -h Display this help message.
–quiet          -q Do not output any message.
–verbose        -v|vv|vvv Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
–version        -V Display this application version.
–ansi              Force ANSI output.
–no-ansi           Disable ANSI output.
–no-interaction -n Do not ask any interactive question.
–profile           Display timing and memory usage information
–working-dir    -d If specified, use the given directory as working directory.

Available commands:
about            Short information about Composer
archive          Create an archive of this composer package
config           Set config options
create-project   Create new project from a package into given directory.
depends          Shows which packages depend on the given package
diagnose         Diagnoses the system to identify common errors.
dump-autoload    Dumps the autoloader
dumpautoload     Dumps the autoloader
global           Allows running commands in the global composer dir ($COMPOSER_HOME).
help             Displays help for a command
init             Creates a basic composer.json file in current directory.
install          Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json.
licenses         Show information about licenses of dependencies
list             Lists commands
require          Adds required packages to your composer.json and installs them
run-script       Run the scripts defined in composer.json.
search           Search for packages
self-update      Updates composer.phar to the latest version.
selfupdate       Updates composer.phar to the latest version.
show             Show information about packages
status           Show a list of locally modified packages
update           Updates your dependencies to the latest version according to composer.json, and updates the composer.lock file.
validate         Validates a composer.json

Parece que sí y la versión descargada es:

Composer version 7343198817f365b1676ced0f353808f0e408ff9a 2014-02-07 09:59:35

El siguiente paso será descargar e instalar laravel. Yo voy a crearme un nuevo proyecto que voy a llamar nagvel, así que en el directorio /var/www ejecuto el siguiente comando:

root@wheezy:/var/www# composer create-project –prefer-dist laravel/laravel nagvel

Si queréis que vuestro proyecto tenga otro nombre, sólo tenéis que cambiar “nagvel” en el comando anterior.

Empezará a descargarse (tarda un poco) y descargará también todas las dependencias que tenga:

root@wheezy:/var/www# composer create-project –prefer-dist laravel/laravel nagvel
Installing laravel/laravel (v4.1.18)
– Installing laravel/laravel (v4.1.18)
Downloading: 100%

Created project in nagvel
Loading composer repositories with package information
Installing dependencies (including require-dev)
– Installing symfony/translation (v2.4.1)
Downloading: 100%

– Installing psr/log (1.0.0)
Downloading: 100%

– Installing symfony/routing (v2.4.1)
Downloading: 100%

– Installing symfony/process (v2.4.1)
Downloading: 100%

– Installing symfony/finder (v2.4.1)
Downloading: 100%

– Installing symfony/console (v2.4.1)
Downloading: 100%

– Installing symfony/filesystem (v2.4.1)
Downloading: 100%

– Installing symfony/debug (v2.4.1)
Downloading: 100%

– Installing symfony/http-foundation (v2.4.1)
Downloading: 100%

– Installing symfony/event-dispatcher (v2.4.1)
Downloading: 100%

– Installing symfony/http-kernel (v2.4.1)
Downloading: 100%

– Installing symfony/dom-crawler (v2.4.1)
Downloading: 100%

– Installing symfony/css-selector (v2.4.1)
Downloading: 100%

– Installing symfony/browser-kit (v2.4.1)
Downloading: 100%

– Installing swiftmailer/swiftmailer (v5.0.3)
Downloading: 100%

– Installing stack/builder (v1.0.1)
Downloading: 100%

– Installing predis/predis (v0.8.5)
Downloading: 100%

– Installing phpseclib/phpseclib (0.3.5)
Downloading: 100%

– Installing patchwork/utf8 (v1.1.18)
Downloading: 100%

– Installing nesbot/carbon (1.8.0)
Downloading: 100%

– Installing monolog/monolog (1.7.0)
Downloading: 100%

– Installing nikic/php-parser (v0.9.4)
Downloading: 100%

– Installing jeremeamia/superclosure (1.0.1)
Downloading: 100%

– Installing filp/whoops (1.0.10)
Downloading: 100%

– Installing ircmaxell/password-compat (1.0.3)
Downloading: 100%

– Installing d11wtq/boris (v1.0.8)
Downloading: 100%

– Installing classpreloader/classpreloader (1.0.1)
Downloading: 100%

– Installing laravel/framework (v4.1.21)
Downloading: 100%

symfony/translation suggests installing symfony/config ()
symfony/translation suggests installing symfony/yaml ()
symfony/routing suggests installing symfony/config (For using the all-in-one router or any loader)
symfony/routing suggests installing symfony/yaml (For using the YAML loader)
symfony/routing suggests installing symfony/expression-language (For using expression matching)
symfony/routing suggests installing doctrine/annotations (For using the annotation loader)
symfony/event-dispatcher suggests installing symfony/dependency-injection ()
symfony/http-kernel suggests installing symfony/class-loader ()
symfony/http-kernel suggests installing symfony/config ()
symfony/http-kernel suggests installing symfony/dependency-injection ()
predis/predis suggests installing ext-phpiredis (Allows faster serialization and deserialization of the Redis protocol)
predis/predis suggests installing ext-curl (Allows access to Webdis when paired with phpiredis)
phpseclib/phpseclib suggests installing ext-gmp (Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.)
phpseclib/phpseclib suggests installing pear-pear/PHP_Compat (Install PHP_Compat to get phpseclib working on PHP >= 4.3.3.)
patchwork/utf8 suggests installing ext-intl (Use Intl for best performance)
monolog/monolog suggests installing mlehner/gelf-php (Allow sending log messages to a GrayLog2 server)
monolog/monolog suggests installing raven/raven (Allow sending log messages to a Sentry server)
monolog/monolog suggests installing doctrine/couchdb (Allow sending log messages to a CouchDB server)
monolog/monolog suggests installing ruflin/elastica (Allow sending log messages to an Elastic Search server)
monolog/monolog suggests installing ext-amqp (Allow sending log messages to an AMQP server (1.0+ required))
monolog/monolog suggests installing ext-mongo (Allow sending log messages to a MongoDB server)
monolog/monolog suggests installing aws/aws-sdk-php (Allow sending log messages to AWS services like DynamoDB)
d11wtq/boris suggests installing ext-readline (*)
laravel/framework suggests installing doctrine/dbal (Allow renaming columns and dropping SQLite columns.)
Writing lock file
Generating autoload files
Generating optimized class loader
Application key [USCuULF66wR8NykEDq6EWr7ZbVmAS5YW] set successfully.

Ya con esto tenemos instalado Laravel 4.1.18 en nuestro equipo.

Para probar nuestra web entraremos en http://localhost/nagvel/public/.

Muy probablemente nos mostrará una página en blanco. Esto se debe a que el usuario del servidor web (www-data) no tiene permisos de escritura sobre el directorio /var/www/nagvel/app/storage. Así que cambio el propietario de dicho directorio:

root@wheezy:/var/www# chown -R www-data nagvel/app/storage/

Y ahora sí deberíamos ver la siguiente página de bienvenida:

Imagen

El siguiente paso es opcional, pero recomendable, ya que lo voy a usar en mis siguientes artículos sobre Laravel. Se trata de instalar Laravel-4-Generators, un paquete de Laravel 4, que proporciona una variedad de generadores para acelerar el proceso de desarrollo de nuestra aplicación. Estos generadores incluyen:

  • generate:model
  • generate:controller
  • generate:seed
  • generate:view
  • generate:migration
  • generate:resource
  • generate:scaffold
  • generate:form
  • generate:test
  • generate:pivot