Laravel 4 putting controller in subfolder - not finding class - class

I have one controller in a subfolder which works perfect:
route:
Route::resource('json/stock/equipmentImages', 'Stock_EquipmentImageController');
getting its class from controller/stock/EquipmentImageController.php
which has a class definition:
class Stock_EquipmentImageController extends \BaseController {
The strangest thing happens if I do the same with:
Route::resource('json/stock/equipmentLocations', 'Stock_EquipmentLocationController')
Then I get the message, class not found.
If I move the class from controller/stock/EquipmentLocationController.php to
controller/EquipmentLocationController.php and adjust the route to:
Route::resource('json/stock/equipmentLocations', 'EquipmentLocationController');
Everything works. This happens on a shared server without command line access. On my localhost all controllers can be put into a subfolder.

I wasn't using namespace which worked fine on my local host but gave issues on my public server. Namespacing everything DID solve the issues as suggested by egig. Thanks.
Here's what I did, in case others have similar issues:
I went through this nice tutorial: https://www.youtube.com/watch?v=yAzd7Ig1Wgg
to get familiar with namespacing, as this is relative new for me in for Laravel 4.
router setup (resource router):
Route::resource('json/stock/equipment', 'App\Controllers\Stock\EquipmentController');
Added the psr 0 setting to autoload: (instead of using classmap) like the video suggests.
,
"psr-0": {
"Stock": "app/controllers/"
} ....
Did not add anything to the basecontroller (no namespacing description):
class BaseController extends Controller {
public function __construct(){ ....
Added namespacing and dependencies to my controller in subfolder (controllers\stock):
namespace App\Controllers\Stock;
use BaseController, Form, Input, Redirect, View, Equipment, Response;
class EquipmentController extends BaseController { ....
Then placed my models in a subfolder (models\stock), without namespacing discription.
class Equipment extends \Eloquent {
protected $fillable = [
'description',
'location',
....
Then I did 'php artisan dump-autoload' and uploaded everything to my public server, changed database and public folder settings accordingly, because they are different. And everything worked!
Feedback is welcome, thanks for the support!

Related

SpringApplicationContextLoader ignores Application class

The SpringApplicationContextLoader assumes that the application is either using 100% XML or 100% Java config. This is because #ContextConfiguration allows either a list of classes or locations/value, not both. If any is specified, SpringApplicationContextLoader ignores the Application class that creates and starts the SpringApplication.
Trying to make Boot work with a 100% Groovy/no-XML pet project, I ran across the above issue. My Application class has #EnableAutoConfiguration and #ComponentScan annotations on it, the former required by Boot to set up a Web server. The later I had to keep because of SPR-11627. On the other hand, if I omitted the locations/value on #ContextConfiguration, dependencies weren't set up (duh!).
I give the code below along with a patch that I locally made to SpringApplicationContextLoader. If there's a better way, please let me know.
MovieDatabaseRESTClientIntegrationTest.groovy
RunWith(SpringJUnit4ClassRunner)
#ContextConfiguration(value = ['classpath:client-config.groovy', 'classpath:integ-test-config.groovy'],
loader = PatchedSpringApplicationContextLoader)
#SpringApplicationConfiguration(classes = MovieDatabaseApplication)
#WebAppConfiguration
#IntegrationTest
class MovieDatabaseRESTClientIntegrationTest {
MovieDatabaseApplication.groovy
#EnableAutoConfiguration
#ComponentScan
class MovieDatabaseApplication {
SpringApplicationContextLoader.java fix
private Set<Object> getSources(MergedContextConfiguration mergedConfig) {
Set<Object> sources = new LinkedHashSet<Object>();
sources.addAll(Arrays.asList(mergedConfig.getClasses()));
sources.addAll(Arrays.asList(mergedConfig.getLocations()));
/* The Spring application class may have annotations on it too. If such a class is declared on the test class,
* add it as a source too. */
SpringApplicationConfiguration springAppConfig = AnnotationUtils.findAnnotation(mergedConfig.getTestClass(),
SpringApplicationConfiguration.class);
if (springAppConfig != null) {
sources.addAll(Arrays.asList(springAppConfig.classes()));
}
if (sources.isEmpty()) {
throw new IllegalStateException(
"No configuration classes or locations found in #SpringApplicationConfiguration. "
+ "For default configuration detection to work you need Spring 4.0.3 or better (found "
+ SpringVersion.getVersion() + ").");
}
return sources;
}
Also posted on Spring forum.
I could be wrong but I don't think there is any support for beans{} configuration in #ContextConfiguration and #SpringContextConfiguration is just an extension of that. A feature request in JIRA would be appropriate. Also there has never been any support for mixed configuration format (as the entry point at least) - you always have to choose either XML or #Configuration, or else supply your own ContextLoader. You also shouldn't have both #ContextConfiguration and #SpringContextConfiguration on the same class (the behaviour is undefined).

Smarty seems to ignore addTemplateDir

I'm working in a Zend Framework based application (Shopware).
I add a template dir in my controller like this:
class Shopware_Controllers_Backend_Pricify extends Shopware_Controllers_Backend_ExtJs
{
public function init()
{
$this->View()->addTemplateDir(dirname(__FILE__) . "/../../Views/backend/");
parent::init();
}
}
But somehow, smarty always looks in the (not existing) part of the controller action:
Unable to load template snippet 'backend/mycontroller/model/main.js' in 'snippet:string:{include file="backend/pricify/model/main.js"} in Smarty/sysplugins/smarty_internal_templatebase.php on line 128
The Controller works over loading via ext js, but I do not see that this is a problem. When I var_dump template directories, the correct dir is included. I debugged the code far into smarty, but never found the part, where the directories are checked.
I'm aware, that this may be a problem within the software stack, but since I do not know where to search, I ask here. If I need to post additional data, please tell me.
I found, that the problem was that shopware extends CamelCase to camel_case folders.

Setting-up Application.ini in Zend Framework for Model

I'm new to Zend Framework. I've been following book "ZendFramework - A Beginners Guide". in the 4th chapter, they start using Doctrine. The thing is that I'd like to use Zend's built-in functionality with database interactions.
I've searched the web and watched couple of tuts. Well I couldn't find the right (for me) solution.
in all tuts, everyone is using standard Zend's structure. I'd like to integrate my Modules. So I have a file structure like this:
application
/modules
/moduleName
/controllers
/models
/views
I have set up the routes in application.ini for controllers and views like this:
; /articles/* route
resources.router.routes.articles.route = /articles
resources.router.routes.articles.defaults.module = content
resources.router.routes.articles.defaults.controller = articles
resources.router.routes.articles.defaults.action = index
Now I tried to load-up my models so I start interacting with the tables in Mysql.
in my controller named ArticlesController.php I created the class Content_ArticlesController and in there I have:
public function indexAction()
{
$model = new Content_ArticlesModel();
$this->view->modelHi = $model->there;
$this->view->hello = 'Hello there';
}
As you might guess Content_ArticlesModel is my class that extends Zend_Db_Table_Abstract class. in there I have a public function modelHi() that I'd like to call from my Controller to pass the data from the model to the view.
Can someone help me do this in the right way? how should I correctly load-up my models for my modules? and maybe you could link some good article on working with database based on some example.
EDIT: Ok, I had this really studip error in my Controller but it's ok. Anyways the problem is that when Zend loads-up my controller it displays: Fatal error: Class 'Content_ArticlesModel' not found in S:\xampp\htdocs\testsite\application\modules\content\controllers\ArticlesController.php on line 12
The issue is my Zend can't locate/doesn't know where to find the models of my module that I'm trying to reach from my controller.
I want to know how should I make Zend see and use my models?
You should make configuration in application.ini file for modeule and view
resources.modules =
resources.view[] =
Also you should make bootstrap file inside your module
class Content_Bootstrap extends Zend_Application_Module_Bootstrap {
}
Also you should ensure that the name of your modulel folder is small letter "content"..
After making these configuration, you will be able to call model inside controller...
Why not just call your public modelHi() method in your controller
Update:
If your module name is 'content' , then your model should be located
application/modules/content/models/ArticlesModel.php
then do the following
public function indexAction()
{
$model = new Content_Model_ArticlesModel(); //name of class
$this->view->modelHi = $model->modelHi();
$this->view->hello = 'Hello there';
}

Can't override the standard skeleton views in Symfony2 GeneratorBundle

I don't manage to override the skeleton views of the generatorBundle.
I've first tried by adding my view in /app/Resources/SensioGeneratorBundle/skeleton/crud/views/index.html.twig
It didn't worked so I tried to create a new Bundle extending SensioGeneratorBundle and copy the my view in its Resources folder.
I already manage to use themes for twig forms, but I need to personalize the views generated by the doctrine:generate:crud command.
First of all: The corresponding skeleton views are located here:
vendor/bundles/Sensio/Bundle/GeneratorBundle/Resources/skeleton/crud
Quick and dirty you should be fine by overriding these view files - but thats not what we want ;)
In:
vendor/bundles/Sensio/Bundle/GeneratorBundle/Command/GenerateDoctrineCrudCommand.php
there is an accessor for the Generator:
protected function getGenerator()
{
if (null === $this->generator) {
$this->generator = new DoctrineCrudGenerator($this->getContainer()->get('filesystem'), __DIR__.'/../Resources/skeleton/crud');
}
return $this->generator;
}
One can try to override this method in your extending Bundle and set a different $skeletonDir in the constructor.
Edit:
Quick example in my test environment how it can be achieved (I only made a quick test ;):
Generate a new bundle for the custom generator: php app/console generate:bundle and follow the instructions. A route is not needed. I chose for this example: Acme/CrudGeneratorBundle (Or use an existing bundle)
Create a folder called "Command" in the newly created bundle directory.
Place a command class in this folder.
<?php
//src/Acme/CrudGeneratorBundle/Command/MyDoctrineCrudCommand.php
namespace Acme\CrudGeneratorBundle\Command;
use Sensio\Bundle\GeneratorBundle\Generator\DoctrineCrudGenerator;
class MyDoctrineCrudCommand extends \Sensio\Bundle\GeneratorBundle\Command\GenerateDoctrineCrudCommand
{
protected function configure()
{
parent::configure();
$this->setName('mydoctrine:generate:crud');
}
protected function getGenerator()
{
$generator = new DoctrineCrudGenerator($this->getContainer()->get('filesystem'), __DIR__.'/../Resources/skeleton/crud');
$this->setGenerator($generator);
return parent::getGenerator();
}
}
Copy the vendor/bundles/Sensio/Bundle/GeneratorBundle/Resources/skeleton/crud to your Resources (in my example "src/Acme/CrudGeneratorBundle/Resources/crud")
This was the best solution for me:
symfony2-how-to-override-core-template
doesn't add a command but modifies the skeleton for that particular bundle.

preDispatch() is not called in Controller Plugin

class My_Plugin extends Zend_Controller_Plugin_Abstract
{
public function init()
{
print 'this is working just fine';
}
public function preDispatch( Zend_Controller_Request_Abstract $request )
{
Zend_Debug::dump($request);
print 'why is it not working';
exit;
die(':('); // not dieing either
}
}
The plugin is registered in /configs/application.ini file. ZF does see it, because init() function works perfectly fine. But nothing I put into preDispatch seems to work.
P.S. the only purpose of this plugin is to determine what language is used from the parameter in URL, and set Zend_Locale to it. So that I won't need to do it in any controller or view ever again, instead relying on Zend_Locale, Zend_Translate, etc. But I can't do that in plugin's init() and preDispatch() doesnt work at all :/ The lack of proper documentation for ZF starting to drive me crazy
The problem was I needed to add one line to application.ini:
resources.frontController.plugins.myplugin = Plugins_My_Plugin
Everything works now.